aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Haber <phaber@broadcom.com>2013-04-11 07:28:52 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-04-12 14:27:55 -0400
commit1e9ab4dd258ecbb0f1c377fd4dbe227cdb93d9bd (patch)
tree2258a32db23f53f5eb9aecae6a505056ec9e51cc
parent1640f28f6b839637d9b82a3c4a19120601e59c66 (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.c38
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h2
-rw-r--r--include/linux/bcma/bcma_driver_chipcommon.h3
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 */