123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- From: Hante Meuleman <meuleman@broadcom.com>
- Date: Wed, 17 Feb 2016 11:27:04 +0100
- Subject: [PATCH] brcmfmac: move platform data retrieval code to common
- In preparation of module parameters for all devices the module
- platform data retrieval is moved from sdio to common. It is still
- only used 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
- @@ -27,8 +27,6 @@
- #include <linux/mmc/sdio_func.h>
- #include <linux/mmc/card.h>
- #include <linux/mmc/host.h>
- -#include <linux/platform_device.h>
- -#include <linux/platform_data/brcmfmac-sdio.h>
- #include <linux/pm_runtime.h>
- #include <linux/suspend.h>
- #include <linux/errno.h>
- @@ -46,7 +44,6 @@
- #include "bus.h"
- #include "debug.h"
- #include "sdio.h"
- -#include "of.h"
- #include "core.h"
- #include "common.h"
-
- @@ -106,18 +103,18 @@ static void brcmf_sdiod_dummy_irqhandler
-
- int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev)
- {
- + struct brcmfmac_sdio_platform_data *pdata;
- int ret = 0;
- u8 data;
- u32 addr, gpiocontrol;
- unsigned long flags;
-
- - if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) {
- + pdata = sdiodev->pdata;
- + if ((pdata) && (pdata->oob_irq_supported)) {
- brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n",
- - sdiodev->pdata->oob_irq_nr);
- - ret = request_irq(sdiodev->pdata->oob_irq_nr,
- - brcmf_sdiod_oob_irqhandler,
- - sdiodev->pdata->oob_irq_flags,
- - "brcmf_oob_intr",
- + pdata->oob_irq_nr);
- + ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler,
- + pdata->oob_irq_flags, "brcmf_oob_intr",
- &sdiodev->func[1]->dev);
- if (ret != 0) {
- brcmf_err("request_irq failed %d\n", ret);
- @@ -129,7 +126,7 @@ int brcmf_sdiod_intr_register(struct brc
- sdiodev->irq_en = true;
- spin_unlock_irqrestore(&sdiodev->irq_en_lock, flags);
-
- - ret = enable_irq_wake(sdiodev->pdata->oob_irq_nr);
- + ret = enable_irq_wake(pdata->oob_irq_nr);
- if (ret != 0) {
- brcmf_err("enable_irq_wake failed %d\n", ret);
- return ret;
- @@ -158,7 +155,7 @@ int brcmf_sdiod_intr_register(struct brc
-
- /* redirect, configure and enable io for interrupt signal */
- data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE;
- - if (sdiodev->pdata->oob_irq_flags & IRQF_TRIGGER_HIGH)
- + if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH)
- data |= SDIO_SEPINT_ACT_HI;
- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret);
-
- @@ -176,9 +173,12 @@ int brcmf_sdiod_intr_register(struct brc
-
- int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev)
- {
- + struct brcmfmac_sdio_platform_data *pdata;
- +
- brcmf_dbg(SDIO, "Entering\n");
-
- - if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) {
- + pdata = sdiodev->pdata;
- + if ((pdata) && (pdata->oob_irq_supported)) {
- sdio_claim_host(sdiodev->func[1]);
- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);
- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL);
- @@ -187,11 +187,10 @@ int brcmf_sdiod_intr_unregister(struct b
- if (sdiodev->oob_irq_requested) {
- sdiodev->oob_irq_requested = false;
- if (sdiodev->irq_wake) {
- - disable_irq_wake(sdiodev->pdata->oob_irq_nr);
- + disable_irq_wake(pdata->oob_irq_nr);
- sdiodev->irq_wake = false;
- }
- - free_irq(sdiodev->pdata->oob_irq_nr,
- - &sdiodev->func[1]->dev);
- + free_irq(pdata->oob_irq_nr, &sdiodev->func[1]->dev);
- sdiodev->irq_en = false;
- }
- } else {
- @@ -1103,8 +1102,6 @@ static const struct sdio_device_id brcmf
- };
- MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
-
- -static struct brcmfmac_sdio_platform_data *brcmfmac_sdio_pdata;
- -
-
- static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev,
- int val)
- @@ -1167,10 +1164,7 @@ 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 = brcmfmac_sdio_pdata;
- -
- - if (!sdiodev->pdata)
- - brcmf_of_probe(sdiodev);
- + 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
- @@ -1296,7 +1290,7 @@ static const struct dev_pm_ops brcmf_sdi
- static struct sdio_driver brcmf_sdmmc_driver = {
- .probe = brcmf_ops_sdio_probe,
- .remove = brcmf_ops_sdio_remove,
- - .name = BRCMFMAC_SDIO_PDATA_NAME,
- + .name = KBUILD_MODNAME,
- .id_table = brcmf_sdmmc_ids,
- .drv = {
- .owner = THIS_MODULE,
- @@ -1306,37 +1300,6 @@ static struct sdio_driver brcmf_sdmmc_dr
- },
- };
-
- -static int __init brcmf_sdio_pd_probe(struct platform_device *pdev)
- -{
- - brcmf_dbg(SDIO, "Enter\n");
- -
- - brcmfmac_sdio_pdata = dev_get_platdata(&pdev->dev);
- -
- - if (brcmfmac_sdio_pdata->power_on)
- - brcmfmac_sdio_pdata->power_on();
- -
- - return 0;
- -}
- -
- -static int brcmf_sdio_pd_remove(struct platform_device *pdev)
- -{
- - brcmf_dbg(SDIO, "Enter\n");
- -
- - if (brcmfmac_sdio_pdata->power_off)
- - brcmfmac_sdio_pdata->power_off();
- -
- - sdio_unregister_driver(&brcmf_sdmmc_driver);
- -
- - return 0;
- -}
- -
- -static struct platform_driver brcmf_sdio_pd = {
- - .remove = brcmf_sdio_pd_remove,
- - .driver = {
- - .name = BRCMFMAC_SDIO_PDATA_NAME,
- - }
- -};
- -
- void brcmf_sdio_register(void)
- {
- int ret;
- @@ -1350,19 +1313,6 @@ void brcmf_sdio_exit(void)
- {
- brcmf_dbg(SDIO, "Enter\n");
-
- - if (brcmfmac_sdio_pdata)
- - platform_driver_unregister(&brcmf_sdio_pd);
- - else
- - sdio_unregister_driver(&brcmf_sdmmc_driver);
- + sdio_unregister_driver(&brcmf_sdmmc_driver);
- }
-
- -void __init brcmf_sdio_init(void)
- -{
- - int ret;
- -
- - brcmf_dbg(SDIO, "Enter\n");
- -
- - ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe);
- - if (ret == -ENODEV)
- - brcmf_dbg(SDIO, "No platform data available.\n");
- -}
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
- @@ -27,6 +27,7 @@
- #include "fwil_types.h"
- #include "tracepoint.h"
- #include "common.h"
- +#include "of.h"
-
- MODULE_AUTHOR("Broadcom Corporation");
- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
- @@ -79,6 +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;
- struct brcmf_mp_global_t brcmf_mp_global;
-
- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- @@ -231,6 +233,13 @@ static void brcmf_mp_attach(void)
- 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;
- +}
- +
- int brcmf_mp_device_attach(struct brcmf_pub *drvr)
- {
- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC);
- @@ -253,6 +262,35 @@ void brcmf_mp_device_detach(struct brcmf
- kfree(drvr->settings);
- }
-
- +static int __init brcmf_common_pd_probe(struct platform_device *pdev)
- +{
- + brcmf_dbg(INFO, "Enter\n");
- +
- + brcmfmac_pdata = dev_get_platdata(&pdev->dev);
- +
- + if (brcmfmac_pdata->power_on)
- + brcmfmac_pdata->power_on();
- +
- + return 0;
- +}
- +
- +static int brcmf_common_pd_remove(struct platform_device *pdev)
- +{
- + brcmf_dbg(INFO, "Enter\n");
- +
- + if (brcmfmac_pdata->power_off)
- + brcmfmac_pdata->power_off();
- +
- + return 0;
- +}
- +
- +static struct platform_driver brcmf_pd = {
- + .remove = brcmf_common_pd_remove,
- + .driver = {
- + .name = BRCMFMAC_SDIO_PDATA_NAME,
- + }
- +};
- +
- static int __init brcmfmac_module_init(void)
- {
- int err;
- @@ -260,16 +298,21 @@ static int __init brcmfmac_module_init(v
- /* Initialize debug system first */
- brcmf_debugfs_init();
-
- -#ifdef CPTCFG_BRCMFMAC_SDIO
- - brcmf_sdio_init();
- -#endif
- + /* Get the platform data (if available) for our devices */
- + err = platform_driver_probe(&brcmf_pd, brcmf_common_pd_probe);
- + if (err == -ENODEV)
- + brcmf_dbg(INFO, "No platform data available.\n");
- +
- /* Initialize global module paramaters */
- brcmf_mp_attach();
-
- /* Continue the initialization by registering the different busses */
- err = brcmf_core_init();
- - if (err)
- + if (err) {
- brcmf_debugfs_exit();
- + if (brcmfmac_pdata)
- + platform_driver_unregister(&brcmf_pd);
- + }
-
- return err;
- }
- @@ -277,6 +320,8 @@ static int __init brcmfmac_module_init(v
- static void __exit brcmfmac_module_exit(void)
- {
- brcmf_core_exit();
- + if (brcmfmac_pdata)
- + platform_driver_unregister(&brcmf_pd);
- brcmf_debugfs_exit();
- }
-
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
- @@ -15,6 +15,8 @@
- #ifndef BRCMFMAC_COMMON_H
- #define BRCMFMAC_COMMON_H
-
- +#include <linux/platform_device.h>
- +#include <linux/platform_data/brcmfmac-sdio.h>
- #include "fwil_types.h"
-
- extern const u8 ALLFFMAC[ETH_ALEN];
- @@ -89,6 +91,7 @@ struct brcmf_mp_device {
- struct cc_translate *country_codes;
- };
-
- +struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev);
- 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
- @@ -16,17 +16,16 @@
- #include <linux/init.h>
- #include <linux/of.h>
- #include <linux/of_irq.h>
- -#include <linux/mmc/card.h>
- -#include <linux/platform_data/brcmfmac-sdio.h>
- -#include <linux/mmc/sdio_func.h>
-
- #include <defs.h>
- #include "debug.h"
- -#include "sdio.h"
- +#include "core.h"
- +#include "common.h"
- +#include "of.h"
-
- -void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev)
- +void
- +brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio)
- {
- - struct device *dev = sdiodev->dev;
- struct device_node *np = dev->of_node;
- int irq;
- u32 irqf;
- @@ -35,12 +34,12 @@ void brcmf_of_probe(struct brcmf_sdio_de
- if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
- return;
-
- - sdiodev->pdata = devm_kzalloc(dev, sizeof(*sdiodev->pdata), GFP_KERNEL);
- - if (!sdiodev->pdata)
- + *sdio = devm_kzalloc(dev, sizeof(*sdio), GFP_KERNEL);
- + if (!(*sdio))
- return;
-
- if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
- - sdiodev->pdata->drive_strength = val;
- + (*sdio)->drive_strength = val;
-
- /* make sure there are interrupts defined in the node */
- if (!of_find_property(np, "interrupts", NULL))
- @@ -53,7 +52,7 @@ void brcmf_of_probe(struct brcmf_sdio_de
- }
- irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
-
- - sdiodev->pdata->oob_irq_supported = true;
- - sdiodev->pdata->oob_irq_nr = irq;
- - sdiodev->pdata->oob_irq_flags = irqf;
- + (*sdio)->oob_irq_supported = true;
- + (*sdio)->oob_irq_nr = irq;
- + (*sdio)->oob_irq_flags = irqf;
- }
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
- @@ -14,9 +14,11 @@
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- #ifdef CONFIG_OF
- -void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev);
- +void
- +brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio);
- #else
- -static void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev)
- +static void brcmf_of_probe(struct device *dev,
- + struct brcmfmac_sdio_platform_data **sdio)
- {
- }
- #endif /* CONFIG_OF */
|