diff options
author | Franky Lin <frankyl@broadcom.com> | 2011-11-04 17:23:29 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-11-09 16:13:56 -0500 |
commit | e63ac6b888eed345f5b93751649515d6436abed2 (patch) | |
tree | e52ae8f6db00cb2058b377f2852f08270e318946 /drivers/net/wireless/brcm80211 | |
parent | a83369b6e1e7285edd5217601a0618b9a43bdc4b (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.c | 73 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c | 52 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h | 24 |
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 | ||
109 | static int | ||
110 | brcmf_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 | |||
109 | int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, | 157 | int 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 | |||
31 | struct chip_info { | 55 | struct chip_info { |
32 | u32 chip; | 56 | u32 chip; |
33 | u32 chiprev; | 57 | u32 chiprev; |