1 | // SPDX-License-Identifier: ISC |
2 | /* |
3 | * Copyright The Asahi Linux Contributors |
4 | */ |
5 | |
6 | #include <linux/acpi.h> |
7 | #include "debug.h" |
8 | #include "core.h" |
9 | #include "common.h" |
10 | |
11 | void brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type, |
12 | struct brcmf_mp_device *settings) |
13 | { |
14 | acpi_status status; |
15 | const union acpi_object *o; |
16 | struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; |
17 | struct acpi_device *adev = ACPI_COMPANION(dev); |
18 | |
19 | if (!adev) |
20 | return; |
21 | |
22 | if (!ACPI_FAILURE(acpi_dev_get_property(adev, "module-instance" , |
23 | ACPI_TYPE_STRING, &o))) { |
24 | brcmf_dbg(INFO, "ACPI module-instance=%s\n" , o->string.pointer); |
25 | settings->board_type = devm_kasprintf(dev, GFP_KERNEL, |
26 | fmt: "apple,%s" , |
27 | o->string.pointer); |
28 | } else { |
29 | brcmf_dbg(INFO, "No ACPI module-instance\n" ); |
30 | return; |
31 | } |
32 | |
33 | status = acpi_evaluate_object(object: adev->handle, pathname: "RWCV" , NULL, return_object_buffer: &buf); |
34 | o = buf.pointer; |
35 | if (!ACPI_FAILURE(status) && o && o->type == ACPI_TYPE_BUFFER && |
36 | o->buffer.length >= 2) { |
37 | char *antenna_sku = devm_kzalloc(dev, size: 3, GFP_KERNEL); |
38 | |
39 | if (antenna_sku) { |
40 | memcpy(antenna_sku, o->buffer.pointer, 2); |
41 | brcmf_dbg(INFO, "ACPI RWCV data=%*phN antenna-sku=%s\n" , |
42 | (int)o->buffer.length, o->buffer.pointer, |
43 | antenna_sku); |
44 | settings->antenna_sku = antenna_sku; |
45 | } |
46 | |
47 | kfree(objp: buf.pointer); |
48 | } else { |
49 | brcmf_dbg(INFO, "No ACPI antenna-sku\n" ); |
50 | } |
51 | } |
52 | |