aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@rpsys.net>2006-01-05 15:44:57 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2006-01-05 15:44:57 -0500
commit945b957972844881002ab4f68534581f4427a30b (patch)
tree0b9a1deb5094b847ce943b8f101386f373f472c6 /drivers/pcmcia
parent53b7c2b243bd31f857dddabd9339f2dd6ae3fb67 (diff)
[ARM] 3230/1: Sharp Scoop: Fix Shared Power Control Issues
Patch from Richard Purdie The SL-Cxx00 devices have a power control register in SCOOP that is shared by both CF and MMC/SD card slots. The CF reset code was resetting this register leading to various lockups as the MMC power was suddenly lost. This patch handles the CPR register in a more sensitive manner. It also removes some unneeded collie specific calls as the reset code handles this. Signed-off-by: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r--drivers/pcmcia/pxa2xx_sharpsl.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c
index 56c58831e80e..4fbd995360b0 100644
--- a/drivers/pcmcia/pxa2xx_sharpsl.c
+++ b/drivers/pcmcia/pxa2xx_sharpsl.c
@@ -36,9 +36,18 @@
36struct scoop_pcmcia_config *platform_scoop_config; 36struct scoop_pcmcia_config *platform_scoop_config;
37#define SCOOP_DEV platform_scoop_config->devs 37#define SCOOP_DEV platform_scoop_config->devs
38 38
39static void sharpsl_pcmcia_init_reset(struct scoop_pcmcia_dev *scoopdev) 39static void sharpsl_pcmcia_init_reset(struct soc_pcmcia_socket *skt)
40{ 40{
41 struct scoop_pcmcia_dev *scoopdev = &SCOOP_DEV[skt->nr];
42
41 reset_scoop(scoopdev->dev); 43 reset_scoop(scoopdev->dev);
44
45 /* Shared power controls need to be handled carefully */
46 if (platform_scoop_config->power_ctrl)
47 platform_scoop_config->power_ctrl(scoopdev->dev, 0x0000, skt->nr);
48 else
49 write_scoop_reg(scoopdev->dev, SCOOP_CPR, 0x0000);
50
42 scoopdev->keep_vs = NO_KEEP_VS; 51 scoopdev->keep_vs = NO_KEEP_VS;
43 scoopdev->keep_rd = 0; 52 scoopdev->keep_rd = 0;
44} 53}
@@ -208,26 +217,17 @@ static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
208 217
209static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt) 218static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
210{ 219{
211 sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]); 220 sharpsl_pcmcia_init_reset(skt);
212 221
213 /* Enable interrupt */ 222 /* Enable interrupt */
214 write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0); 223 write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0);
215 write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101); 224 write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101);
216 SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; 225 SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS;
217
218 if (machine_is_collie())
219 /* We need to disable SS_OUTPUT_ENA here. */
220 write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080);
221} 226}
222 227
223static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) 228static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
224{ 229{
225 /* CF_BUS_OFF */ 230 sharpsl_pcmcia_init_reset(skt);
226 sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]);
227
228 if (machine_is_collie())
229 /* We need to disable SS_OUTPUT_ENA here. */
230 write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080);
231} 231}
232 232
233static struct pcmcia_low_level sharpsl_pcmcia_ops = { 233static struct pcmcia_low_level sharpsl_pcmcia_ops = {