aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Molton <ian@mnementh.co.uk>2017-12-08 07:10:35 -0500
committerKalle Valo <kvalo@codeaurora.org>2017-12-14 07:41:04 -0500
commit21a10846d09db3c5e3bdfb0be0fc7aa9fdc7000a (patch)
tree21793c7f07f67f6ac8401d3a8ab8b47126112ab5
parent5cfe38f1f8d3c6b98e15b8cfde05028a3c79930b (diff)
brcmfmac: Remove repeated calls to brcmf_chip_get_core()
There is no need to repeatdly call brcmf_chip_get_core(), which traverses a list of cores every time its called (including during register access code!). Call it once, and store a pointer to the core structure. The existing code does nto keep track of users of the cores anyway, and even so, this will allow for easier refcounting in future. Signed-off-by: Ian Molton <ian@mnementh.co.uk> Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 1e1e19863723..93a1a0c16aa8 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -436,6 +436,7 @@ struct brcmf_sdio_count {
436struct brcmf_sdio { 436struct brcmf_sdio {
437 struct brcmf_sdio_dev *sdiodev; /* sdio device handler */ 437 struct brcmf_sdio_dev *sdiodev; /* sdio device handler */
438 struct brcmf_chip *ci; /* Chip info struct */ 438 struct brcmf_chip *ci; /* Chip info struct */
439 struct brcmf_core *sdio_core; /* sdio core info struct */
439 440
440 u32 hostintmask; /* Copy of Host Interrupt Mask */ 441 u32 hostintmask; /* Copy of Host Interrupt Mask */
441 atomic_t intstatus; /* Intstatus bits (events) pending */ 442 atomic_t intstatus; /* Intstatus bits (events) pending */
@@ -665,10 +666,9 @@ static bool data_ok(struct brcmf_sdio *bus)
665 */ 666 */
666static int r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset) 667static int r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset)
667{ 668{
668 struct brcmf_core *core; 669 struct brcmf_core *core = bus->sdio_core;
669 int ret; 670 int ret;
670 671
671 core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
672 *regvar = brcmf_sdiod_readl(bus->sdiodev, core->base + offset, &ret); 672 *regvar = brcmf_sdiod_readl(bus->sdiodev, core->base + offset, &ret);
673 673
674 return ret; 674 return ret;
@@ -676,10 +676,9 @@ static int r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset)
676 676
677static int w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset) 677static int w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset)
678{ 678{
679 struct brcmf_core *core; 679 struct brcmf_core *core = bus->sdio_core;
680 int ret; 680 int ret;
681 681
682 core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
683 brcmf_sdiod_writel(bus->sdiodev, core->base + reg_offset, regval, &ret); 682 brcmf_sdiod_writel(bus->sdiodev, core->base + reg_offset, regval, &ret);
684 683
685 return ret; 684 return ret;
@@ -2495,12 +2494,11 @@ static inline void brcmf_sdio_clrintr(struct brcmf_sdio *bus)
2495 2494
2496static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) 2495static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
2497{ 2496{
2498 struct brcmf_core *buscore; 2497 struct brcmf_core *buscore = bus->sdio_core;
2499 u32 addr; 2498 u32 addr;
2500 unsigned long val; 2499 unsigned long val;
2501 int ret; 2500 int ret;
2502 2501
2503 buscore = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
2504 addr = buscore->base + SD_REG(intstatus); 2502 addr = buscore->base + SD_REG(intstatus);
2505 2503
2506 val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret); 2504 val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret);
@@ -3377,13 +3375,14 @@ static void brcmf_sdio_sr_init(struct brcmf_sdio *bus)
3377/* enable KSO bit */ 3375/* enable KSO bit */
3378static int brcmf_sdio_kso_init(struct brcmf_sdio *bus) 3376static int brcmf_sdio_kso_init(struct brcmf_sdio *bus)
3379{ 3377{
3378 struct brcmf_core *core = bus->sdio_core;
3380 u8 val; 3379 u8 val;
3381 int err = 0; 3380 int err = 0;
3382 3381
3383 brcmf_dbg(TRACE, "Enter\n"); 3382 brcmf_dbg(TRACE, "Enter\n");
3384 3383
3385 /* KSO bit added in SDIO core rev 12 */ 3384 /* KSO bit added in SDIO core rev 12 */
3386 if (brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV)->rev < 12) 3385 if (core->rev < 12)
3387 return 0; 3386 return 0;
3388 3387
3389 val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err); 3388 val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err);
@@ -3412,6 +3411,7 @@ static int brcmf_sdio_bus_preinit(struct device *dev)
3412 struct brcmf_bus *bus_if = dev_get_drvdata(dev); 3411 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
3413 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; 3412 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
3414 struct brcmf_sdio *bus = sdiodev->bus; 3413 struct brcmf_sdio *bus = sdiodev->bus;
3414 struct brcmf_core *core = bus->sdio_core;
3415 uint pad_size; 3415 uint pad_size;
3416 u32 value; 3416 u32 value;
3417 int err; 3417 int err;
@@ -3420,7 +3420,7 @@ static int brcmf_sdio_bus_preinit(struct device *dev)
3420 * a device perspective, ie. bus:txglom affects the 3420 * a device perspective, ie. bus:txglom affects the
3421 * bus transfers from device to host. 3421 * bus transfers from device to host.
3422 */ 3422 */
3423 if (brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV)->rev < 12) { 3423 if (core->rev < 12) {
3424 /* for sdio core rev < 12, disable txgloming */ 3424 /* for sdio core rev < 12, disable txgloming */
3425 value = 0; 3425 value = 0;
3426 err = brcmf_iovar_data_set(dev, "bus:txglom", &value, 3426 err = brcmf_iovar_data_set(dev, "bus:txglom", &value,
@@ -3758,11 +3758,10 @@ static void brcmf_sdio_buscore_activate(void *ctx, struct brcmf_chip *chip,
3758 u32 rstvec) 3758 u32 rstvec)
3759{ 3759{
3760 struct brcmf_sdio_dev *sdiodev = ctx; 3760 struct brcmf_sdio_dev *sdiodev = ctx;
3761 struct brcmf_core *core; 3761 struct brcmf_core *core = sdiodev->bus->sdio_core;
3762 u32 reg_addr; 3762 u32 reg_addr;
3763 3763
3764 /* clear all interrupts */ 3764 /* clear all interrupts */
3765 core = brcmf_chip_get_core(chip, BCMA_CORE_SDIO_DEV);
3766 reg_addr = core->base + SD_REG(intstatus); 3765 reg_addr = core->base + SD_REG(intstatus);
3767 brcmf_sdiod_writel(sdiodev, reg_addr, 0xFFFFFFFF, NULL); 3766 brcmf_sdiod_writel(sdiodev, reg_addr, 0xFFFFFFFF, NULL);
3768 3767
@@ -3843,6 +3842,12 @@ brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
3843 bus->ci = NULL; 3842 bus->ci = NULL;
3844 goto fail; 3843 goto fail;
3845 } 3844 }
3845
3846 /* Pick up the SDIO core info struct from chip.c */
3847 bus->sdio_core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
3848 if (!bus->sdio_core)
3849 goto fail;
3850
3846 sdiodev->settings = brcmf_get_module_param(sdiodev->dev, 3851 sdiodev->settings = brcmf_get_module_param(sdiodev->dev,
3847 BRCMF_BUSTYPE_SDIO, 3852 BRCMF_BUSTYPE_SDIO,
3848 bus->ci->chip, 3853 bus->ci->chip,