mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-16 22:56:59 +08:00
128 lines
4.5 KiB
Diff
128 lines
4.5 KiB
Diff
From 30cf50137a081ece01ac609de4131e20b8cccc1c Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Thu, 23 Dec 2021 19:51:36 +0900
|
|
Subject: [PATCH 097/171] brcmfmac: acpi: Add support for fetching Apple ACPI
|
|
properties
|
|
|
|
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>
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/Makefile | 2 +
|
|
.../broadcom/brcm80211/brcmfmac/acpi.c | 52 +++++++++++++++++++
|
|
.../broadcom/brcm80211/brcmfmac/common.c | 1 +
|
|
.../broadcom/brcm80211/brcmfmac/common.h | 9 ++++
|
|
4 files changed, 64 insertions(+)
|
|
create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
|
index 13c13504a6e8..19009eb9db93 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
|
@@ -47,3 +47,5 @@ brcmfmac-$(CONFIG_OF) += \
|
|
of.o
|
|
brcmfmac-$(CONFIG_DMI) += \
|
|
dmi.o
|
|
+brcmfmac-$(CONFIG_ACPI) += \
|
|
+ acpi.o
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
|
|
new file mode 100644
|
|
index 000000000000..dec6a83d13b1
|
|
--- /dev/null
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
|
|
@@ -0,0 +1,52 @@
|
|
+// 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");
|
|
+ }
|
|
+
|
|
+ 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) {
|
|
+ brcmf_err("Failed to allocate antenna-sku");
|
|
+ } else {
|
|
+ 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");
|
|
+ }
|
|
+}
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
index 95d4c133efdd..ea2475bfc2d7 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
@@ -448,6 +448,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;
|
|
}
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
index 1f678bbd87aa..960b1042a7c2 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
@@ -74,6 +74,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);
|
|
--
|
|
2.34.1
|
|
|