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