diff options
author | Ian Molton <ian@mnementh.co.uk> | 2017-12-08 07:10:35 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2017-12-14 07:41:04 -0500 |
commit | 21a10846d09db3c5e3bdfb0be0fc7aa9fdc7000a (patch) | |
tree | 21793c7f07f67f6ac8401d3a8ab8b47126112ab5 | |
parent | 5cfe38f1f8d3c6b98e15b8cfde05028a3c79930b (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.c | 25 |
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 { | |||
436 | struct brcmf_sdio { | 436 | struct 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 | */ |
666 | static int r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset) | 667 | static 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 | ||
677 | static int w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset) | 677 | static 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 | ||
2496 | static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) | 2495 | static 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 */ |
3378 | static int brcmf_sdio_kso_init(struct brcmf_sdio *bus) | 3376 | static 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, |