// SPDX-License-Identifier: ISC /* * Copyright The Asahi Linux Contributors */ #include #include "debug.h" #include "core.h" #include "common.h" void brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type, struct brcmf_mp_device *settings) { acpi_status status; const union acpi_object *o; struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_device *adev = ACPI_COMPANION(dev); if (!adev) return; if (!ACPI_FAILURE(acpi_dev_get_property(adev, "module-instance", ACPI_TYPE_STRING, &o))) { brcmf_dbg(INFO, "ACPI module-instance=%s\n", o->string.pointer); settings->board_type = devm_kasprintf(dev, GFP_KERNEL, "apple,%s", o->string.pointer); } else { brcmf_dbg(INFO, "No ACPI module-instance\n"); return; } status = acpi_evaluate_object(adev->handle, "RWCV", NULL, &buf); o = buf.pointer; if (!ACPI_FAILURE(status) && o && o->type == ACPI_TYPE_BUFFER && o->buffer.length >= 2) { char *antenna_sku = devm_kzalloc(dev, 3, GFP_KERNEL); if (antenna_sku) { memcpy(antenna_sku, o->buffer.pointer, 2); brcmf_dbg(INFO, "ACPI RWCV data=%*phN antenna-sku=%s\n", (int)o->buffer.length, o->buffer.pointer, antenna_sku); settings->antenna_sku = antenna_sku; } kfree(buf.pointer); } else { brcmf_dbg(INFO, "No ACPI antenna-sku\n"); } }