diff options
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/Kconfig | 2 | ||||
-rw-r--r-- | drivers/pcmcia/Makefile | 6 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_db1x00.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_generic.h | 2 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_pb1x00.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_xxs1500.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/cistpl.c | 12 | ||||
-rw-r--r-- | drivers/pcmcia/cs.c | 12 | ||||
-rw-r--r-- | drivers/pcmcia/ds.c | 3 | ||||
-rw-r--r-- | drivers/pcmcia/i82365.c | 21 | ||||
-rw-r--r-- | drivers/pcmcia/m8xx_pcmcia.c | 24 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_sharpsl.c | 140 |
12 files changed, 107 insertions, 120 deletions
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index ccf20039e909..309eb557f9a3 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
@@ -156,7 +156,7 @@ config TCIC | |||
156 | 156 | ||
157 | config PCMCIA_M8XX | 157 | config PCMCIA_M8XX |
158 | tristate "MPC8xx PCMCIA support" | 158 | tristate "MPC8xx PCMCIA support" |
159 | depends on PCMCIA && PPC | 159 | depends on PCMCIA && PPC && 8xx |
160 | select PCCARD_NONSTATIC | 160 | select PCCARD_NONSTATIC |
161 | help | 161 | help |
162 | Say Y here to include support for PowerPC 8xx series PCMCIA | 162 | Say Y here to include support for PowerPC 8xx series PCMCIA |
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile index fe37541abbfe..bcecf5133b7e 100644 --- a/drivers/pcmcia/Makefile +++ b/drivers/pcmcia/Makefile | |||
@@ -25,7 +25,7 @@ obj-$(CONFIG_PD6729) += pd6729.o | |||
25 | obj-$(CONFIG_I82365) += i82365.o | 25 | obj-$(CONFIG_I82365) += i82365.o |
26 | obj-$(CONFIG_I82092) += i82092.o | 26 | obj-$(CONFIG_I82092) += i82092.o |
27 | obj-$(CONFIG_TCIC) += tcic.o | 27 | obj-$(CONFIG_TCIC) += tcic.o |
28 | obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o | 28 | obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o |
29 | obj-$(CONFIG_HD64465_PCMCIA) += hd64465_ss.o | 29 | obj-$(CONFIG_HD64465_PCMCIA) += hd64465_ss.o |
30 | obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o | 30 | obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o |
31 | obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_core.o sa1111_cs.o | 31 | obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_core.o sa1111_cs.o |
@@ -47,10 +47,10 @@ au1x00_ss-$(CONFIG_MIPS_PB1200) += au1000_db1x00.o | |||
47 | au1x00_ss-$(CONFIG_MIPS_PB1500) += au1000_pb1x00.o | 47 | au1x00_ss-$(CONFIG_MIPS_PB1500) += au1000_pb1x00.o |
48 | au1x00_ss-$(CONFIG_MIPS_DB1000) += au1000_db1x00.o | 48 | au1x00_ss-$(CONFIG_MIPS_DB1000) += au1000_db1x00.o |
49 | au1x00_ss-$(CONFIG_MIPS_DB1100) += au1000_db1x00.o | 49 | au1x00_ss-$(CONFIG_MIPS_DB1100) += au1000_db1x00.o |
50 | au1x00_ss-$(CONFIG_MIPS_DB1200) += au1000_db1x00.o | 50 | au1x00_ss-$(CONFIG_MIPS_DB1200) += au1000_db1x00.o |
51 | au1x00_ss-$(CONFIG_MIPS_DB1500) += au1000_db1x00.o | 51 | au1x00_ss-$(CONFIG_MIPS_DB1500) += au1000_db1x00.o |
52 | au1x00_ss-$(CONFIG_MIPS_DB1550) += au1000_db1x00.o | 52 | au1x00_ss-$(CONFIG_MIPS_DB1550) += au1000_db1x00.o |
53 | au1x00_ss-$(CONFIG_MIPS_XXS1500) += au1000_xxs1500.o | 53 | au1x00_ss-$(CONFIG_MIPS_XXS1500) += au1000_xxs1500.o |
54 | 54 | ||
55 | sa1111_cs-y += sa1111_generic.o | 55 | sa1111_cs-y += sa1111_generic.o |
56 | sa1111_cs-$(CONFIG_ASSABET_NEPONSET) += sa1100_neponset.o | 56 | sa1111_cs-$(CONFIG_ASSABET_NEPONSET) += sa1100_neponset.o |
diff --git a/drivers/pcmcia/au1000_db1x00.c b/drivers/pcmcia/au1000_db1x00.c index 24cfee1a412c..abc13f28ba3f 100644 --- a/drivers/pcmcia/au1000_db1x00.c +++ b/drivers/pcmcia/au1000_db1x00.c | |||
@@ -30,6 +30,7 @@ | |||
30 | * | 30 | * |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <linux/config.h> | ||
33 | #include <linux/module.h> | 34 | #include <linux/module.h> |
34 | #include <linux/kernel.h> | 35 | #include <linux/kernel.h> |
35 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
diff --git a/drivers/pcmcia/au1000_generic.h b/drivers/pcmcia/au1000_generic.h index b0e7908392a7..f2c970b5f4ff 100644 --- a/drivers/pcmcia/au1000_generic.h +++ b/drivers/pcmcia/au1000_generic.h | |||
@@ -22,6 +22,8 @@ | |||
22 | #define __ASM_AU1000_PCMCIA_H | 22 | #define __ASM_AU1000_PCMCIA_H |
23 | 23 | ||
24 | /* include the world */ | 24 | /* include the world */ |
25 | #include <linux/config.h> | ||
26 | |||
25 | #include <pcmcia/cs_types.h> | 27 | #include <pcmcia/cs_types.h> |
26 | #include <pcmcia/cs.h> | 28 | #include <pcmcia/cs.h> |
27 | #include <pcmcia/ss.h> | 29 | #include <pcmcia/ss.h> |
diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c index d414a3bb50b9..fd5522ede867 100644 --- a/drivers/pcmcia/au1000_pb1x00.c +++ b/drivers/pcmcia/au1000_pb1x00.c | |||
@@ -21,6 +21,7 @@ | |||
21 | * with this program; if not, write to the Free Software Foundation, Inc., | 21 | * with this program; if not, write to the Free Software Foundation, Inc., |
22 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | 22 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. |
23 | */ | 23 | */ |
24 | #include <linux/config.h> | ||
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
25 | #include <linux/init.h> | 26 | #include <linux/init.h> |
26 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
@@ -30,7 +31,6 @@ | |||
30 | #include <linux/timer.h> | 31 | #include <linux/timer.h> |
31 | #include <linux/mm.h> | 32 | #include <linux/mm.h> |
32 | #include <linux/proc_fs.h> | 33 | #include <linux/proc_fs.h> |
33 | #include <linux/version.h> | ||
34 | #include <linux/types.h> | 34 | #include <linux/types.h> |
35 | 35 | ||
36 | #include <pcmcia/cs_types.h> | 36 | #include <pcmcia/cs_types.h> |
diff --git a/drivers/pcmcia/au1000_xxs1500.c b/drivers/pcmcia/au1000_xxs1500.c index f113b69d699b..01874b0bb03b 100644 --- a/drivers/pcmcia/au1000_xxs1500.c +++ b/drivers/pcmcia/au1000_xxs1500.c | |||
@@ -27,7 +27,6 @@ | |||
27 | */ | 27 | */ |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/config.h> | ||
31 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
32 | #include <linux/ioport.h> | 31 | #include <linux/ioport.h> |
33 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
@@ -35,7 +34,6 @@ | |||
35 | #include <linux/timer.h> | 34 | #include <linux/timer.h> |
36 | #include <linux/mm.h> | 35 | #include <linux/mm.h> |
37 | #include <linux/proc_fs.h> | 36 | #include <linux/proc_fs.h> |
38 | #include <linux/version.h> | ||
39 | #include <linux/types.h> | 37 | #include <linux/types.h> |
40 | 38 | ||
41 | #include <pcmcia/cs_types.h> | 39 | #include <pcmcia/cs_types.h> |
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index 3afb682255a0..2dc3e611a9a3 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
@@ -334,10 +334,8 @@ void destroy_cis_cache(struct pcmcia_socket *s) | |||
334 | /* | 334 | /* |
335 | * If there was a fake CIS, destroy that as well. | 335 | * If there was a fake CIS, destroy that as well. |
336 | */ | 336 | */ |
337 | if (s->fake_cis) { | 337 | kfree(s->fake_cis); |
338 | kfree(s->fake_cis); | 338 | s->fake_cis = NULL; |
339 | s->fake_cis = NULL; | ||
340 | } | ||
341 | } | 339 | } |
342 | EXPORT_SYMBOL(destroy_cis_cache); | 340 | EXPORT_SYMBOL(destroy_cis_cache); |
343 | 341 | ||
@@ -386,10 +384,8 @@ int verify_cis_cache(struct pcmcia_socket *s) | |||
386 | 384 | ||
387 | int pcmcia_replace_cis(struct pcmcia_socket *s, cisdump_t *cis) | 385 | int pcmcia_replace_cis(struct pcmcia_socket *s, cisdump_t *cis) |
388 | { | 386 | { |
389 | if (s->fake_cis != NULL) { | 387 | kfree(s->fake_cis); |
390 | kfree(s->fake_cis); | 388 | s->fake_cis = NULL; |
391 | s->fake_cis = NULL; | ||
392 | } | ||
393 | if (cis->Length > CISTPL_MAX_CIS_SIZE) | 389 | if (cis->Length > CISTPL_MAX_CIS_SIZE) |
394 | return CS_BAD_SIZE; | 390 | return CS_BAD_SIZE; |
395 | s->fake_cis = kmalloc(cis->Length, GFP_KERNEL); | 391 | s->fake_cis = kmalloc(cis->Length, GFP_KERNEL); |
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index d5e76423a0ee..a30aa74304a2 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -331,10 +331,8 @@ static void shutdown_socket(struct pcmcia_socket *s) | |||
331 | cb_free(s); | 331 | cb_free(s); |
332 | #endif | 332 | #endif |
333 | s->functions = 0; | 333 | s->functions = 0; |
334 | if (s->config) { | 334 | kfree(s->config); |
335 | kfree(s->config); | 335 | s->config = NULL; |
336 | s->config = NULL; | ||
337 | } | ||
338 | 336 | ||
339 | { | 337 | { |
340 | int status; | 338 | int status; |
@@ -515,6 +513,11 @@ static int socket_insert(struct pcmcia_socket *skt) | |||
515 | ret = socket_setup(skt, setup_delay); | 513 | ret = socket_setup(skt, setup_delay); |
516 | if (ret == CS_SUCCESS) { | 514 | if (ret == CS_SUCCESS) { |
517 | skt->state |= SOCKET_PRESENT; | 515 | skt->state |= SOCKET_PRESENT; |
516 | |||
517 | printk(KERN_NOTICE "pccard: %s card inserted into slot %d\n", | ||
518 | (skt->state & SOCKET_CARDBUS) ? "CardBus" : "PCMCIA", | ||
519 | skt->sock); | ||
520 | |||
518 | #ifdef CONFIG_CARDBUS | 521 | #ifdef CONFIG_CARDBUS |
519 | if (skt->state & SOCKET_CARDBUS) { | 522 | if (skt->state & SOCKET_CARDBUS) { |
520 | cb_alloc(skt); | 523 | cb_alloc(skt); |
@@ -600,6 +603,7 @@ static int socket_resume(struct pcmcia_socket *skt) | |||
600 | 603 | ||
601 | static void socket_remove(struct pcmcia_socket *skt) | 604 | static void socket_remove(struct pcmcia_socket *skt) |
602 | { | 605 | { |
606 | printk(KERN_NOTICE "pccard: card ejected from slot %d\n", skt->sock); | ||
603 | socket_shutdown(skt); | 607 | socket_shutdown(skt); |
604 | cs_socket_put(skt); | 608 | cs_socket_put(skt); |
605 | } | 609 | } |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 39d096b52926..7f8219f3fd9e 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -544,6 +544,9 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f | |||
544 | list_add_tail(&p_dev->socket_device_list, &s->devices_list); | 544 | list_add_tail(&p_dev->socket_device_list, &s->devices_list); |
545 | spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); | 545 | spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); |
546 | 546 | ||
547 | printk(KERN_NOTICE "pcmcia: registering new device %s\n", | ||
548 | p_dev->devname); | ||
549 | |||
547 | pcmcia_device_query(p_dev); | 550 | pcmcia_device_query(p_dev); |
548 | 551 | ||
549 | if (device_register(&p_dev->dev)) { | 552 | if (device_register(&p_dev->dev)) { |
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index 7ce455d01cc9..4d56bc9926d6 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c | |||
@@ -1339,10 +1339,7 @@ static struct device_driver i82365_driver = { | |||
1339 | .resume = pcmcia_socket_dev_resume, | 1339 | .resume = pcmcia_socket_dev_resume, |
1340 | }; | 1340 | }; |
1341 | 1341 | ||
1342 | static struct platform_device i82365_device = { | 1342 | static struct platform_device *i82365_device; |
1343 | .name = "i82365", | ||
1344 | .id = 0, | ||
1345 | }; | ||
1346 | 1343 | ||
1347 | static int __init init_i82365(void) | 1344 | static int __init init_i82365(void) |
1348 | { | 1345 | { |
@@ -1352,7 +1349,14 @@ static int __init init_i82365(void) | |||
1352 | if (ret) | 1349 | if (ret) |
1353 | return ret; | 1350 | return ret; |
1354 | 1351 | ||
1355 | ret = platform_device_register(&i82365_device); | 1352 | i82365_device = platform_device_alloc("i82365", 0); |
1353 | if (i82365_device) { | ||
1354 | ret = platform_device_add(i82365_device); | ||
1355 | if (ret) | ||
1356 | platform_device_put(i82365_device); | ||
1357 | } else | ||
1358 | ret = -ENOMEM; | ||
1359 | |||
1356 | if (ret) { | 1360 | if (ret) { |
1357 | driver_unregister(&i82365_driver); | 1361 | driver_unregister(&i82365_driver); |
1358 | return ret; | 1362 | return ret; |
@@ -1365,7 +1369,8 @@ static int __init init_i82365(void) | |||
1365 | 1369 | ||
1366 | if (sockets == 0) { | 1370 | if (sockets == 0) { |
1367 | printk("not found.\n"); | 1371 | printk("not found.\n"); |
1368 | platform_device_unregister(&i82365_device); | 1372 | platform_device_unregister(i82365_device); |
1373 | release_region(i365_base, 2); | ||
1369 | driver_unregister(&i82365_driver); | 1374 | driver_unregister(&i82365_driver); |
1370 | return -ENODEV; | 1375 | return -ENODEV; |
1371 | } | 1376 | } |
@@ -1376,7 +1381,7 @@ static int __init init_i82365(void) | |||
1376 | 1381 | ||
1377 | /* register sockets with the pcmcia core */ | 1382 | /* register sockets with the pcmcia core */ |
1378 | for (i = 0; i < sockets; i++) { | 1383 | for (i = 0; i < sockets; i++) { |
1379 | socket[i].socket.dev.dev = &i82365_device.dev; | 1384 | socket[i].socket.dev.dev = &i82365_device->dev; |
1380 | socket[i].socket.ops = &pcic_operations; | 1385 | socket[i].socket.ops = &pcic_operations; |
1381 | socket[i].socket.resource_ops = &pccard_nonstatic_ops; | 1386 | socket[i].socket.resource_ops = &pccard_nonstatic_ops; |
1382 | socket[i].socket.owner = THIS_MODULE; | 1387 | socket[i].socket.owner = THIS_MODULE; |
@@ -1414,7 +1419,7 @@ static void __exit exit_i82365(void) | |||
1414 | if (socket[i].flags & IS_REGISTERED) | 1419 | if (socket[i].flags & IS_REGISTERED) |
1415 | pcmcia_unregister_socket(&socket[i].socket); | 1420 | pcmcia_unregister_socket(&socket[i].socket); |
1416 | } | 1421 | } |
1417 | platform_device_unregister(&i82365_device); | 1422 | platform_device_unregister(i82365_device); |
1418 | if (poll_interval != 0) | 1423 | if (poll_interval != 0) |
1419 | del_timer_sync(&poll_timer); | 1424 | del_timer_sync(&poll_timer); |
1420 | if (grab_irq != 0) | 1425 | if (grab_irq != 0) |
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index f8bed87cf2f1..6d9f71cfcb34 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c | |||
@@ -39,7 +39,6 @@ | |||
39 | 39 | ||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | #include <asm/bitops.h> | 41 | #include <asm/bitops.h> |
42 | #include <asm/segment.h> | ||
43 | #include <asm/system.h> | 42 | #include <asm/system.h> |
44 | 43 | ||
45 | #include <linux/kernel.h> | 44 | #include <linux/kernel.h> |
@@ -50,6 +49,7 @@ | |||
50 | #include <linux/ioport.h> | 49 | #include <linux/ioport.h> |
51 | #include <linux/delay.h> | 50 | #include <linux/delay.h> |
52 | #include <linux/interrupt.h> | 51 | #include <linux/interrupt.h> |
52 | #include <linux/platform_device.h> | ||
53 | 53 | ||
54 | #include <asm/mpc8xx.h> | 54 | #include <asm/mpc8xx.h> |
55 | #include <asm/8xx_immap.h> | 55 | #include <asm/8xx_immap.h> |
@@ -546,29 +546,11 @@ static void m8xx_shutdown(void) | |||
546 | free_irq(pcmcia_schlvl, NULL); | 546 | free_irq(pcmcia_schlvl, NULL); |
547 | } | 547 | } |
548 | 548 | ||
549 | /* copied from tcic.c */ | ||
550 | |||
551 | static int m8xx_drv_suspend(struct device *dev, pm_message_t state, u32 level) | ||
552 | { | ||
553 | int ret = 0; | ||
554 | if (level == SUSPEND_SAVE_STATE) | ||
555 | ret = pcmcia_socket_dev_suspend(dev, state); | ||
556 | return ret; | ||
557 | } | ||
558 | |||
559 | static int m8xx_drv_resume(struct device *dev, u32 level) | ||
560 | { | ||
561 | int ret = 0; | ||
562 | if (level == RESUME_RESTORE_STATE) | ||
563 | ret = pcmcia_socket_dev_resume(dev); | ||
564 | return ret; | ||
565 | } | ||
566 | |||
567 | static struct device_driver m8xx_driver = { | 549 | static struct device_driver m8xx_driver = { |
568 | .name = "m8xx-pcmcia", | 550 | .name = "m8xx-pcmcia", |
569 | .bus = &platform_bus_type, | 551 | .bus = &platform_bus_type, |
570 | .suspend = m8xx_drv_suspend, | 552 | .suspend = pcmcia_socket_dev_suspend, |
571 | .resume = m8xx_drv_resume, | 553 | .resume = pcmcia_socket_dev_resume, |
572 | }; | 554 | }; |
573 | 555 | ||
574 | static struct platform_device m8xx_device = { | 556 | static struct platform_device m8xx_device = { |
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c index fe5ea36e7de3..56c58831e80e 100644 --- a/drivers/pcmcia/pxa2xx_sharpsl.c +++ b/drivers/pcmcia/pxa2xx_sharpsl.c | |||
@@ -22,16 +22,20 @@ | |||
22 | #include <asm/hardware.h> | 22 | #include <asm/hardware.h> |
23 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
24 | #include <asm/hardware/scoop.h> | 24 | #include <asm/hardware/scoop.h> |
25 | #ifdef CONFIG_SA1100_COLLIE | ||
26 | #include <asm/arch-sa1100/collie.h> | ||
27 | #else | ||
28 | #include <asm/arch-pxa/pxa-regs.h> | ||
29 | #endif | ||
30 | 25 | ||
31 | #include "soc_common.h" | 26 | #include "soc_common.h" |
32 | 27 | ||
33 | #define NO_KEEP_VS 0x0001 | 28 | #define NO_KEEP_VS 0x0001 |
34 | 29 | ||
30 | /* PCMCIA to Scoop linkage | ||
31 | |||
32 | There is no easy way to link multiple scoop devices into one | ||
33 | single entity for the pxa2xx_pcmcia device so this structure | ||
34 | is used which is setup by the platform code | ||
35 | */ | ||
36 | struct scoop_pcmcia_config *platform_scoop_config; | ||
37 | #define SCOOP_DEV platform_scoop_config->devs | ||
38 | |||
35 | static void sharpsl_pcmcia_init_reset(struct scoop_pcmcia_dev *scoopdev) | 39 | static void sharpsl_pcmcia_init_reset(struct scoop_pcmcia_dev *scoopdev) |
36 | { | 40 | { |
37 | reset_scoop(scoopdev->dev); | 41 | reset_scoop(scoopdev->dev); |
@@ -43,38 +47,16 @@ static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | |||
43 | { | 47 | { |
44 | int ret; | 48 | int ret; |
45 | 49 | ||
46 | #ifndef CONFIG_SA1100_COLLIE | 50 | if (platform_scoop_config->pcmcia_init) |
47 | /* | 51 | platform_scoop_config->pcmcia_init(); |
48 | * Setup default state of GPIO outputs | ||
49 | * before we enable them as outputs. | ||
50 | */ | ||
51 | GPSR(GPIO48_nPOE) = | ||
52 | GPIO_bit(GPIO48_nPOE) | | ||
53 | GPIO_bit(GPIO49_nPWE) | | ||
54 | GPIO_bit(GPIO50_nPIOR) | | ||
55 | GPIO_bit(GPIO51_nPIOW) | | ||
56 | GPIO_bit(GPIO52_nPCE_1) | | ||
57 | GPIO_bit(GPIO53_nPCE_2); | ||
58 | |||
59 | pxa_gpio_mode(GPIO48_nPOE_MD); | ||
60 | pxa_gpio_mode(GPIO49_nPWE_MD); | ||
61 | pxa_gpio_mode(GPIO50_nPIOR_MD); | ||
62 | pxa_gpio_mode(GPIO51_nPIOW_MD); | ||
63 | pxa_gpio_mode(GPIO52_nPCE_1_MD); | ||
64 | pxa_gpio_mode(GPIO53_nPCE_2_MD); | ||
65 | pxa_gpio_mode(GPIO54_pSKTSEL_MD); | ||
66 | pxa_gpio_mode(GPIO55_nPREG_MD); | ||
67 | pxa_gpio_mode(GPIO56_nPWAIT_MD); | ||
68 | pxa_gpio_mode(GPIO57_nIOIS16_MD); | ||
69 | #endif | ||
70 | 52 | ||
71 | /* Register interrupts */ | 53 | /* Register interrupts */ |
72 | if (scoop_devs[skt->nr].cd_irq >= 0) { | 54 | if (SCOOP_DEV[skt->nr].cd_irq >= 0) { |
73 | struct pcmcia_irqs cd_irq; | 55 | struct pcmcia_irqs cd_irq; |
74 | 56 | ||
75 | cd_irq.sock = skt->nr; | 57 | cd_irq.sock = skt->nr; |
76 | cd_irq.irq = scoop_devs[skt->nr].cd_irq; | 58 | cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; |
77 | cd_irq.str = scoop_devs[skt->nr].cd_irq_str; | 59 | cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; |
78 | ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1); | 60 | ret = soc_pcmcia_request_irqs(skt, &cd_irq, 1); |
79 | 61 | ||
80 | if (ret) { | 62 | if (ret) { |
@@ -83,19 +65,19 @@ static int sharpsl_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | |||
83 | } | 65 | } |
84 | } | 66 | } |
85 | 67 | ||
86 | skt->irq = scoop_devs[skt->nr].irq; | 68 | skt->irq = SCOOP_DEV[skt->nr].irq; |
87 | 69 | ||
88 | return 0; | 70 | return 0; |
89 | } | 71 | } |
90 | 72 | ||
91 | static void sharpsl_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | 73 | static void sharpsl_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) |
92 | { | 74 | { |
93 | if (scoop_devs[skt->nr].cd_irq >= 0) { | 75 | if (SCOOP_DEV[skt->nr].cd_irq >= 0) { |
94 | struct pcmcia_irqs cd_irq; | 76 | struct pcmcia_irqs cd_irq; |
95 | 77 | ||
96 | cd_irq.sock = skt->nr; | 78 | cd_irq.sock = skt->nr; |
97 | cd_irq.irq = scoop_devs[skt->nr].cd_irq; | 79 | cd_irq.irq = SCOOP_DEV[skt->nr].cd_irq; |
98 | cd_irq.str = scoop_devs[skt->nr].cd_irq_str; | 80 | cd_irq.str = SCOOP_DEV[skt->nr].cd_irq_str; |
99 | soc_pcmcia_free_irqs(skt, &cd_irq, 1); | 81 | soc_pcmcia_free_irqs(skt, &cd_irq, 1); |
100 | } | 82 | } |
101 | } | 83 | } |
@@ -105,9 +87,9 @@ static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | |||
105 | struct pcmcia_state *state) | 87 | struct pcmcia_state *state) |
106 | { | 88 | { |
107 | unsigned short cpr, csr; | 89 | unsigned short cpr, csr; |
108 | struct device *scoop = scoop_devs[skt->nr].dev; | 90 | struct device *scoop = SCOOP_DEV[skt->nr].dev; |
109 | 91 | ||
110 | cpr = read_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR); | 92 | cpr = read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR); |
111 | 93 | ||
112 | write_scoop_reg(scoop, SCOOP_IRM, 0x00FF); | 94 | write_scoop_reg(scoop, SCOOP_IRM, 0x00FF); |
113 | write_scoop_reg(scoop, SCOOP_ISR, 0x0000); | 95 | write_scoop_reg(scoop, SCOOP_ISR, 0x0000); |
@@ -116,21 +98,25 @@ static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | |||
116 | if (csr & 0x0004) { | 98 | if (csr & 0x0004) { |
117 | /* card eject */ | 99 | /* card eject */ |
118 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 100 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
119 | scoop_devs[skt->nr].keep_vs = NO_KEEP_VS; | 101 | SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; |
120 | } | 102 | } |
121 | else if (!(scoop_devs[skt->nr].keep_vs & NO_KEEP_VS)) { | 103 | else if (!(SCOOP_DEV[skt->nr].keep_vs & NO_KEEP_VS)) { |
122 | /* keep vs1,vs2 */ | 104 | /* keep vs1,vs2 */ |
123 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 105 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
124 | csr |= scoop_devs[skt->nr].keep_vs; | 106 | csr |= SCOOP_DEV[skt->nr].keep_vs; |
125 | } | 107 | } |
126 | else if (cpr & 0x0003) { | 108 | else if (cpr & 0x0003) { |
127 | /* power on */ | 109 | /* power on */ |
128 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | 110 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); |
129 | scoop_devs[skt->nr].keep_vs = (csr & 0x00C0); | 111 | SCOOP_DEV[skt->nr].keep_vs = (csr & 0x00C0); |
130 | } | 112 | } |
131 | else { | 113 | else { |
132 | /* card detect */ | 114 | /* card detect */ |
133 | write_scoop_reg(scoop, SCOOP_CDR, 0x0002); | 115 | if ((machine_is_spitz() || machine_is_borzoi()) && skt->nr == 1) { |
116 | write_scoop_reg(scoop, SCOOP_CDR, 0x0000); | ||
117 | } else { | ||
118 | write_scoop_reg(scoop, SCOOP_CDR, 0x0002); | ||
119 | } | ||
134 | } | 120 | } |
135 | 121 | ||
136 | state->detect = (csr & 0x0004) ? 0 : 1; | 122 | state->detect = (csr & 0x0004) ? 0 : 1; |
@@ -144,7 +130,6 @@ static void sharpsl_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | |||
144 | if ((cpr & 0x0080) && ((cpr & 0x8040) != 0x8040)) { | 130 | if ((cpr & 0x0080) && ((cpr & 0x8040) != 0x8040)) { |
145 | printk(KERN_ERR "sharpsl_pcmcia_socket_state(): CPR=%04X, Low voltage!\n", cpr); | 131 | printk(KERN_ERR "sharpsl_pcmcia_socket_state(): CPR=%04X, Low voltage!\n", cpr); |
146 | } | 132 | } |
147 | |||
148 | } | 133 | } |
149 | 134 | ||
150 | 135 | ||
@@ -152,7 +137,7 @@ static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | |||
152 | const socket_state_t *state) | 137 | const socket_state_t *state) |
153 | { | 138 | { |
154 | unsigned long flags; | 139 | unsigned long flags; |
155 | struct device *scoop = scoop_devs[skt->nr].dev; | 140 | struct device *scoop = SCOOP_DEV[skt->nr].dev; |
156 | 141 | ||
157 | unsigned short cpr, ncpr, ccr, nccr, mcr, nmcr, imr, nimr; | 142 | unsigned short cpr, ncpr, ccr, nccr, mcr, nmcr, imr, nimr; |
158 | 143 | ||
@@ -177,8 +162,13 @@ static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | |||
177 | nccr = (ccr = read_scoop_reg(scoop, SCOOP_CCR)) & ~0x0080; | 162 | nccr = (ccr = read_scoop_reg(scoop, SCOOP_CCR)) & ~0x0080; |
178 | nimr = (imr = read_scoop_reg(scoop, SCOOP_IMR)) & ~0x003E; | 163 | nimr = (imr = read_scoop_reg(scoop, SCOOP_IMR)) & ~0x003E; |
179 | 164 | ||
180 | ncpr |= (state->Vcc == 33) ? 0x0001 : | 165 | if ((machine_is_spitz() || machine_is_borzoi() || machine_is_akita()) && skt->nr == 0) { |
181 | (state->Vcc == 50) ? 0x0002 : 0; | 166 | ncpr |= (state->Vcc == 33) ? 0x0002 : |
167 | (state->Vcc == 50) ? 0x0002 : 0; | ||
168 | } else { | ||
169 | ncpr |= (state->Vcc == 33) ? 0x0001 : | ||
170 | (state->Vcc == 50) ? 0x0002 : 0; | ||
171 | } | ||
182 | nmcr |= (state->flags&SS_IOCARD) ? 0x0010 : 0; | 172 | nmcr |= (state->flags&SS_IOCARD) ? 0x0010 : 0; |
183 | ncpr |= (state->flags&SS_OUTPUT_ENA) ? 0x0080 : 0; | 173 | ncpr |= (state->flags&SS_OUTPUT_ENA) ? 0x0080 : 0; |
184 | nccr |= (state->flags&SS_RESET)? 0x0080: 0; | 174 | nccr |= (state->flags&SS_RESET)? 0x0080: 0; |
@@ -190,18 +180,22 @@ static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | |||
190 | ((skt->status&SS_WRPROT) ? 0x0008 : 0); | 180 | ((skt->status&SS_WRPROT) ? 0x0008 : 0); |
191 | 181 | ||
192 | if (!(ncpr & 0x0003)) { | 182 | if (!(ncpr & 0x0003)) { |
193 | scoop_devs[skt->nr].keep_rd = 0; | 183 | SCOOP_DEV[skt->nr].keep_rd = 0; |
194 | } else if (!scoop_devs[skt->nr].keep_rd) { | 184 | } else if (!SCOOP_DEV[skt->nr].keep_rd) { |
195 | if (nccr & 0x0080) | 185 | if (nccr & 0x0080) |
196 | scoop_devs[skt->nr].keep_rd = 1; | 186 | SCOOP_DEV[skt->nr].keep_rd = 1; |
197 | else | 187 | else |
198 | nccr |= 0x0080; | 188 | nccr |= 0x0080; |
199 | } | 189 | } |
200 | 190 | ||
201 | if (mcr != nmcr) | 191 | if (mcr != nmcr) |
202 | write_scoop_reg(scoop, SCOOP_MCR, nmcr); | 192 | write_scoop_reg(scoop, SCOOP_MCR, nmcr); |
203 | if (cpr != ncpr) | 193 | if (cpr != ncpr) { |
204 | write_scoop_reg(scoop, SCOOP_CPR, ncpr); | 194 | if (platform_scoop_config->power_ctrl) |
195 | platform_scoop_config->power_ctrl(scoop, ncpr , skt->nr); | ||
196 | else | ||
197 | write_scoop_reg(scoop, SCOOP_CPR, ncpr); | ||
198 | } | ||
205 | if (ccr != nccr) | 199 | if (ccr != nccr) |
206 | write_scoop_reg(scoop, SCOOP_CCR, nccr); | 200 | write_scoop_reg(scoop, SCOOP_CCR, nccr); |
207 | if (imr != nimr) | 201 | if (imr != nimr) |
@@ -214,43 +208,43 @@ static int sharpsl_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | |||
214 | 208 | ||
215 | static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | 209 | static void sharpsl_pcmcia_socket_init(struct soc_pcmcia_socket *skt) |
216 | { | 210 | { |
217 | sharpsl_pcmcia_init_reset(&scoop_devs[skt->nr]); | 211 | sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]); |
218 | 212 | ||
219 | /* Enable interrupt */ | 213 | /* Enable interrupt */ |
220 | write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_IMR, 0x00C0); | 214 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_IMR, 0x00C0); |
221 | write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_MCR, 0x0101); | 215 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_MCR, 0x0101); |
222 | scoop_devs[skt->nr].keep_vs = NO_KEEP_VS; | 216 | SCOOP_DEV[skt->nr].keep_vs = NO_KEEP_VS; |
223 | 217 | ||
224 | if (machine_is_collie()) | 218 | if (machine_is_collie()) |
225 | /* We need to disable SS_OUTPUT_ENA here. */ | 219 | /* We need to disable SS_OUTPUT_ENA here. */ |
226 | write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR, read_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR) & ~0x0080); | 220 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080); |
227 | } | 221 | } |
228 | 222 | ||
229 | static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | 223 | static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) |
230 | { | 224 | { |
231 | /* CF_BUS_OFF */ | 225 | /* CF_BUS_OFF */ |
232 | sharpsl_pcmcia_init_reset(&scoop_devs[skt->nr]); | 226 | sharpsl_pcmcia_init_reset(&SCOOP_DEV[skt->nr]); |
233 | 227 | ||
234 | if (machine_is_collie()) | 228 | if (machine_is_collie()) |
235 | /* We need to disable SS_OUTPUT_ENA here. */ | 229 | /* We need to disable SS_OUTPUT_ENA here. */ |
236 | write_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR, read_scoop_reg(scoop_devs[skt->nr].dev, SCOOP_CPR) & ~0x0080); | 230 | write_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR, read_scoop_reg(SCOOP_DEV[skt->nr].dev, SCOOP_CPR) & ~0x0080); |
237 | } | 231 | } |
238 | 232 | ||
239 | static struct pcmcia_low_level sharpsl_pcmcia_ops = { | 233 | static struct pcmcia_low_level sharpsl_pcmcia_ops = { |
240 | .owner = THIS_MODULE, | 234 | .owner = THIS_MODULE, |
241 | .hw_init = sharpsl_pcmcia_hw_init, | 235 | .hw_init = sharpsl_pcmcia_hw_init, |
242 | .hw_shutdown = sharpsl_pcmcia_hw_shutdown, | 236 | .hw_shutdown = sharpsl_pcmcia_hw_shutdown, |
243 | .socket_state = sharpsl_pcmcia_socket_state, | 237 | .socket_state = sharpsl_pcmcia_socket_state, |
244 | .configure_socket = sharpsl_pcmcia_configure_socket, | 238 | .configure_socket = sharpsl_pcmcia_configure_socket, |
245 | .socket_init = sharpsl_pcmcia_socket_init, | 239 | .socket_init = sharpsl_pcmcia_socket_init, |
246 | .socket_suspend = sharpsl_pcmcia_socket_suspend, | 240 | .socket_suspend = sharpsl_pcmcia_socket_suspend, |
247 | .first = 0, | 241 | .first = 0, |
248 | .nr = 0, | 242 | .nr = 0, |
249 | }; | 243 | }; |
250 | 244 | ||
251 | static struct platform_device *sharpsl_pcmcia_device; | ||
252 | |||
253 | #ifdef CONFIG_SA1100_COLLIE | 245 | #ifdef CONFIG_SA1100_COLLIE |
246 | #include "sa11xx_base.h" | ||
247 | |||
254 | int __init pcmcia_collie_init(struct device *dev) | 248 | int __init pcmcia_collie_init(struct device *dev) |
255 | { | 249 | { |
256 | int ret = -ENODEV; | 250 | int ret = -ENODEV; |
@@ -263,11 +257,13 @@ int __init pcmcia_collie_init(struct device *dev) | |||
263 | 257 | ||
264 | #else | 258 | #else |
265 | 259 | ||
260 | static struct platform_device *sharpsl_pcmcia_device; | ||
261 | |||
266 | static int __init sharpsl_pcmcia_init(void) | 262 | static int __init sharpsl_pcmcia_init(void) |
267 | { | 263 | { |
268 | int ret; | 264 | int ret; |
269 | 265 | ||
270 | sharpsl_pcmcia_ops.nr=scoop_num; | 266 | sharpsl_pcmcia_ops.nr=platform_scoop_config->num_devs; |
271 | sharpsl_pcmcia_device = kmalloc(sizeof(*sharpsl_pcmcia_device), GFP_KERNEL); | 267 | sharpsl_pcmcia_device = kmalloc(sizeof(*sharpsl_pcmcia_device), GFP_KERNEL); |
272 | if (!sharpsl_pcmcia_device) | 268 | if (!sharpsl_pcmcia_device) |
273 | return -ENOMEM; | 269 | return -ENOMEM; |
@@ -275,7 +271,7 @@ static int __init sharpsl_pcmcia_init(void) | |||
275 | memset(sharpsl_pcmcia_device, 0, sizeof(*sharpsl_pcmcia_device)); | 271 | memset(sharpsl_pcmcia_device, 0, sizeof(*sharpsl_pcmcia_device)); |
276 | sharpsl_pcmcia_device->name = "pxa2xx-pcmcia"; | 272 | sharpsl_pcmcia_device->name = "pxa2xx-pcmcia"; |
277 | sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; | 273 | sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops; |
278 | sharpsl_pcmcia_device->dev.parent=scoop_devs[0].dev; | 274 | sharpsl_pcmcia_device->dev.parent=platform_scoop_config->devs[0].dev; |
279 | 275 | ||
280 | ret = platform_device_register(sharpsl_pcmcia_device); | 276 | ret = platform_device_register(sharpsl_pcmcia_device); |
281 | if (ret) | 277 | if (ret) |