aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211
diff options
context:
space:
mode:
authorFranky Lin <frankyl@broadcom.com>2011-11-04 17:23:29 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-11-09 16:13:56 -0500
commite63ac6b888eed345f5b93751649515d6436abed2 (patch)
treee52ae8f6db00cb2058b377f2852f08270e318946 /drivers/net/wireless/brcm80211
parenta83369b6e1e7285edd5217601a0618b9a43bdc4b (diff)
brcm80211: fmac: move bus core prep code to sdio_chip.c
This patch is part of abstracting chip backplane handle code series. Reviewed-by: Arend van Spriel <arend@broadcom.com> Reviewed-by: Roland Vossen <rvossen@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c73
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c52
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h24
3 files changed, 77 insertions, 72 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index e12e99b7b774..9a78cc3e2820 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -135,33 +135,6 @@ struct rte_console {
135/* Force no backplane reset */ 135/* Force no backplane reset */
136#define SBSDIO_DEVCTL_RST_NOBPRESET 0x20 136#define SBSDIO_DEVCTL_RST_NOBPRESET 0x20
137 137
138/* SBSDIO_FUNC1_CHIPCLKCSR */
139
140/* Force ALP request to backplane */
141#define SBSDIO_FORCE_ALP 0x01
142/* Force HT request to backplane */
143#define SBSDIO_FORCE_HT 0x02
144/* Force ILP request to backplane */
145#define SBSDIO_FORCE_ILP 0x04
146/* Make ALP ready (power up xtal) */
147#define SBSDIO_ALP_AVAIL_REQ 0x08
148/* Make HT ready (power up PLL) */
149#define SBSDIO_HT_AVAIL_REQ 0x10
150/* Squelch clock requests from HW */
151#define SBSDIO_FORCE_HW_CLKREQ_OFF 0x20
152/* Status: ALP is ready */
153#define SBSDIO_ALP_AVAIL 0x40
154/* Status: HT is ready */
155#define SBSDIO_HT_AVAIL 0x80
156
157#define SBSDIO_AVBITS (SBSDIO_HT_AVAIL | SBSDIO_ALP_AVAIL)
158#define SBSDIO_ALPAV(regval) ((regval) & SBSDIO_AVBITS)
159#define SBSDIO_HTAV(regval) (((regval) & SBSDIO_AVBITS) == SBSDIO_AVBITS)
160#define SBSDIO_ALPONLY(regval) (SBSDIO_ALPAV(regval) && !SBSDIO_HTAV(regval))
161
162#define SBSDIO_CLKAV(regval, alponly) \
163 (SBSDIO_ALPAV(regval) && (alponly ? 1 : SBSDIO_HTAV(regval)))
164
165/* direct(mapped) cis space */ 138/* direct(mapped) cis space */
166 139
167/* MAPPED common CIS address */ 140/* MAPPED common CIS address */
@@ -4010,7 +3983,7 @@ brcmf_sdbrcm_chip_attach(struct brcmf_bus *bus, u32 regs)
4010{ 3983{
4011 struct chip_info *ci; 3984 struct chip_info *ci;
4012 int err; 3985 int err;
4013 u8 clkval, clkset; 3986 u8 clkval;
4014 3987
4015 brcmf_dbg(TRACE, "Enter\n"); 3988 brcmf_dbg(TRACE, "Enter\n");
4016 3989
@@ -4019,50 +3992,6 @@ brcmf_sdbrcm_chip_attach(struct brcmf_bus *bus, u32 regs)
4019 if (NULL == ci) 3992 if (NULL == ci)
4020 return -ENOMEM; 3993 return -ENOMEM;
4021 3994
4022 /* bus/core/clk setup for register access */
4023 /* Try forcing SDIO core to do ALPAvail request only */
4024 clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ;
4025 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1,
4026 SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
4027 if (err) {
4028 brcmf_dbg(ERROR, "error writing for HT off\n");
4029 goto fail;
4030 }
4031
4032 /* If register supported, wait for ALPAvail and then force ALP */
4033 /* This may take up to 15 milliseconds */
4034 clkval = brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1,
4035 SBSDIO_FUNC1_CHIPCLKCSR, NULL);
4036 if ((clkval & ~SBSDIO_AVBITS) == clkset) {
4037 SPINWAIT(((clkval =
4038 brcmf_sdcard_cfg_read(bus->sdiodev, SDIO_FUNC_1,
4039 SBSDIO_FUNC1_CHIPCLKCSR,
4040 NULL)),
4041 !SBSDIO_ALPAV(clkval)),
4042 PMU_MAX_TRANSITION_DLY);
4043 if (!SBSDIO_ALPAV(clkval)) {
4044 brcmf_dbg(ERROR, "timeout on ALPAV wait, clkval 0x%02x\n",
4045 clkval);
4046 err = -EBUSY;
4047 goto fail;
4048 }
4049 clkset = SBSDIO_FORCE_HW_CLKREQ_OFF |
4050 SBSDIO_FORCE_ALP;
4051 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1,
4052 SBSDIO_FUNC1_CHIPCLKCSR,
4053 clkset, &err);
4054 udelay(65);
4055 } else {
4056 brcmf_dbg(ERROR, "ChipClkCSR access: wrote 0x%02x read 0x%02x\n",
4057 clkset, clkval);
4058 err = -EACCES;
4059 goto fail;
4060 }
4061
4062 /* Also, disable the extra SDIO pull-ups */
4063 brcmf_sdcard_cfg_write(bus->sdiodev, SDIO_FUNC_1,
4064 SBSDIO_FUNC1_SDIOPULLUP, 0, NULL);
4065
4066 err = brcmf_sdio_chip_attach(bus->sdiodev, ci, regs); 3995 err = brcmf_sdio_chip_attach(bus->sdiodev, ci, regs);
4067 if (err) 3996 if (err)
4068 goto fail; 3997 goto fail;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
index 7f01a9b4aa2f..7bf9778cfeff 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
@@ -106,11 +106,63 @@ static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev,
106 return 0; 106 return 0;
107} 107}
108 108
109static int
110brcmf_sdio_chip_buscoreprep(struct brcmf_sdio_dev *sdiodev)
111{
112 int err = 0;
113 u8 clkval, clkset;
114
115 /* Try forcing SDIO core to do ALPAvail request only */
116 clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ;
117 brcmf_sdcard_cfg_write(sdiodev, SDIO_FUNC_1,
118 SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
119 if (err) {
120 brcmf_dbg(ERROR, "error writing for HT off\n");
121 return err;
122 }
123
124 /* If register supported, wait for ALPAvail and then force ALP */
125 /* This may take up to 15 milliseconds */
126 clkval = brcmf_sdcard_cfg_read(sdiodev, SDIO_FUNC_1,
127 SBSDIO_FUNC1_CHIPCLKCSR, NULL);
128
129 if ((clkval & ~SBSDIO_AVBITS) != clkset) {
130 brcmf_dbg(ERROR, "ChipClkCSR access: wrote 0x%02x read 0x%02x\n",
131 clkset, clkval);
132 return -EACCES;
133 }
134
135 SPINWAIT(((clkval = brcmf_sdcard_cfg_read(sdiodev, SDIO_FUNC_1,
136 SBSDIO_FUNC1_CHIPCLKCSR, NULL)),
137 !SBSDIO_ALPAV(clkval)),
138 PMU_MAX_TRANSITION_DLY);
139 if (!SBSDIO_ALPAV(clkval)) {
140 brcmf_dbg(ERROR, "timeout on ALPAV wait, clkval 0x%02x\n",
141 clkval);
142 return -EBUSY;
143 }
144
145 clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP;
146 brcmf_sdcard_cfg_write(sdiodev, SDIO_FUNC_1,
147 SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
148 udelay(65);
149
150 /* Also, disable the extra SDIO pull-ups */
151 brcmf_sdcard_cfg_write(sdiodev, SDIO_FUNC_1,
152 SBSDIO_FUNC1_SDIOPULLUP, 0, NULL);
153
154 return 0;
155}
156
109int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, 157int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev,
110 struct chip_info *ci, u32 regs) 158 struct chip_info *ci, u32 regs)
111{ 159{
112 int ret = 0; 160 int ret = 0;
113 161
162 ret = brcmf_sdio_chip_buscoreprep(sdiodev);
163 if (ret != 0)
164 return ret;
165
114 ret = brcmf_sdio_chip_recognition(sdiodev, ci, regs); 166 ret = brcmf_sdio_chip_recognition(sdiodev, ci, regs);
115 if (ret != 0) 167 if (ret != 0)
116 return ret; 168 return ret;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
index 95951863480b..2d75b8c55de9 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
@@ -28,6 +28,30 @@
28#define CORE_SB(base, field) \ 28#define CORE_SB(base, field) \
29 (base + SBCONFIGOFF + offsetof(struct sbconfig, field)) 29 (base + SBCONFIGOFF + offsetof(struct sbconfig, field))
30 30
31/* SDIO function 1 register CHIPCLKCSR */
32/* Force ALP request to backplane */
33#define SBSDIO_FORCE_ALP 0x01
34/* Force HT request to backplane */
35#define SBSDIO_FORCE_HT 0x02
36/* Force ILP request to backplane */
37#define SBSDIO_FORCE_ILP 0x04
38/* Make ALP ready (power up xtal) */
39#define SBSDIO_ALP_AVAIL_REQ 0x08
40/* Make HT ready (power up PLL) */
41#define SBSDIO_HT_AVAIL_REQ 0x10
42/* Squelch clock requests from HW */
43#define SBSDIO_FORCE_HW_CLKREQ_OFF 0x20
44/* Status: ALP is ready */
45#define SBSDIO_ALP_AVAIL 0x40
46/* Status: HT is ready */
47#define SBSDIO_HT_AVAIL 0x80
48#define SBSDIO_AVBITS (SBSDIO_HT_AVAIL | SBSDIO_ALP_AVAIL)
49#define SBSDIO_ALPAV(regval) ((regval) & SBSDIO_AVBITS)
50#define SBSDIO_HTAV(regval) (((regval) & SBSDIO_AVBITS) == SBSDIO_AVBITS)
51#define SBSDIO_ALPONLY(regval) (SBSDIO_ALPAV(regval) && !SBSDIO_HTAV(regval))
52#define SBSDIO_CLKAV(regval, alponly) \
53 (SBSDIO_ALPAV(regval) && (alponly ? 1 : SBSDIO_HTAV(regval)))
54
31struct chip_info { 55struct chip_info {
32 u32 chip; 56 u32 chip;
33 u32 chiprev; 57 u32 chiprev;