diff options
author | Richard Purdie <rpurdie@rpsys.net> | 2005-11-08 14:15:43 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2005-11-08 14:15:43 -0500 |
commit | a63ae4427c6af66d6eda26e5da8fed53f8fbede3 (patch) | |
tree | cb30bd5993c07bae7f66564713292d8b224d591f /arch/arm/mach-pxa/spitz.c | |
parent | 1d23b65de54c35844e82bdb08bc85d8142e310ea (diff) |
[ARM] 3093/1: SharpSL PCMCIA Updates for Cxx00 models
Patch from Richard Purdie
The Sharp SL-Cxx00 models have a combined power control for the SD
and CF slot 0. This patch adds hooks to the scoop driver to allow
machines to provide a custom control function for this and such a
function is added for spitz/akita/borzoi.
It also moves the gpio init code into the machine files as this
is machine dependent and differs between some models. A couple of
warnings when compiling for collie are also fixed.
Signed-off-by: Richard Purdie
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-pxa/spitz.c')
-rw-r--r-- | arch/arm/mach-pxa/spitz.c | 95 |
1 files changed, 76 insertions, 19 deletions
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 6c6878cd2207..4e9a699ee428 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -104,6 +104,66 @@ struct platform_device spitzscoop2_device = { | |||
104 | .resource = spitz_scoop2_resources, | 104 | .resource = spitz_scoop2_resources, |
105 | }; | 105 | }; |
106 | 106 | ||
107 | #define SPITZ_PWR_SD 0x01 | ||
108 | #define SPITZ_PWR_CF 0x02 | ||
109 | |||
110 | /* Power control is shared with between one of the CF slots and SD */ | ||
111 | static void spitz_card_pwr_ctrl(int device, unsigned short new_cpr) | ||
112 | { | ||
113 | unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR); | ||
114 | |||
115 | if (new_cpr & 0x0007) { | ||
116 | set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); | ||
117 | if (!(cpr & 0x0002) && !(cpr & 0x0004)) | ||
118 | mdelay(5); | ||
119 | if (device == SPITZ_PWR_CF) | ||
120 | cpr |= 0x0002; | ||
121 | if (device == SPITZ_PWR_SD) | ||
122 | cpr |= 0x0004; | ||
123 | write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr); | ||
124 | } else { | ||
125 | if (device == SPITZ_PWR_CF) | ||
126 | cpr &= ~0x0002; | ||
127 | if (device == SPITZ_PWR_SD) | ||
128 | cpr &= ~0x0004; | ||
129 | write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | new_cpr); | ||
130 | if (!(cpr & 0x0002) && !(cpr & 0x0004)) { | ||
131 | mdelay(1); | ||
132 | reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); | ||
133 | } | ||
134 | } | ||
135 | } | ||
136 | |||
137 | static void spitz_pcmcia_init(void) | ||
138 | { | ||
139 | /* Setup default state of GPIO outputs | ||
140 | before we enable them as outputs. */ | ||
141 | GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | | ||
142 | GPIO_bit(GPIO49_nPWE) | GPIO_bit(GPIO50_nPIOR) | | ||
143 | GPIO_bit(GPIO51_nPIOW) | GPIO_bit(GPIO54_nPCE_2); | ||
144 | GPSR(GPIO85_nPCE_1) = GPIO_bit(GPIO85_nPCE_1); | ||
145 | |||
146 | pxa_gpio_mode(GPIO48_nPOE_MD); | ||
147 | pxa_gpio_mode(GPIO49_nPWE_MD); | ||
148 | pxa_gpio_mode(GPIO50_nPIOR_MD); | ||
149 | pxa_gpio_mode(GPIO51_nPIOW_MD); | ||
150 | pxa_gpio_mode(GPIO55_nPREG_MD); | ||
151 | pxa_gpio_mode(GPIO56_nPWAIT_MD); | ||
152 | pxa_gpio_mode(GPIO57_nIOIS16_MD); | ||
153 | pxa_gpio_mode(GPIO85_nPCE_1_MD); | ||
154 | pxa_gpio_mode(GPIO54_nPCE_2_MD); | ||
155 | pxa_gpio_mode(GPIO104_pSKTSEL_MD); | ||
156 | } | ||
157 | |||
158 | static void spitz_pcmcia_pwr(struct device *scoop, unsigned short cpr, int nr) | ||
159 | { | ||
160 | /* Only need to override behaviour for slot 0 */ | ||
161 | if (nr == 0) | ||
162 | spitz_card_pwr_ctrl(SPITZ_PWR_CF, cpr); | ||
163 | else | ||
164 | write_scoop_reg(scoop, SCOOP_CPR, cpr); | ||
165 | } | ||
166 | |||
107 | static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = { | 167 | static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = { |
108 | { | 168 | { |
109 | .dev = &spitzscoop_device.dev, | 169 | .dev = &spitzscoop_device.dev, |
@@ -117,6 +177,16 @@ static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = { | |||
117 | }, | 177 | }, |
118 | }; | 178 | }; |
119 | 179 | ||
180 | static struct scoop_pcmcia_config spitz_pcmcia_config = { | ||
181 | .devs = &spitz_pcmcia_scoop[0], | ||
182 | .num_devs = 2, | ||
183 | .pcmcia_init = spitz_pcmcia_init, | ||
184 | .power_ctrl = spitz_pcmcia_pwr, | ||
185 | }; | ||
186 | |||
187 | EXPORT_SYMBOL(spitzscoop_device); | ||
188 | EXPORT_SYMBOL(spitzscoop2_device); | ||
189 | |||
120 | 190 | ||
121 | /* | 191 | /* |
122 | * Spitz SSP Device | 192 | * Spitz SSP Device |
@@ -235,27 +305,14 @@ static int spitz_mci_init(struct device *dev, irqreturn_t (*spitz_detect_int)(in | |||
235 | return 0; | 305 | return 0; |
236 | } | 306 | } |
237 | 307 | ||
238 | /* Power control is shared with one of the CF slots so we have a mess */ | ||
239 | static void spitz_mci_setpower(struct device *dev, unsigned int vdd) | 308 | static void spitz_mci_setpower(struct device *dev, unsigned int vdd) |
240 | { | 309 | { |
241 | struct pxamci_platform_data* p_d = dev->platform_data; | 310 | struct pxamci_platform_data* p_d = dev->platform_data; |
242 | 311 | ||
243 | unsigned short cpr = read_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR); | 312 | if (( 1 << vdd) & p_d->ocr_mask) |
244 | 313 | spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0004); | |
245 | if (( 1 << vdd) & p_d->ocr_mask) { | 314 | else |
246 | /* printk(KERN_DEBUG "%s: on\n", __FUNCTION__); */ | 315 | spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0000); |
247 | set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); | ||
248 | mdelay(2); | ||
249 | write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr | 0x04); | ||
250 | } else { | ||
251 | /* printk(KERN_DEBUG "%s: off\n", __FUNCTION__); */ | ||
252 | write_scoop_reg(&spitzscoop_device.dev, SCOOP_CPR, cpr & ~0x04); | ||
253 | |||
254 | if (!(cpr | 0x02)) { | ||
255 | mdelay(1); | ||
256 | reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_CF_POWER); | ||
257 | } | ||
258 | } | ||
259 | } | 316 | } |
260 | 317 | ||
261 | static int spitz_mci_get_ro(struct device *dev) | 318 | static int spitz_mci_get_ro(struct device *dev) |
@@ -351,8 +408,8 @@ static void __init common_init(void) | |||
351 | 408 | ||
352 | static void __init spitz_init(void) | 409 | static void __init spitz_init(void) |
353 | { | 410 | { |
354 | scoop_num = 2; | 411 | platform_scoop_config = &spitz_pcmcia_config; |
355 | scoop_devs = &spitz_pcmcia_scoop[0]; | 412 | |
356 | spitz_bl_machinfo.set_bl_intensity = spitz_bl_set_intensity; | 413 | spitz_bl_machinfo.set_bl_intensity = spitz_bl_set_intensity; |
357 | 414 | ||
358 | common_init(); | 415 | common_init(); |