diff options
author | Manuel Lauss <manuel.lauss@googlemail.com> | 2011-11-10 07:03:26 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2011-12-07 17:02:06 -0500 |
commit | 64cd04d0cffa3b3af0e81aa3112b71f135739e1a (patch) | |
tree | 7c66ce3a94ae3cc638a88fd2e55a86bcaf760880 /drivers/pcmcia | |
parent | 809f36c6f4a0568178c909ff1096ca83eae33f7d (diff) |
MIPS: Alchemy: Basic support for the DB1300 board.
Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com>
To: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2867/
Patchwork: https://patchwork.linux-mips.org/patch/2919/
Patchwork: https://patchwork.linux-mips.org/patch/2928/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/Kconfig | 4 | ||||
-rw-r--r-- | drivers/pcmcia/db1xxx_ss.c | 26 |
2 files changed, 24 insertions, 6 deletions
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index c022b5cedcf9..f9e3fb3a285b 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
@@ -161,8 +161,8 @@ config PCMCIA_ALCHEMY_DEVBOARD | |||
161 | select 64BIT_PHYS_ADDR | 161 | select 64BIT_PHYS_ADDR |
162 | help | 162 | help |
163 | Enable this driver of you want PCMCIA support on your Alchemy | 163 | Enable this driver of you want PCMCIA support on your Alchemy |
164 | Db1000, Db/Pb1100, Db/Pb1500, Db/Pb1550, Db/Pb1200 board. | 164 | Db1000, Db/Pb1100, Db/Pb1500, Db/Pb1550, Db/Pb1200, DB1300 |
165 | NOT suitable for the PB1000! | 165 | board. NOT suitable for the PB1000! |
166 | 166 | ||
167 | This driver is also available as a module called db1xxx_ss.ko | 167 | This driver is also available as a module called db1xxx_ss.ko |
168 | 168 | ||
diff --git a/drivers/pcmcia/db1xxx_ss.c b/drivers/pcmcia/db1xxx_ss.c index 3e49df6d5e3b..5b7c22784aff 100644 --- a/drivers/pcmcia/db1xxx_ss.c +++ b/drivers/pcmcia/db1xxx_ss.c | |||
@@ -7,7 +7,7 @@ | |||
7 | 7 | ||
8 | /* This is a fairly generic PCMCIA socket driver suitable for the | 8 | /* This is a fairly generic PCMCIA socket driver suitable for the |
9 | * following Alchemy Development boards: | 9 | * following Alchemy Development boards: |
10 | * Db1000, Db/Pb1500, Db/Pb1100, Db/Pb1550, Db/Pb1200. | 10 | * Db1000, Db/Pb1500, Db/Pb1100, Db/Pb1550, Db/Pb1200, Db1300 |
11 | * | 11 | * |
12 | * The Db1000 is used as a reference: Per-socket card-, carddetect- and | 12 | * The Db1000 is used as a reference: Per-socket card-, carddetect- and |
13 | * statuschange IRQs connected to SoC GPIOs, control and status register | 13 | * statuschange IRQs connected to SoC GPIOs, control and status register |
@@ -18,6 +18,7 @@ | |||
18 | * - Pb1100/Pb1500: single socket only; voltage key bits VS are | 18 | * - Pb1100/Pb1500: single socket only; voltage key bits VS are |
19 | * at STATUS[5:4] (instead of STATUS[1:0]). | 19 | * at STATUS[5:4] (instead of STATUS[1:0]). |
20 | * - Au1200-based: additional card-eject irqs, irqs not gpios! | 20 | * - Au1200-based: additional card-eject irqs, irqs not gpios! |
21 | * - Db1300: Db1200-like, no pwr ctrl, single socket (#1). | ||
21 | */ | 22 | */ |
22 | 23 | ||
23 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
@@ -59,11 +60,17 @@ struct db1x_pcmcia_sock { | |||
59 | #define BOARD_TYPE_DEFAULT 0 /* most boards */ | 60 | #define BOARD_TYPE_DEFAULT 0 /* most boards */ |
60 | #define BOARD_TYPE_DB1200 1 /* IRQs aren't gpios */ | 61 | #define BOARD_TYPE_DB1200 1 /* IRQs aren't gpios */ |
61 | #define BOARD_TYPE_PB1100 2 /* VS bits slightly different */ | 62 | #define BOARD_TYPE_PB1100 2 /* VS bits slightly different */ |
63 | #define BOARD_TYPE_DB1300 3 /* no power control */ | ||
62 | int board_type; | 64 | int board_type; |
63 | }; | 65 | }; |
64 | 66 | ||
65 | #define to_db1x_socket(x) container_of(x, struct db1x_pcmcia_sock, socket) | 67 | #define to_db1x_socket(x) container_of(x, struct db1x_pcmcia_sock, socket) |
66 | 68 | ||
69 | static int db1300_card_inserted(struct db1x_pcmcia_sock *sock) | ||
70 | { | ||
71 | return bcsr_read(BCSR_SIGSTAT) & (1 << 8); | ||
72 | } | ||
73 | |||
67 | /* DB/PB1200: check CPLD SIGSTATUS register bit 10/12 */ | 74 | /* DB/PB1200: check CPLD SIGSTATUS register bit 10/12 */ |
68 | static int db1200_card_inserted(struct db1x_pcmcia_sock *sock) | 75 | static int db1200_card_inserted(struct db1x_pcmcia_sock *sock) |
69 | { | 76 | { |
@@ -84,6 +91,8 @@ static int db1x_card_inserted(struct db1x_pcmcia_sock *sock) | |||
84 | switch (sock->board_type) { | 91 | switch (sock->board_type) { |
85 | case BOARD_TYPE_DB1200: | 92 | case BOARD_TYPE_DB1200: |
86 | return db1200_card_inserted(sock); | 93 | return db1200_card_inserted(sock); |
94 | case BOARD_TYPE_DB1300: | ||
95 | return db1300_card_inserted(sock); | ||
87 | default: | 96 | default: |
88 | return db1000_card_inserted(sock); | 97 | return db1000_card_inserted(sock); |
89 | } | 98 | } |
@@ -160,7 +169,8 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock) | |||
160 | * ejection handler have been registered and the currently | 169 | * ejection handler have been registered and the currently |
161 | * active one disabled. | 170 | * active one disabled. |
162 | */ | 171 | */ |
163 | if (sock->board_type == BOARD_TYPE_DB1200) { | 172 | if ((sock->board_type == BOARD_TYPE_DB1200) || |
173 | (sock->board_type == BOARD_TYPE_DB1300)) { | ||
164 | ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq, | 174 | ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq, |
165 | IRQF_DISABLED, "pcmcia_insert", sock); | 175 | IRQF_DISABLED, "pcmcia_insert", sock); |
166 | if (ret) | 176 | if (ret) |
@@ -174,7 +184,7 @@ static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock) | |||
174 | } | 184 | } |
175 | 185 | ||
176 | /* enable the currently silent one */ | 186 | /* enable the currently silent one */ |
177 | if (db1200_card_inserted(sock)) | 187 | if (db1x_card_inserted(sock)) |
178 | enable_irq(sock->eject_irq); | 188 | enable_irq(sock->eject_irq); |
179 | else | 189 | else |
180 | enable_irq(sock->insert_irq); | 190 | enable_irq(sock->insert_irq); |
@@ -270,7 +280,8 @@ static int db1x_pcmcia_configure(struct pcmcia_socket *skt, | |||
270 | } | 280 | } |
271 | 281 | ||
272 | /* create new voltage code */ | 282 | /* create new voltage code */ |
273 | cr_set |= ((v << 2) | p) << (sock->nr * 8); | 283 | if (sock->board_type != BOARD_TYPE_DB1300) |
284 | cr_set |= ((v << 2) | p) << (sock->nr * 8); | ||
274 | 285 | ||
275 | changed = state->flags ^ sock->old_flags; | 286 | changed = state->flags ^ sock->old_flags; |
276 | 287 | ||
@@ -343,6 +354,10 @@ static int db1x_pcmcia_get_status(struct pcmcia_socket *skt, | |||
343 | /* if Vcc is not zero, we have applied power to a card */ | 354 | /* if Vcc is not zero, we have applied power to a card */ |
344 | status |= GET_VCC(cr, sock->nr) ? SS_POWERON : 0; | 355 | status |= GET_VCC(cr, sock->nr) ? SS_POWERON : 0; |
345 | 356 | ||
357 | /* DB1300: power always on, but don't tell when no card present */ | ||
358 | if ((sock->board_type == BOARD_TYPE_DB1300) && (status & SS_DETECT)) | ||
359 | status = SS_POWERON | SS_3VCARD | SS_DETECT; | ||
360 | |||
346 | /* reset de-asserted? then we're ready */ | 361 | /* reset de-asserted? then we're ready */ |
347 | status |= (GET_RESET(cr, sock->nr)) ? SS_READY : SS_RESET; | 362 | status |= (GET_RESET(cr, sock->nr)) ? SS_READY : SS_RESET; |
348 | 363 | ||
@@ -419,6 +434,9 @@ static int __devinit db1x_pcmcia_socket_probe(struct platform_device *pdev) | |||
419 | case BCSR_WHOAMI_PB1200 ... BCSR_WHOAMI_DB1200: | 434 | case BCSR_WHOAMI_PB1200 ... BCSR_WHOAMI_DB1200: |
420 | sock->board_type = BOARD_TYPE_DB1200; | 435 | sock->board_type = BOARD_TYPE_DB1200; |
421 | break; | 436 | break; |
437 | case BCSR_WHOAMI_DB1300: | ||
438 | sock->board_type = BOARD_TYPE_DB1300; | ||
439 | break; | ||
422 | default: | 440 | default: |
423 | printk(KERN_INFO "db1xxx-ss: unknown board %d!\n", bid); | 441 | printk(KERN_INFO "db1xxx-ss: unknown board %d!\n", bid); |
424 | ret = -ENODEV; | 442 | ret = -ENODEV; |