diff options
author | Piotr Haber <phaber@broadcom.com> | 2013-04-11 07:28:52 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-04-12 14:27:55 -0400 |
commit | 1e9ab4dd258ecbb0f1c377fd4dbe227cdb93d9bd (patch) | |
tree | 2258a32db23f53f5eb9aecae6a505056ec9e51cc | |
parent | 1640f28f6b839637d9b82a3c4a19120601e59c66 (diff) |
brcmfmac: setup SDIO reset behavior
Set device in a manner that SDIO I/O card reset
will lead to WLAN backplane and PMU state reset.
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: Piotr Haber <phaber@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 38 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h | 2 | ||||
-rw-r--r-- | include/linux/bcma/bcma_driver_chipcommon.h | 3 |
3 files changed, 36 insertions, 7 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index d24eb66d324d..c06bb083c459 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
@@ -3635,7 +3635,6 @@ brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) | |||
3635 | int err = 0; | 3635 | int err = 0; |
3636 | int reg_addr; | 3636 | int reg_addr; |
3637 | u32 reg_val; | 3637 | u32 reg_val; |
3638 | u8 idx; | ||
3639 | 3638 | ||
3640 | bus->alp_only = true; | 3639 | bus->alp_only = true; |
3641 | 3640 | ||
@@ -3686,12 +3685,37 @@ brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva) | |||
3686 | goto fail; | 3685 | goto fail; |
3687 | } | 3686 | } |
3688 | 3687 | ||
3689 | /* Set core control so an SDIO reset does a backplane reset */ | 3688 | /* Set card control so an SDIO card reset does a WLAN backplane reset */ |
3690 | idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); | 3689 | reg_val = brcmf_sdio_regrb(bus->sdiodev, |
3691 | reg_addr = bus->ci->c_inf[idx].base + | 3690 | SDIO_CCCR_BRCM_CARDCTRL, &err); |
3692 | offsetof(struct sdpcmd_regs, corecontrol); | 3691 | if (err) |
3693 | reg_val = brcmf_sdio_regrl(bus->sdiodev, reg_addr, NULL); | 3692 | goto fail; |
3694 | brcmf_sdio_regwl(bus->sdiodev, reg_addr, reg_val | CC_BPRESEN, NULL); | 3693 | |
3694 | reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; | ||
3695 | |||
3696 | brcmf_sdio_regwb(bus->sdiodev, | ||
3697 | SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); | ||
3698 | if (err) | ||
3699 | goto fail; | ||
3700 | |||
3701 | /* set PMUControl so a backplane reset does PMU state reload */ | ||
3702 | reg_addr = CORE_CC_REG(bus->ci->c_inf[0].base, | ||
3703 | pmucontrol); | ||
3704 | reg_val = brcmf_sdio_regrl(bus->sdiodev, | ||
3705 | reg_addr, | ||
3706 | &err); | ||
3707 | if (err) | ||
3708 | goto fail; | ||
3709 | |||
3710 | reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); | ||
3711 | |||
3712 | brcmf_sdio_regwl(bus->sdiodev, | ||
3713 | reg_addr, | ||
3714 | reg_val, | ||
3715 | &err); | ||
3716 | if (err) | ||
3717 | goto fail; | ||
3718 | |||
3695 | 3719 | ||
3696 | sdio_release_host(bus->sdiodev->func[1]); | 3720 | sdio_release_host(bus->sdiodev->func[1]); |
3697 | 3721 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h index b9b397b59965..28ed3cc9f35a 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h | |||
@@ -52,6 +52,8 @@ | |||
52 | #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT 0x02 | 52 | #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT 0x02 |
53 | #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT 0x04 | 53 | #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT 0x04 |
54 | #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC 0x08 | 54 | #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC 0x08 |
55 | #define SDIO_CCCR_BRCM_CARDCTRL 0xf1 | ||
56 | #define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET 0x02 | ||
55 | #define SDIO_CCCR_BRCM_SEPINT 0xf2 | 57 | #define SDIO_CCCR_BRCM_SEPINT 0xf2 |
56 | 58 | ||
57 | #define SDIO_SEPINT_MASK 0x01 | 59 | #define SDIO_SEPINT_MASK 0x01 |
diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 453fcc914683..b8b09eac60a4 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h | |||
@@ -316,6 +316,9 @@ | |||
316 | #define BCMA_CC_PMU_CTL 0x0600 /* PMU control */ | 316 | #define BCMA_CC_PMU_CTL 0x0600 /* PMU control */ |
317 | #define BCMA_CC_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */ | 317 | #define BCMA_CC_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */ |
318 | #define BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16 | 318 | #define BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16 |
319 | #define BCMA_CC_PMU_CTL_RES 0x00006000 /* reset control mask */ | ||
320 | #define BCMA_CC_PMU_CTL_RES_SHIFT 13 | ||
321 | #define BCMA_CC_PMU_CTL_RES_RELOAD 0x2 /* reload POR values */ | ||
319 | #define BCMA_CC_PMU_CTL_PLL_UPD 0x00000400 | 322 | #define BCMA_CC_PMU_CTL_PLL_UPD 0x00000400 |
320 | #define BCMA_CC_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */ | 323 | #define BCMA_CC_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */ |
321 | #define BCMA_CC_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */ | 324 | #define BCMA_CC_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */ |