lkml.org 
[lkml]   [2023]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] brcmfmac: acpi: Add support for fetching Apple ACPI properties
    Date
    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 | 51 +++++++++++++++++++
    .../broadcom/brcm80211/brcmfmac/common.c | 1 +
    .../broadcom/brcm80211/brcmfmac/common.h | 9 ++++
    4 files changed, 63 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 0e996cf24f88..dc6d27a36faa 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
    @@ -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
    index 000000000000..c4a54861bfb4
    --- /dev/null
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
    @@ -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");
    + }
    +}
    diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
    index 4a309e5a5707..b977e50137bb 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
    @@ -484,6 +484,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 aa25abffcc7d..7167fd4f8c63 100644
    --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
    +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
    @@ -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);
    --
    2.35.1
    \
     
     \ /
      Last update: 2023-03-27 00:21    [W:3.976 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site