123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734 |
- From: Hante Meuleman <meuleman@broadcom.com>
- Date: Wed, 17 Feb 2016 11:27:07 +0100
- Subject: [PATCH] brcmfmac: switch to new platform data
- Platform data is only available for sdio. With this patch a new
- platform data structure is being used which allows for platform
- data for any device and configurable per device. This patch only
- switches to the new structure and adds support for SDIO devices.
- Reviewed-by: Arend Van Spriel <arend@broadcom.com>
- Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
- Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
- Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
- Signed-off-by: Arend van Spriel <arend@broadcom.com>
- Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
- ---
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
- @@ -103,7 +103,7 @@ static void brcmf_sdiod_dummy_irqhandler
-
- int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev)
- {
- - struct brcmfmac_sdio_platform_data *pdata;
- + struct brcmfmac_sdio_pd *pdata;
- int ret = 0;
- u8 data;
- u32 addr, gpiocontrol;
- @@ -173,7 +173,7 @@ int brcmf_sdiod_intr_register(struct brc
-
- int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev)
- {
- - struct brcmfmac_sdio_platform_data *pdata;
- + struct brcmfmac_sdio_pd *pdata;
-
- brcmf_dbg(SDIO, "Entering\n");
-
- @@ -1164,17 +1164,6 @@ static int brcmf_ops_sdio_probe(struct s
- dev_set_drvdata(&func->dev, bus_if);
- dev_set_drvdata(&sdiodev->func[1]->dev, bus_if);
- sdiodev->dev = &sdiodev->func[1]->dev;
- - sdiodev->pdata = brcmf_get_module_param(sdiodev->dev);
- -
- -#ifdef CONFIG_PM_SLEEP
- - /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ
- - * is true or when platform data OOB irq is true).
- - */
- - if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) &&
- - ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) ||
- - (sdiodev->pdata && sdiodev->pdata->oob_irq_supported)))
- - bus_if->wowl_supported = true;
- -#endif
-
- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
-
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
- @@ -6459,8 +6459,8 @@ int brcmf_cfg80211_wait_vif_event(struct
- static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- struct brcmf_fil_country_le *ccreq)
- {
- - struct cc_translate *country_codes;
- - struct cc_entry *cc;
- + struct brcmfmac_pd_cc *country_codes;
- + struct brcmfmac_pd_cc_entry *cc;
- s32 found_index;
- int i;
-
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
- @@ -80,7 +80,7 @@ module_param_named(ignore_probe_fail, br
- MODULE_PARM_DESC(ignore_probe_fail, "always succeed probe for debugging");
- #endif
-
- -static struct brcmfmac_sdio_platform_data *brcmfmac_pdata;
- +static struct brcmfmac_platform_data *brcmfmac_pdata;
- struct brcmf_mp_global_t brcmf_mp_global;
-
- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- @@ -229,15 +229,46 @@ void __brcmf_dbg(u32 level, const char *
-
- static void brcmf_mp_attach(void)
- {
- + /* If module param firmware path is set then this will always be used,
- + * if not set then if available use the platform data version. To make
- + * sure it gets initialized at all, always copy the module param version
- + */
- strlcpy(brcmf_mp_global.firmware_path, brcmf_firmware_path,
- BRCMF_FW_ALTPATH_LEN);
- + if ((brcmfmac_pdata) && (brcmfmac_pdata->fw_alternative_path) &&
- + (brcmf_mp_global.firmware_path[0] == '\0')) {
- + strlcpy(brcmf_mp_global.firmware_path,
- + brcmfmac_pdata->fw_alternative_path,
- + BRCMF_FW_ALTPATH_LEN);
- + }
- }
-
- -struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev)
- -{
- - if (!brcmfmac_pdata)
- - brcmf_of_probe(dev, &brcmfmac_pdata);
- - return brcmfmac_pdata;
- +struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev,
- + enum brcmf_bus_type bus_type,
- + u32 chip, u32 chiprev)
- +{
- + struct brcmfmac_sdio_pd *pdata;
- + struct brcmfmac_pd_device *device_pd;
- + int i;
- +
- + if (brcmfmac_pdata) {
- + for (i = 0; i < brcmfmac_pdata->device_count; i++) {
- + device_pd = &brcmfmac_pdata->devices[i];
- + if ((device_pd->bus_type == bus_type) &&
- + (device_pd->id == chip) &&
- + ((device_pd->rev == chiprev) ||
- + (device_pd->rev == -1))) {
- + brcmf_dbg(INFO, "Platform data for device found\n");
- + if (device_pd->bus_type == BRCMF_BUSTYPE_SDIO)
- + return &device_pd->bus.sdio;
- + break;
- + }
- + }
- + }
- + pdata = NULL;
- + brcmf_of_probe(dev, &pdata);
- +
- + return pdata;
- }
-
- int brcmf_mp_device_attach(struct brcmf_pub *drvr)
- @@ -287,7 +318,7 @@ static int brcmf_common_pd_remove(struct
- static struct platform_driver brcmf_pd = {
- .remove = brcmf_common_pd_remove,
- .driver = {
- - .name = BRCMFMAC_SDIO_PDATA_NAME,
- + .name = BRCMFMAC_PDATA_NAME,
- }
- };
-
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
- @@ -16,7 +16,7 @@
- #define BRCMFMAC_COMMON_H
-
- #include <linux/platform_device.h>
- -#include <linux/platform_data/brcmfmac-sdio.h>
- +#include <linux/platform_data/brcmfmac.h>
- #include "fwil_types.h"
-
- extern const u8 ALLFFMAC[ETH_ALEN];
- @@ -43,33 +43,6 @@ struct brcmf_mp_global_t {
- extern struct brcmf_mp_global_t brcmf_mp_global;
-
- /**
- - * struct cc_entry - Struct for translating user space country code (iso3166) to
- - * firmware country code and revision.
- - *
- - * @iso3166: iso3166 alpha 2 country code string.
- - * @cc: firmware country code string.
- - * @rev: firmware country code revision.
- - */
- -struct cc_entry {
- - char iso3166[BRCMF_COUNTRY_BUF_SZ];
- - char cc[BRCMF_COUNTRY_BUF_SZ];
- - s32 rev;
- -};
- -
- -/**
- - * struct cc_translate - Struct for translating country codes as set by user
- - * space to a country code and rev which can be used by
- - * firmware.
- - *
- - * @table_size: number of entries in table (> 0)
- - * @table: dynamic array of 1 or more elements with translation information.
- - */
- -struct cc_translate {
- - int table_size;
- - struct cc_entry table[0];
- -};
- -
- -/**
- * struct brcmf_mp_device - Device module paramaters.
- *
- * @sdiod_txglomsz: SDIO txglom size.
- @@ -88,10 +61,12 @@ struct brcmf_mp_device {
- int fcmode;
- bool roamoff;
- bool ignore_probe_fail;
- - struct cc_translate *country_codes;
- + struct brcmfmac_pd_cc *country_codes;
- };
-
- -struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev);
- +struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev,
- + enum brcmf_bus_type bus_type,
- + u32 chip, u32 chiprev);
- int brcmf_mp_device_attach(struct brcmf_pub *drvr);
- void brcmf_mp_device_detach(struct brcmf_pub *drvr);
- #ifdef DEBUG
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
- @@ -23,8 +23,7 @@
- #include "common.h"
- #include "of.h"
-
- -void
- -brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio)
- +void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio)
- {
- struct device_node *np = dev->of_node;
- int irq;
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
- @@ -15,10 +15,9 @@
- */
- #ifdef CONFIG_OF
- void
- -brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio);
- +brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio);
- #else
- -static void brcmf_of_probe(struct device *dev,
- - struct brcmfmac_sdio_platform_data **sdio)
- +static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio)
- {
- }
- #endif /* CONFIG_OF */
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
- @@ -33,8 +33,6 @@
- #include <linux/bcma/bcma.h>
- #include <linux/debugfs.h>
- #include <linux/vmalloc.h>
- -#include <linux/platform_data/brcmfmac-sdio.h>
- -#include <linux/moduleparam.h>
- #include <asm/unaligned.h>
- #include <defs.h>
- #include <brcmu_wifi.h>
- @@ -44,6 +42,8 @@
- #include "sdio.h"
- #include "chip.h"
- #include "firmware.h"
- +#include "core.h"
- +#include "common.h"
-
- #define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500)
- #define CTL_DONE_TIMEOUT msecs_to_jiffies(2500)
- @@ -3775,26 +3775,28 @@ static const struct brcmf_buscore_ops br
- static bool
- brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
- {
- + struct brcmf_sdio_dev *sdiodev;
- u8 clkctl = 0;
- int err = 0;
- int reg_addr;
- u32 reg_val;
- u32 drivestrength;
-
- - sdio_claim_host(bus->sdiodev->func[1]);
- + sdiodev = bus->sdiodev;
- + sdio_claim_host(sdiodev->func[1]);
-
- pr_debug("F1 signature read @0x18000000=0x%4x\n",
- - brcmf_sdiod_regrl(bus->sdiodev, SI_ENUM_BASE, NULL));
- + brcmf_sdiod_regrl(sdiodev, SI_ENUM_BASE, NULL));
-
- /*
- * Force PLL off until brcmf_chip_attach()
- * programs PLL control regs
- */
-
- - brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
- + brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
- BRCMF_INIT_CLKCTL1, &err);
- if (!err)
- - clkctl = brcmf_sdiod_regrb(bus->sdiodev,
- + clkctl = brcmf_sdiod_regrb(sdiodev,
- SBSDIO_FUNC1_CHIPCLKCSR, &err);
-
- if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) {
- @@ -3803,50 +3805,77 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
- goto fail;
- }
-
- - bus->ci = brcmf_chip_attach(bus->sdiodev, &brcmf_sdio_buscore_ops);
- + bus->ci = brcmf_chip_attach(sdiodev, &brcmf_sdio_buscore_ops);
- if (IS_ERR(bus->ci)) {
- brcmf_err("brcmf_chip_attach failed!\n");
- bus->ci = NULL;
- goto fail;
- }
- + sdiodev->pdata = brcmf_get_module_param(sdiodev->dev,
- + BRCMF_BUSTYPE_SDIO,
- + bus->ci->chip,
- + bus->ci->chiprev);
- + /* platform specific configuration:
- + * alignments must be at least 4 bytes for ADMA
- + */
- + bus->head_align = ALIGNMENT;
- + bus->sgentry_align = ALIGNMENT;
- + if (sdiodev->pdata) {
- + if (sdiodev->pdata->sd_head_align > ALIGNMENT)
- + bus->head_align = sdiodev->pdata->sd_head_align;
- + if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT)
- + bus->sgentry_align = sdiodev->pdata->sd_sgentry_align;
- + }
- + /* allocate scatter-gather table. sg support
- + * will be disabled upon allocation failure.
- + */
- + brcmf_sdiod_sgtable_alloc(sdiodev);
- +
- +#ifdef CONFIG_PM_SLEEP
- + /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ
- + * is true or when platform data OOB irq is true).
- + */
- + if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) &&
- + ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) ||
- + (sdiodev->pdata && sdiodev->pdata->oob_irq_supported)))
- + sdiodev->bus_if->wowl_supported = true;
- +#endif
-
- if (brcmf_sdio_kso_init(bus)) {
- brcmf_err("error enabling KSO\n");
- goto fail;
- }
-
- - if ((bus->sdiodev->pdata) && (bus->sdiodev->pdata->drive_strength))
- - drivestrength = bus->sdiodev->pdata->drive_strength;
- + if ((sdiodev->pdata) && (sdiodev->pdata->drive_strength))
- + drivestrength = sdiodev->pdata->drive_strength;
- else
- drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH;
- - brcmf_sdio_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength);
- + brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength);
-
- /* Set card control so an SDIO card reset does a WLAN backplane reset */
- - reg_val = brcmf_sdiod_regrb(bus->sdiodev,
- - SDIO_CCCR_BRCM_CARDCTRL, &err);
- + reg_val = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, &err);
- if (err)
- goto fail;
-
- reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET;
-
- - brcmf_sdiod_regwb(bus->sdiodev,
- - SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err);
- + brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err);
- if (err)
- goto fail;
-
- /* set PMUControl so a backplane reset does PMU state reload */
- reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol);
- - reg_val = brcmf_sdiod_regrl(bus->sdiodev, reg_addr, &err);
- + reg_val = brcmf_sdiod_regrl(sdiodev, reg_addr, &err);
- if (err)
- goto fail;
-
- reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT);
-
- - brcmf_sdiod_regwl(bus->sdiodev, reg_addr, reg_val, &err);
- + brcmf_sdiod_regwl(sdiodev, reg_addr, reg_val, &err);
- if (err)
- goto fail;
-
- - sdio_release_host(bus->sdiodev->func[1]);
- + sdio_release_host(sdiodev->func[1]);
-
- brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);
-
- @@ -3867,7 +3896,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
- return true;
-
- fail:
- - sdio_release_host(bus->sdiodev->func[1]);
- + sdio_release_host(sdiodev->func[1]);
- return false;
- }
-
- @@ -4045,18 +4074,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
- bus->txminmax = BRCMF_TXMINMAX;
- bus->tx_seq = SDPCM_SEQ_WRAP - 1;
-
- - /* platform specific configuration:
- - * alignments must be at least 4 bytes for ADMA
- - */
- - bus->head_align = ALIGNMENT;
- - bus->sgentry_align = ALIGNMENT;
- - if (sdiodev->pdata) {
- - if (sdiodev->pdata->sd_head_align > ALIGNMENT)
- - bus->head_align = sdiodev->pdata->sd_head_align;
- - if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT)
- - bus->sgentry_align = sdiodev->pdata->sd_sgentry_align;
- - }
- -
- /* single-threaded workqueue */
- wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
- dev_name(&sdiodev->func[1]->dev));
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
- @@ -184,7 +184,7 @@ struct brcmf_sdio_dev {
- struct brcmf_sdio *bus;
- struct device *dev;
- struct brcmf_bus *bus_if;
- - struct brcmfmac_sdio_platform_data *pdata;
- + struct brcmfmac_sdio_pd *pdata;
- bool oob_irq_requested;
- bool irq_en; /* irq enable flags */
- spinlock_t irq_en_lock;
- --- a/include/linux/platform_data/brcmfmac-sdio.h
- +++ /dev/null
- @@ -1,135 +0,0 @@
- -/*
- - * Copyright (c) 2013 Broadcom Corporation
- - *
- - * Permission to use, copy, modify, and/or distribute this software for any
- - * purpose with or without fee is hereby granted, provided that the above
- - * copyright notice and this permission notice appear in all copies.
- - *
- - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- - */
- -
- -#ifndef _LINUX_BRCMFMAC_PLATFORM_H
- -#define _LINUX_BRCMFMAC_PLATFORM_H
- -
- -/*
- - * Platform specific driver functions and data. Through the platform specific
- - * device data functions can be provided to help the brcmfmac driver to
- - * operate with the device in combination with the used platform.
- - *
- - * Use the platform data in the following (similar) way:
- - *
- - *
- -#include <brcmfmac_platform.h>
- -
- -
- -static void brcmfmac_power_on(void)
- -{
- -}
- -
- -static void brcmfmac_power_off(void)
- -{
- -}
- -
- -static void brcmfmac_reset(void)
- -{
- -}
- -
- -static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = {
- - .power_on = brcmfmac_power_on,
- - .power_off = brcmfmac_power_off,
- - .reset = brcmfmac_reset
- -};
- -
- -static struct platform_device brcmfmac_device = {
- - .name = BRCMFMAC_SDIO_PDATA_NAME,
- - .id = PLATFORM_DEVID_NONE,
- - .dev.platform_data = &brcmfmac_sdio_pdata
- -};
- -
- -void __init brcmfmac_init_pdata(void)
- -{
- - brcmfmac_sdio_pdata.oob_irq_supported = true;
- - brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB);
- - brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ |
- - IORESOURCE_IRQ_HIGHLEVEL;
- - platform_device_register(&brcmfmac_device);
- -}
- - *
- - *
- - * Note: the brcmfmac can be loaded as module or be statically built-in into
- - * the kernel. If built-in then do note that it uses module_init (and
- - * module_exit) routines which equal device_initcall. So if you intend to
- - * create a module with the platform specific data for the brcmfmac and have
- - * it built-in to the kernel then use a higher initcall then device_initcall
- - * (see init.h). If this is not done then brcmfmac will load without problems
- - * but will not pickup the platform data.
- - *
- - * When the driver does not "detect" platform driver data then it will continue
- - * without reporting anything and just assume there is no data needed. Which is
- - * probably true for most platforms.
- - *
- - * Explanation of the platform_data fields:
- - *
- - * drive_strength: is the preferred drive_strength to be used for the SDIO
- - * pins. If 0 then a default value will be used. This is the target drive
- - * strength, the exact drive strength which will be used depends on the
- - * capabilities of the device.
- - *
- - * oob_irq_supported: does the board have support for OOB interrupts. SDIO
- - * in-band interrupts are relatively slow and for having less overhead on
- - * interrupt processing an out of band interrupt can be used. If the HW
- - * supports this then enable this by setting this field to true and configure
- - * the oob related fields.
- - *
- - * oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are
- - * used for registering the irq using request_irq function.
- - *
- - * broken_sg_support: flag for broken sg list support of SDIO host controller.
- - * Set this to true if the SDIO host controller has higher align requirement
- - * than 32 bytes for each scatterlist item.
- - *
- - * sd_head_align: alignment requirement for start of data buffer
- - *
- - * sd_sgentry_align: length alignment requirement for each sg entry
- - *
- - * power_on: This function is called by the brcmfmac when the module gets
- - * loaded. This can be particularly useful for low power devices. The platform
- - * spcific routine may for example decide to power up the complete device.
- - * If there is no use-case for this function then provide NULL.
- - *
- - * power_off: This function is called by the brcmfmac when the module gets
- - * unloaded. At this point the device can be powered down or otherwise be reset.
- - * So if an actual power_off is not supported but reset is then reset the device
- - * when this function gets called. This can be particularly useful for low power
- - * devices. If there is no use-case for this function (either power-down or
- - * reset) then provide NULL.
- - *
- - * reset: This function can get called if the device communication broke down.
- - * This functionality is particularly useful in case of SDIO type devices. It is
- - * possible to reset a dongle via sdio data interface, but it requires that
- - * this is fully functional. This function is chip/module specific and this
- - * function should return only after the complete reset has completed.
- - */
- -
- -#define BRCMFMAC_SDIO_PDATA_NAME "brcmfmac_sdio"
- -
- -struct brcmfmac_sdio_platform_data {
- - unsigned int drive_strength;
- - bool oob_irq_supported;
- - unsigned int oob_irq_nr;
- - unsigned long oob_irq_flags;
- - bool broken_sg_support;
- - unsigned short sd_head_align;
- - unsigned short sd_sgentry_align;
- - void (*power_on)(void);
- - void (*power_off)(void);
- - void (*reset)(void);
- -};
- -
- -#endif /* _LINUX_BRCMFMAC_PLATFORM_H */
- --- /dev/null
- +++ b/include/linux/platform_data/brcmfmac.h
- @@ -0,0 +1,185 @@
- +/*
- + * Copyright (c) 201 Broadcom Corporation
- + *
- + * Permission to use, copy, modify, and/or distribute this software for any
- + * purpose with or without fee is hereby granted, provided that the above
- + * copyright notice and this permission notice appear in all copies.
- + *
- + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- + */
- +
- +#ifndef _LINUX_BRCMFMAC_PLATFORM_H
- +#define _LINUX_BRCMFMAC_PLATFORM_H
- +
- +
- +#define BRCMFMAC_PDATA_NAME "brcmfmac"
- +
- +#define BRCMFMAC_COUNTRY_BUF_SZ 4
- +
- +
- +/*
- + * Platform specific driver functions and data. Through the platform specific
- + * device data functions and data can be provided to help the brcmfmac driver to
- + * operate with the device in combination with the used platform.
- + */
- +
- +
- +/**
- + * Note: the brcmfmac can be loaded as module or be statically built-in into
- + * the kernel. If built-in then do note that it uses module_init (and
- + * module_exit) routines which equal device_initcall. So if you intend to
- + * create a module with the platform specific data for the brcmfmac and have
- + * it built-in to the kernel then use a higher initcall then device_initcall
- + * (see init.h). If this is not done then brcmfmac will load without problems
- + * but will not pickup the platform data.
- + *
- + * When the driver does not "detect" platform driver data then it will continue
- + * without reporting anything and just assume there is no data needed. Which is
- + * probably true for most platforms.
- + */
- +
- +/**
- + * enum brcmf_bus_type - Bus type identifier. Currently SDIO, USB and PCIE are
- + * supported.
- + */
- +enum brcmf_bus_type {
- + BRCMF_BUSTYPE_SDIO,
- + BRCMF_BUSTYPE_USB,
- + BRCMF_BUSTYPE_PCIE
- +};
- +
- +
- +/**
- + * struct brcmfmac_sdio_pd - SDIO Device specific platform data.
- + *
- + * @txglomsz: SDIO txglom size. Use 0 if default of driver is to be
- + * used.
- + * @drive_strength: is the preferred drive_strength to be used for the SDIO
- + * pins. If 0 then a default value will be used. This is
- + * the target drive strength, the exact drive strength
- + * which will be used depends on the capabilities of the
- + * device.
- + * @oob_irq_supported: does the board have support for OOB interrupts. SDIO
- + * in-band interrupts are relatively slow and for having
- + * less overhead on interrupt processing an out of band
- + * interrupt can be used. If the HW supports this then
- + * enable this by setting this field to true and configure
- + * the oob related fields.
- + * @oob_irq_nr,
- + * @oob_irq_flags: the OOB interrupt information. The values are used for
- + * registering the irq using request_irq function.
- + * @broken_sg_support: flag for broken sg list support of SDIO host controller.
- + * Set this to true if the SDIO host controller has higher
- + * align requirement than 32 bytes for each scatterlist
- + * item.
- + * @sd_head_align: alignment requirement for start of data buffer.
- + * @sd_sgentry_align: length alignment requirement for each sg entry.
- + * @reset: This function can get called if the device communication
- + * broke down. This functionality is particularly useful in
- + * case of SDIO type devices. It is possible to reset a
- + * dongle via sdio data interface, but it requires that
- + * this is fully functional. This function is chip/module
- + * specific and this function should return only after the
- + * complete reset has completed.
- + */
- +struct brcmfmac_sdio_pd {
- + int txglomsz;
- + unsigned int drive_strength;
- + bool oob_irq_supported;
- + unsigned int oob_irq_nr;
- + unsigned long oob_irq_flags;
- + bool broken_sg_support;
- + unsigned short sd_head_align;
- + unsigned short sd_sgentry_align;
- + void (*reset)(void);
- +};
- +
- +/**
- + * struct brcmfmac_pd_cc_entry - Struct for translating user space country code
- + * (iso3166) to firmware country code and
- + * revision.
- + *
- + * @iso3166: iso3166 alpha 2 country code string.
- + * @cc: firmware country code string.
- + * @rev: firmware country code revision.
- + */
- +struct brcmfmac_pd_cc_entry {
- + char iso3166[BRCMFMAC_COUNTRY_BUF_SZ];
- + char cc[BRCMFMAC_COUNTRY_BUF_SZ];
- + s32 rev;
- +};
- +
- +/**
- + * struct brcmfmac_pd_cc - Struct for translating country codes as set by user
- + * space to a country code and rev which can be used by
- + * firmware.
- + *
- + * @table_size: number of entries in table (> 0)
- + * @table: array of 1 or more elements with translation information.
- + */
- +struct brcmfmac_pd_cc {
- + int table_size;
- + struct brcmfmac_pd_cc_entry table[0];
- +};
- +
- +/**
- + * struct brcmfmac_pd_device - Device specific platform data. (id/rev/bus_type)
- + * is the unique identifier of the device.
- + *
- + * @id: ID of the device for which this data is. In case of SDIO
- + * or PCIE this is the chipid as identified by chip.c In
- + * case of USB this is the chipid as identified by the
- + * device query.
- + * @rev: chip revision, see id.
- + * @bus_type: The type of bus. Some chipid/rev exist for different bus
- + * types. Each bus type has its own set of settings.
- + * @feature_disable: Bitmask of features to disable (override), See feature.c
- + * in brcmfmac for details.
- + * @country_codes: If available, pointer to struct for translating country
- + * codes.
- + * @bus: Bus specific (union) device settings. Currently only
- + * SDIO.
- + */
- +struct brcmfmac_pd_device {
- + unsigned int id;
- + unsigned int rev;
- + enum brcmf_bus_type bus_type;
- + unsigned int feature_disable;
- + struct brcmfmac_pd_cc *country_codes;
- + union {
- + struct brcmfmac_sdio_pd sdio;
- + } bus;
- +};
- +
- +/**
- + * struct brcmfmac_platform_data - BRCMFMAC specific platform data.
- + *
- + * @power_on: This function is called by the brcmfmac driver when the module
- + * gets loaded. This can be particularly useful for low power
- + * devices. The platform spcific routine may for example decide to
- + * power up the complete device. If there is no use-case for this
- + * function then provide NULL.
- + * @power_off: This function is called by the brcmfmac when the module gets
- + * unloaded. At this point the devices can be powered down or
- + * otherwise be reset. So if an actual power_off is not supported
- + * but reset is supported by the devices then reset the devices
- + * when this function gets called. This can be particularly useful
- + * for low power devices. If there is no use-case for this
- + * function then provide NULL.
- + */
- +struct brcmfmac_platform_data {
- + void (*power_on)(void);
- + void (*power_off)(void);
- + char *fw_alternative_path;
- + int device_count;
- + struct brcmfmac_pd_device devices[0];
- +};
- +
- +
- +#endif /* _LINUX_BRCMFMAC_PLATFORM_H */
|