162306a36Sopenharmony_ci// SPDX-License-Identifier: ISC 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright The Asahi Linux Contributors 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/acpi.h> 762306a36Sopenharmony_ci#include "debug.h" 862306a36Sopenharmony_ci#include "core.h" 962306a36Sopenharmony_ci#include "common.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_civoid brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type, 1262306a36Sopenharmony_ci struct brcmf_mp_device *settings) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci acpi_status status; 1562306a36Sopenharmony_ci const union acpi_object *o; 1662306a36Sopenharmony_ci struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; 1762306a36Sopenharmony_ci struct acpi_device *adev = ACPI_COMPANION(dev); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci if (!adev) 2062306a36Sopenharmony_ci return; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci if (!ACPI_FAILURE(acpi_dev_get_property(adev, "module-instance", 2362306a36Sopenharmony_ci ACPI_TYPE_STRING, &o))) { 2462306a36Sopenharmony_ci brcmf_dbg(INFO, "ACPI module-instance=%s\n", o->string.pointer); 2562306a36Sopenharmony_ci settings->board_type = devm_kasprintf(dev, GFP_KERNEL, 2662306a36Sopenharmony_ci "apple,%s", 2762306a36Sopenharmony_ci o->string.pointer); 2862306a36Sopenharmony_ci } else { 2962306a36Sopenharmony_ci brcmf_dbg(INFO, "No ACPI module-instance\n"); 3062306a36Sopenharmony_ci return; 3162306a36Sopenharmony_ci } 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci status = acpi_evaluate_object(adev->handle, "RWCV", NULL, &buf); 3462306a36Sopenharmony_ci o = buf.pointer; 3562306a36Sopenharmony_ci if (!ACPI_FAILURE(status) && o && o->type == ACPI_TYPE_BUFFER && 3662306a36Sopenharmony_ci o->buffer.length >= 2) { 3762306a36Sopenharmony_ci char *antenna_sku = devm_kzalloc(dev, 3, GFP_KERNEL); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci if (antenna_sku) { 4062306a36Sopenharmony_ci memcpy(antenna_sku, o->buffer.pointer, 2); 4162306a36Sopenharmony_ci brcmf_dbg(INFO, "ACPI RWCV data=%*phN antenna-sku=%s\n", 4262306a36Sopenharmony_ci (int)o->buffer.length, o->buffer.pointer, 4362306a36Sopenharmony_ci antenna_sku); 4462306a36Sopenharmony_ci settings->antenna_sku = antenna_sku; 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci kfree(buf.pointer); 4862306a36Sopenharmony_ci } else { 4962306a36Sopenharmony_ci brcmf_dbg(INFO, "No ACPI antenna-sku\n"); 5062306a36Sopenharmony_ci } 5162306a36Sopenharmony_ci} 52