wifi: brcmfmac: acpi: Add support for fetching Apple ACPI properties
authorHector Martin <marcan@marcan.st>
Tue, 14 Feb 2023 08:00:33 +0000 (17:00 +0900)
committerKalle Valo <kvalo@kernel.org>
Mon, 27 Feb 2023 10:41:05 +0000 (12:41 +0200)
On DT platforms, the module-instance and antenna-sku-info properties
are passed in the DT. On ACPI platforms, module-instance is passed via
the analogous Apple device property mechanism, while the antenna SKU
info is instead obtained via an ACPI method that grabs it from
non-volatile storage.

Add support for this, to allow proper firmware selection on Apple
platforms.

Signed-off-by: Hector Martin <marcan@marcan.st>
Reviewed-by: Julian Calaby <julian.calaby@gmail.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230214080034.3828-2-marcan@marcan.st
drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c [new file with mode: 0644]
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h

index 0e996cf24f882915c2652ddec28cc332c2ceda35..dc6d27a36faa970e1ddc495eef8e41a674a46da5 100644 (file)
@@ -48,6 +48,8 @@ brcmfmac-$(CONFIG_OF) += \
                of.o
 brcmfmac-$(CONFIG_DMI) += \
                dmi.o
+brcmfmac-$(CONFIG_ACPI) += \
+               acpi.o
 
 ifeq ($(CONFIG_BRCMFMAC),m)
 obj-m += wcc/
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
new file mode 100644 (file)
index 0000000..c4a5486
--- /dev/null
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: ISC
+/*
+ * Copyright The Asahi Linux Contributors
+ */
+
+#include <linux/acpi.h>
+#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");
+       }
+}
index f235beaddddba20132f26963a5a287e7bc6cd6d2..4fea6f0ea8c88820178179c758cc9c8454bee429 100644 (file)
@@ -487,6 +487,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
                /* No platform data for this device, try OF and DMI data */
                brcmf_dmi_probe(settings, chip, chiprev);
                brcmf_of_probe(dev, bus_type, settings);
+               brcmf_acpi_probe(dev, bus_type, settings);
        }
        return settings;
 }
index aa25abffcc7dbc4556b084770af9e07769187678..7167fd4f8c639b83e3d8d574498e790ebe054e5e 100644 (file)
@@ -77,6 +77,15 @@ static inline void
 brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev) {}
 #endif
 
+#ifdef CONFIG_ACPI
+void brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type,
+                     struct brcmf_mp_device *settings);
+#else
+static inline void brcmf_acpi_probe(struct device *dev,
+                                   enum brcmf_bus_type bus_type,
+                                   struct brcmf_mp_device *settings) {}
+#endif
+
 u8 brcmf_map_prio_to_prec(void *cfg, u8 prio);
 
 u8 brcmf_map_prio_to_aci(void *cfg, u8 prio);