diff options
author | Manuel Lauss <manuel.lauss@googlemail.com> | 2009-10-04 08:55:27 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2010-02-27 06:52:51 -0500 |
commit | 66213b3ccfc770704025ce9465fa3aaedde21b55 (patch) | |
tree | 2f74c1819b371926952c9c5b8f98ae808588e728 /drivers/pcmcia/au1000_pb1x00.c | |
parent | 7e50b2b741bb4f9dbddc9f56972ef82a7d4b33ed (diff) |
MIPS: PCMCIA: new socket driver for Au1000 demoboards.
New PCMCIA socket driver for all Db/Pb1xxx boards (except Pb1000),
which replaces au1000_db1x00.c and (most of) au1000_pb1x00.c.
Notable improvements:
- supports Db1000, DB/PB1100/1500/1550/1200.
- support for carddetect and statuschange IRQs.
- pcmcia socket mem/io/attr areas and irqs passed through
platform resource information.
- doesn't freeze system during card insertion/ejection like
the one it replaces.
- boardtype is automatically detected using BCSR ID register.
Run-tested on the DB1200.
Cc: Linux-PCMCIA <linux-pcmcia@lists.infradead.org>
Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'drivers/pcmcia/au1000_pb1x00.c')
-rw-r--r-- | drivers/pcmcia/au1000_pb1x00.c | 119 |
1 files changed, 1 insertions, 118 deletions
diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c index b1984ed72d1d..5a979cb8f3e6 100644 --- a/drivers/pcmcia/au1000_pb1x00.c +++ b/drivers/pcmcia/au1000_pb1x00.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * Alchemy Semi Pb1x00 boards specific pcmcia routines. | 3 | * Alchemy Semi Pb1000 boards specific pcmcia routines. |
4 | * | 4 | * |
5 | * Copyright 2002 MontaVista Software Inc. | 5 | * Copyright 2002 MontaVista Software Inc. |
6 | * Author: MontaVista Software, Inc. | 6 | * Author: MontaVista Software, Inc. |
@@ -46,20 +46,11 @@ | |||
46 | 46 | ||
47 | #define debug(fmt, arg...) do { } while (0) | 47 | #define debug(fmt, arg...) do { } while (0) |
48 | 48 | ||
49 | #ifdef CONFIG_MIPS_PB1000 | ||
50 | #include <asm/pb1000.h> | 49 | #include <asm/pb1000.h> |
51 | #define PCMCIA_IRQ AU1000_GPIO_15 | 50 | #define PCMCIA_IRQ AU1000_GPIO_15 |
52 | #elif defined (CONFIG_MIPS_PB1500) | ||
53 | #include <asm/pb1500.h> | ||
54 | #define PCMCIA_IRQ AU1500_GPIO_203 | ||
55 | #elif defined (CONFIG_MIPS_PB1100) | ||
56 | #include <asm/pb1100.h> | ||
57 | #define PCMCIA_IRQ AU1000_GPIO_11 | ||
58 | #endif | ||
59 | 51 | ||
60 | static int pb1x00_pcmcia_init(struct pcmcia_init *init) | 52 | static int pb1x00_pcmcia_init(struct pcmcia_init *init) |
61 | { | 53 | { |
62 | #ifdef CONFIG_MIPS_PB1000 | ||
63 | u16 pcr; | 54 | u16 pcr; |
64 | pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; | 55 | pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; |
65 | 56 | ||
@@ -74,21 +65,10 @@ static int pb1x00_pcmcia_init(struct pcmcia_init *init) | |||
74 | au_sync_delay(20); | 65 | au_sync_delay(20); |
75 | 66 | ||
76 | return PCMCIA_NUM_SOCKS; | 67 | return PCMCIA_NUM_SOCKS; |
77 | |||
78 | #else /* fixme -- take care of the Pb1500 at some point */ | ||
79 | |||
80 | u16 pcr; | ||
81 | pcr = au_readw(PCMCIA_BOARD_REG) & ~0xf; /* turn off power */ | ||
82 | pcr &= ~(PC_DEASSERT_RST | PC_DRV_EN); | ||
83 | au_writew(pcr, PCMCIA_BOARD_REG); | ||
84 | au_sync_delay(500); | ||
85 | return PCMCIA_NUM_SOCKS; | ||
86 | #endif | ||
87 | } | 68 | } |
88 | 69 | ||
89 | static int pb1x00_pcmcia_shutdown(void) | 70 | static int pb1x00_pcmcia_shutdown(void) |
90 | { | 71 | { |
91 | #ifdef CONFIG_MIPS_PB1000 | ||
92 | u16 pcr; | 72 | u16 pcr; |
93 | pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; | 73 | pcr = PCR_SLOT_0_RST | PCR_SLOT_1_RST; |
94 | pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,0); | 74 | pcr |= SET_VCC_VPP(VCC_HIZ,VPP_HIZ,0); |
@@ -96,14 +76,6 @@ static int pb1x00_pcmcia_shutdown(void) | |||
96 | au_writel(pcr, PB1000_PCR); | 76 | au_writel(pcr, PB1000_PCR); |
97 | au_sync_delay(20); | 77 | au_sync_delay(20); |
98 | return 0; | 78 | return 0; |
99 | #else | ||
100 | u16 pcr; | ||
101 | pcr = au_readw(PCMCIA_BOARD_REG) & ~0xf; /* turn off power */ | ||
102 | pcr &= ~(PC_DEASSERT_RST | PC_DRV_EN); | ||
103 | au_writew(pcr, PCMCIA_BOARD_REG); | ||
104 | au_sync_delay(2); | ||
105 | return 0; | ||
106 | #endif | ||
107 | } | 79 | } |
108 | 80 | ||
109 | static int | 81 | static int |
@@ -112,21 +84,11 @@ pb1x00_pcmcia_socket_state(unsigned sock, struct pcmcia_state *state) | |||
112 | u32 inserted0, inserted1; | 84 | u32 inserted0, inserted1; |
113 | u16 vs0, vs1; | 85 | u16 vs0, vs1; |
114 | 86 | ||
115 | #ifdef CONFIG_MIPS_PB1000 | ||
116 | vs0 = vs1 = (u16)au_readl(PB1000_ACR1); | 87 | vs0 = vs1 = (u16)au_readl(PB1000_ACR1); |
117 | inserted0 = !(vs0 & (ACR1_SLOT_0_CD1 | ACR1_SLOT_0_CD2)); | 88 | inserted0 = !(vs0 & (ACR1_SLOT_0_CD1 | ACR1_SLOT_0_CD2)); |
118 | inserted1 = !(vs1 & (ACR1_SLOT_1_CD1 | ACR1_SLOT_1_CD2)); | 89 | inserted1 = !(vs1 & (ACR1_SLOT_1_CD1 | ACR1_SLOT_1_CD2)); |
119 | vs0 = (vs0 >> 4) & 0x3; | 90 | vs0 = (vs0 >> 4) & 0x3; |
120 | vs1 = (vs1 >> 12) & 0x3; | 91 | vs1 = (vs1 >> 12) & 0x3; |
121 | #else | ||
122 | vs0 = (au_readw(BOARD_STATUS_REG) >> 4) & 0x3; | ||
123 | #ifdef CONFIG_MIPS_PB1500 | ||
124 | inserted0 = !((au_readl(GPIO2_PINSTATE) >> 1) & 0x1); /* gpio 201 */ | ||
125 | #else /* Pb1100 */ | ||
126 | inserted0 = !((au_readl(SYS_PINSTATERD) >> 9) & 0x1); /* gpio 9 */ | ||
127 | #endif | ||
128 | inserted1 = 0; | ||
129 | #endif | ||
130 | 92 | ||
131 | state->ready = 0; | 93 | state->ready = 0; |
132 | state->vs_Xv = 0; | 94 | state->vs_Xv = 0; |
@@ -203,7 +165,6 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) | |||
203 | 165 | ||
204 | if(configure->sock > PCMCIA_MAX_SOCK) return -1; | 166 | if(configure->sock > PCMCIA_MAX_SOCK) return -1; |
205 | 167 | ||
206 | #ifdef CONFIG_MIPS_PB1000 | ||
207 | pcr = au_readl(PB1000_PCR); | 168 | pcr = au_readl(PB1000_PCR); |
208 | 169 | ||
209 | if (configure->sock == 0) { | 170 | if (configure->sock == 0) { |
@@ -323,84 +284,6 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure) | |||
323 | au_writel(pcr, PB1000_PCR); | 284 | au_writel(pcr, PB1000_PCR); |
324 | au_sync_delay(300); | 285 | au_sync_delay(300); |
325 | 286 | ||
326 | #else | ||
327 | |||
328 | pcr = au_readw(PCMCIA_BOARD_REG) & ~0xf; | ||
329 | |||
330 | debug("Vcc %dV Vpp %dV, pcr %x, reset %d\n", | ||
331 | configure->vcc, configure->vpp, pcr, configure->reset); | ||
332 | |||
333 | |||
334 | switch(configure->vcc){ | ||
335 | case 0: /* Vcc 0 */ | ||
336 | pcr |= SET_VCC_VPP(0,0); | ||
337 | break; | ||
338 | case 50: /* Vcc 5V */ | ||
339 | switch(configure->vpp) { | ||
340 | case 0: | ||
341 | pcr |= SET_VCC_VPP(2,0); | ||
342 | break; | ||
343 | case 50: | ||
344 | pcr |= SET_VCC_VPP(2,1); | ||
345 | break; | ||
346 | case 12: | ||
347 | pcr |= SET_VCC_VPP(2,2); | ||
348 | break; | ||
349 | case 33: | ||
350 | default: | ||
351 | pcr |= SET_VCC_VPP(0,0); | ||
352 | printk("%s: bad Vcc/Vpp (%d:%d)\n", | ||
353 | __func__, | ||
354 | configure->vcc, | ||
355 | configure->vpp); | ||
356 | break; | ||
357 | } | ||
358 | break; | ||
359 | case 33: /* Vcc 3.3V */ | ||
360 | switch(configure->vpp) { | ||
361 | case 0: | ||
362 | pcr |= SET_VCC_VPP(1,0); | ||
363 | break; | ||
364 | case 12: | ||
365 | pcr |= SET_VCC_VPP(1,2); | ||
366 | break; | ||
367 | case 33: | ||
368 | pcr |= SET_VCC_VPP(1,1); | ||
369 | break; | ||
370 | case 50: | ||
371 | default: | ||
372 | pcr |= SET_VCC_VPP(0,0); | ||
373 | printk("%s: bad Vcc/Vpp (%d:%d)\n", | ||
374 | __func__, | ||
375 | configure->vcc, | ||
376 | configure->vpp); | ||
377 | break; | ||
378 | } | ||
379 | break; | ||
380 | default: /* what's this ? */ | ||
381 | pcr |= SET_VCC_VPP(0,0); | ||
382 | printk(KERN_ERR "%s: bad Vcc %d\n", | ||
383 | __func__, configure->vcc); | ||
384 | break; | ||
385 | } | ||
386 | |||
387 | au_writew(pcr, PCMCIA_BOARD_REG); | ||
388 | au_sync_delay(300); | ||
389 | |||
390 | if (!configure->reset) { | ||
391 | pcr |= PC_DRV_EN; | ||
392 | au_writew(pcr, PCMCIA_BOARD_REG); | ||
393 | au_sync_delay(100); | ||
394 | pcr |= PC_DEASSERT_RST; | ||
395 | au_writew(pcr, PCMCIA_BOARD_REG); | ||
396 | au_sync_delay(100); | ||
397 | } | ||
398 | else { | ||
399 | pcr &= ~(PC_DEASSERT_RST | PC_DRV_EN); | ||
400 | au_writew(pcr, PCMCIA_BOARD_REG); | ||
401 | au_sync_delay(100); | ||
402 | } | ||
403 | #endif | ||
404 | return 0; | 287 | return 0; |
405 | } | 288 | } |
406 | 289 | ||