diff options
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 7 | ||||
| -rw-r--r-- | drivers/pcmcia/at91_cf.c | 28 | ||||
| -rw-r--r-- | drivers/pcmcia/au1000_generic.c | 25 | ||||
| -rw-r--r-- | drivers/pcmcia/ds.c | 29 | ||||
| -rw-r--r-- | drivers/pcmcia/i82092.c | 9 | ||||
| -rw-r--r-- | drivers/pcmcia/m8xx_pcmcia.c | 12 | ||||
| -rw-r--r-- | drivers/pcmcia/omap_cf.c | 3 | ||||
| -rw-r--r-- | drivers/pcmcia/pcmcia_ioctl.c | 11 | ||||
| -rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/pd6729.c | 4 | ||||
| -rw-r--r-- | drivers/pcmcia/soc_common.c | 1 | ||||
| -rw-r--r-- | drivers/pcmcia/yenta_socket.c | 22 |
12 files changed, 105 insertions, 48 deletions
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 686d895116de..f63909e4bc32 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -887,6 +887,13 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
| 887 | PCMCIA_DEVICE_PROD_ID123( | 887 | PCMCIA_DEVICE_PROD_ID123( |
| 888 | "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", | 888 | "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", |
| 889 | 0xc7b8df9d, 0x1700d087, 0x4b74baa0), | 889 | 0xc7b8df9d, 0x1700d087, 0x4b74baa0), |
| 890 | PCMCIA_DEVICE_PROD_ID123( | ||
| 891 | "Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", | ||
| 892 | "Ver. 1.00", | ||
| 893 | 0x5cd01705, 0x4271660f, 0x9d08ee12), | ||
| 894 | PCMCIA_DEVICE_PROD_ID123( | ||
| 895 | "corega", "WL PCCL-11", "ISL37300P", | ||
| 896 | 0xa21501a, 0x59868926, 0xc9049a39), | ||
| 890 | PCMCIA_DEVICE_NULL | 897 | PCMCIA_DEVICE_NULL |
| 891 | }; | 898 | }; |
| 892 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); | 899 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); |
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 7f5df9a9f393..3bcb7dc32995 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c | |||
| @@ -241,12 +241,6 @@ static int __init at91_cf_probe(struct platform_device *pdev) | |||
| 241 | csa = at91_sys_read(AT91_EBI_CSA); | 241 | csa = at91_sys_read(AT91_EBI_CSA); |
| 242 | at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH); | 242 | at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH); |
| 243 | 243 | ||
| 244 | /* force poweron defaults for these pins ... */ | ||
| 245 | (void) at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */ | ||
| 246 | (void) at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */ | ||
| 247 | (void) at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */ | ||
| 248 | (void) at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */ | ||
| 249 | |||
| 250 | /* nWAIT is _not_ a default setting */ | 244 | /* nWAIT is _not_ a default setting */ |
| 251 | (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ | 245 | (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ |
| 252 | 246 | ||
| @@ -316,12 +310,14 @@ static int __init at91_cf_probe(struct platform_device *pdev) | |||
| 316 | return 0; | 310 | return 0; |
| 317 | 311 | ||
| 318 | fail2: | 312 | fail2: |
| 319 | iounmap((void __iomem *) cf->socket.io_offset); | ||
| 320 | release_mem_region(io->start, io->end + 1 - io->start); | 313 | release_mem_region(io->start, io->end + 1 - io->start); |
| 321 | fail1: | 314 | fail1: |
| 315 | if (cf->socket.io_offset) | ||
| 316 | iounmap((void __iomem *) cf->socket.io_offset); | ||
| 322 | if (board->irq_pin) | 317 | if (board->irq_pin) |
| 323 | free_irq(board->irq_pin, cf); | 318 | free_irq(board->irq_pin, cf); |
| 324 | fail0a: | 319 | fail0a: |
| 320 | device_init_wakeup(&pdev->dev, 0); | ||
| 325 | free_irq(board->det_pin, cf); | 321 | free_irq(board->det_pin, cf); |
| 326 | device_init_wakeup(&pdev->dev, 0); | 322 | device_init_wakeup(&pdev->dev, 0); |
| 327 | fail0: | 323 | fail0: |
| @@ -360,26 +356,20 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
| 360 | struct at91_cf_data *board = cf->board; | 356 | struct at91_cf_data *board = cf->board; |
| 361 | 357 | ||
| 362 | pcmcia_socket_dev_suspend(&pdev->dev, mesg); | 358 | pcmcia_socket_dev_suspend(&pdev->dev, mesg); |
| 363 | if (device_may_wakeup(&pdev->dev)) | 359 | if (device_may_wakeup(&pdev->dev)) { |
| 364 | enable_irq_wake(board->det_pin); | 360 | enable_irq_wake(board->det_pin); |
| 365 | else { | 361 | if (board->irq_pin) |
| 362 | enable_irq_wake(board->irq_pin); | ||
| 363 | } else { | ||
| 366 | disable_irq_wake(board->det_pin); | 364 | disable_irq_wake(board->det_pin); |
| 367 | disable_irq(board->det_pin); | 365 | if (board->irq_pin) |
| 366 | disable_irq_wake(board->irq_pin); | ||
| 368 | } | 367 | } |
| 369 | if (board->irq_pin) | ||
| 370 | disable_irq(board->irq_pin); | ||
| 371 | return 0; | 368 | return 0; |
| 372 | } | 369 | } |
| 373 | 370 | ||
| 374 | static int at91_cf_resume(struct platform_device *pdev) | 371 | static int at91_cf_resume(struct platform_device *pdev) |
| 375 | { | 372 | { |
| 376 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); | ||
| 377 | struct at91_cf_data *board = cf->board; | ||
| 378 | |||
| 379 | if (board->irq_pin) | ||
| 380 | enable_irq(board->irq_pin); | ||
| 381 | if (!device_may_wakeup(&pdev->dev)) | ||
| 382 | enable_irq(board->det_pin); | ||
| 383 | pcmcia_socket_dev_resume(&pdev->dev); | 373 | pcmcia_socket_dev_resume(&pdev->dev); |
| 384 | return 0; | 374 | return 0; |
| 385 | } | 375 | } |
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index d5dd0ce65536..551bde5d9430 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c | |||
| @@ -351,6 +351,7 @@ struct skt_dev_info { | |||
| 351 | int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr) | 351 | int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr) |
| 352 | { | 352 | { |
| 353 | struct skt_dev_info *sinfo; | 353 | struct skt_dev_info *sinfo; |
| 354 | struct au1000_pcmcia_socket *skt; | ||
| 354 | int ret, i; | 355 | int ret, i; |
| 355 | 356 | ||
| 356 | sinfo = kzalloc(sizeof(struct skt_dev_info), GFP_KERNEL); | 357 | sinfo = kzalloc(sizeof(struct skt_dev_info), GFP_KERNEL); |
| @@ -365,7 +366,7 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
| 365 | * Initialise the per-socket structure. | 366 | * Initialise the per-socket structure. |
| 366 | */ | 367 | */ |
| 367 | for (i = 0; i < nr; i++) { | 368 | for (i = 0; i < nr; i++) { |
| 368 | struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i); | 369 | skt = PCMCIA_SOCKET(i); |
| 369 | memset(skt, 0, sizeof(*skt)); | 370 | memset(skt, 0, sizeof(*skt)); |
| 370 | 371 | ||
| 371 | skt->socket.resource_ops = &pccard_static_ops; | 372 | skt->socket.resource_ops = &pccard_static_ops; |
| @@ -438,17 +439,29 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
| 438 | dev_set_drvdata(dev, sinfo); | 439 | dev_set_drvdata(dev, sinfo); |
| 439 | return 0; | 440 | return 0; |
| 440 | 441 | ||
| 441 | do { | 442 | |
| 442 | struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i); | 443 | out_err: |
| 444 | flush_scheduled_work(); | ||
| 445 | ops->hw_shutdown(skt); | ||
| 446 | while (i-- > 0) { | ||
| 447 | skt = PCMCIA_SOCKET(i); | ||
| 443 | 448 | ||
| 444 | del_timer_sync(&skt->poll_timer); | 449 | del_timer_sync(&skt->poll_timer); |
| 445 | pcmcia_unregister_socket(&skt->socket); | 450 | pcmcia_unregister_socket(&skt->socket); |
| 446 | out_err: | ||
| 447 | flush_scheduled_work(); | 451 | flush_scheduled_work(); |
| 452 | if (i == 0) { | ||
| 453 | iounmap(skt->virt_io + (u32)mips_io_port_base); | ||
| 454 | skt->virt_io = NULL; | ||
| 455 | } | ||
| 456 | #ifndef CONFIG_MIPS_XXS1500 | ||
| 457 | else { | ||
| 458 | iounmap(skt->virt_io + (u32)mips_io_port_base); | ||
| 459 | skt->virt_io = NULL; | ||
| 460 | } | ||
| 461 | #endif | ||
| 448 | ops->hw_shutdown(skt); | 462 | ops->hw_shutdown(skt); |
| 449 | 463 | ||
| 450 | i--; | 464 | } |
| 451 | } while (i > 0); | ||
| 452 | kfree(sinfo); | 465 | kfree(sinfo); |
| 453 | out: | 466 | out: |
| 454 | return ret; | 467 | return ret; |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 74b3124e8247..0f701921c13e 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -717,6 +717,7 @@ static int pcmcia_requery(struct device *dev, void * _data) | |||
| 717 | static void pcmcia_bus_rescan(struct pcmcia_socket *skt) | 717 | static void pcmcia_bus_rescan(struct pcmcia_socket *skt) |
| 718 | { | 718 | { |
| 719 | int no_devices=0; | 719 | int no_devices=0; |
| 720 | int ret = 0; | ||
| 720 | unsigned long flags; | 721 | unsigned long flags; |
| 721 | 722 | ||
| 722 | /* must be called with skt_mutex held */ | 723 | /* must be called with skt_mutex held */ |
| @@ -729,7 +730,7 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt) | |||
| 729 | * missing resource information or other trouble, we need to | 730 | * missing resource information or other trouble, we need to |
| 730 | * do this now. */ | 731 | * do this now. */ |
| 731 | if (no_devices) { | 732 | if (no_devices) { |
| 732 | int ret = pcmcia_card_add(skt); | 733 | ret = pcmcia_card_add(skt); |
| 733 | if (ret) | 734 | if (ret) |
| 734 | return; | 735 | return; |
| 735 | } | 736 | } |
| @@ -741,7 +742,9 @@ static void pcmcia_bus_rescan(struct pcmcia_socket *skt) | |||
| 741 | 742 | ||
| 742 | /* we re-scan all devices, not just the ones connected to this | 743 | /* we re-scan all devices, not just the ones connected to this |
| 743 | * socket. This does not matter, though. */ | 744 | * socket. This does not matter, though. */ |
| 744 | bus_rescan_devices(&pcmcia_bus_type); | 745 | ret = bus_rescan_devices(&pcmcia_bus_type); |
| 746 | if (ret) | ||
| 747 | printk(KERN_INFO "pcmcia: bus_rescan_devices failed\n"); | ||
| 745 | } | 748 | } |
| 746 | 749 | ||
| 747 | static inline int pcmcia_devmatch(struct pcmcia_device *dev, | 750 | static inline int pcmcia_devmatch(struct pcmcia_device *dev, |
| @@ -1001,6 +1004,7 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, | |||
| 1001 | struct device_attribute *attr, const char *buf, size_t count) | 1004 | struct device_attribute *attr, const char *buf, size_t count) |
| 1002 | { | 1005 | { |
| 1003 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | 1006 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); |
| 1007 | int ret; | ||
| 1004 | 1008 | ||
| 1005 | if (!count) | 1009 | if (!count) |
| 1006 | return -EINVAL; | 1010 | return -EINVAL; |
| @@ -1009,7 +1013,10 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, | |||
| 1009 | p_dev->allow_func_id_match = 1; | 1013 | p_dev->allow_func_id_match = 1; |
| 1010 | mutex_unlock(&p_dev->socket->skt_mutex); | 1014 | mutex_unlock(&p_dev->socket->skt_mutex); |
| 1011 | 1015 | ||
| 1012 | bus_rescan_devices(&pcmcia_bus_type); | 1016 | ret = bus_rescan_devices(&pcmcia_bus_type); |
| 1017 | if (ret) | ||
| 1018 | printk(KERN_INFO "pcmcia: bus_rescan_devices failed after " | ||
| 1019 | "allowing func_id matches\n"); | ||
| 1013 | 1020 | ||
| 1014 | return count; | 1021 | return count; |
| 1015 | } | 1022 | } |
| @@ -1292,10 +1299,22 @@ struct bus_type pcmcia_bus_type = { | |||
| 1292 | 1299 | ||
| 1293 | static int __init init_pcmcia_bus(void) | 1300 | static int __init init_pcmcia_bus(void) |
| 1294 | { | 1301 | { |
| 1302 | int ret; | ||
| 1303 | |||
| 1295 | spin_lock_init(&pcmcia_dev_list_lock); | 1304 | spin_lock_init(&pcmcia_dev_list_lock); |
| 1296 | 1305 | ||
| 1297 | bus_register(&pcmcia_bus_type); | 1306 | ret = bus_register(&pcmcia_bus_type); |
| 1298 | class_interface_register(&pcmcia_bus_interface); | 1307 | if (ret < 0) { |
| 1308 | printk(KERN_WARNING "pcmcia: bus_register error: %d\n", ret); | ||
| 1309 | return ret; | ||
| 1310 | } | ||
| 1311 | ret = class_interface_register(&pcmcia_bus_interface); | ||
| 1312 | if (ret < 0) { | ||
| 1313 | printk(KERN_WARNING | ||
| 1314 | "pcmcia: class_interface_register error: %d\n", ret); | ||
| 1315 | bus_unregister(&pcmcia_bus_type); | ||
| 1316 | return ret; | ||
| 1317 | } | ||
| 1299 | 1318 | ||
| 1300 | pcmcia_setup_ioctl(); | 1319 | pcmcia_setup_ioctl(); |
| 1301 | 1320 | ||
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index 82715f448957..c2ea07aa7a12 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c | |||
| @@ -41,6 +41,7 @@ static struct pci_device_id i82092aa_pci_ids[] = { | |||
| 41 | }; | 41 | }; |
| 42 | MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); | 42 | MODULE_DEVICE_TABLE(pci, i82092aa_pci_ids); |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_PM | ||
| 44 | static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) | 45 | static int i82092aa_socket_suspend (struct pci_dev *dev, pm_message_t state) |
| 45 | { | 46 | { |
| 46 | return pcmcia_socket_dev_suspend(&dev->dev, state); | 47 | return pcmcia_socket_dev_suspend(&dev->dev, state); |
| @@ -50,14 +51,17 @@ static int i82092aa_socket_resume (struct pci_dev *dev) | |||
| 50 | { | 51 | { |
| 51 | return pcmcia_socket_dev_resume(&dev->dev); | 52 | return pcmcia_socket_dev_resume(&dev->dev); |
| 52 | } | 53 | } |
| 54 | #endif | ||
| 53 | 55 | ||
| 54 | static struct pci_driver i82092aa_pci_drv = { | 56 | static struct pci_driver i82092aa_pci_drv = { |
| 55 | .name = "i82092aa", | 57 | .name = "i82092aa", |
| 56 | .id_table = i82092aa_pci_ids, | 58 | .id_table = i82092aa_pci_ids, |
| 57 | .probe = i82092aa_pci_probe, | 59 | .probe = i82092aa_pci_probe, |
| 58 | .remove = __devexit_p(i82092aa_pci_remove), | 60 | .remove = __devexit_p(i82092aa_pci_remove), |
| 61 | #ifdef CONFIG_PM | ||
| 59 | .suspend = i82092aa_socket_suspend, | 62 | .suspend = i82092aa_socket_suspend, |
| 60 | .resume = i82092aa_socket_resume, | 63 | .resume = i82092aa_socket_resume, |
| 64 | #endif | ||
| 61 | }; | 65 | }; |
| 62 | 66 | ||
| 63 | 67 | ||
| @@ -705,10 +709,7 @@ static int i82092aa_set_mem_map(struct pcmcia_socket *socket, struct pccard_mem_ | |||
| 705 | 709 | ||
| 706 | static int i82092aa_module_init(void) | 710 | static int i82092aa_module_init(void) |
| 707 | { | 711 | { |
| 708 | enter("i82092aa_module_init"); | 712 | return pci_register_driver(&i82092aa_pci_drv); |
| 709 | pci_register_driver(&i82092aa_pci_drv); | ||
| 710 | leave("i82092aa_module_init"); | ||
| 711 | return 0; | ||
| 712 | } | 713 | } |
| 713 | 714 | ||
| 714 | static void i82092aa_module_exit(void) | 715 | static void i82092aa_module_exit(void) |
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index e070a2896769..3b72be880401 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c | |||
| @@ -427,7 +427,7 @@ static int voltage_set(int slot, int vcc, int vpp) | |||
| 427 | reg |= BCSR1_PCCVCC1; | 427 | reg |= BCSR1_PCCVCC1; |
| 428 | break; | 428 | break; |
| 429 | default: | 429 | default: |
| 430 | return 1; | 430 | goto out_unmap; |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | switch(vpp) { | 433 | switch(vpp) { |
| @@ -438,15 +438,15 @@ static int voltage_set(int slot, int vcc, int vpp) | |||
| 438 | if(vcc == vpp) | 438 | if(vcc == vpp) |
| 439 | reg |= BCSR1_PCCVPP1; | 439 | reg |= BCSR1_PCCVPP1; |
| 440 | else | 440 | else |
| 441 | return 1; | 441 | goto out_unmap; |
| 442 | break; | 442 | break; |
| 443 | case 120: | 443 | case 120: |
| 444 | if ((vcc == 33) || (vcc == 50)) | 444 | if ((vcc == 33) || (vcc == 50)) |
| 445 | reg |= BCSR1_PCCVPP0; | 445 | reg |= BCSR1_PCCVPP0; |
| 446 | else | 446 | else |
| 447 | return 1; | 447 | goto out_unmap; |
| 448 | default: | 448 | default: |
| 449 | return 1; | 449 | goto out_unmap; |
| 450 | } | 450 | } |
| 451 | 451 | ||
| 452 | /* first, turn off all power */ | 452 | /* first, turn off all power */ |
| @@ -457,6 +457,10 @@ static int voltage_set(int slot, int vcc, int vpp) | |||
| 457 | 457 | ||
| 458 | iounmap(bcsr_io); | 458 | iounmap(bcsr_io); |
| 459 | return 0; | 459 | return 0; |
| 460 | |||
| 461 | out_unmap: | ||
| 462 | iounmap(bcsr_io); | ||
| 463 | return 1; | ||
| 460 | } | 464 | } |
| 461 | 465 | ||
| 462 | #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V | 466 | #define socket_get(_slot_) PCMCIA_SOCKET_KEY_5V |
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index c8e838c69766..06bf7f48836e 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c | |||
| @@ -309,9 +309,10 @@ static int __devinit omap_cf_probe(struct device *dev) | |||
| 309 | return 0; | 309 | return 0; |
| 310 | 310 | ||
| 311 | fail2: | 311 | fail2: |
| 312 | iounmap((void __iomem *) cf->socket.io_offset); | ||
| 313 | release_mem_region(cf->phys_cf, SZ_8K); | 312 | release_mem_region(cf->phys_cf, SZ_8K); |
| 314 | fail1: | 313 | fail1: |
| 314 | if (cf->socket.io_offset) | ||
| 315 | iounmap((void __iomem *) cf->socket.io_offset); | ||
| 315 | free_irq(irq, cf); | 316 | free_irq(irq, cf); |
| 316 | fail0: | 317 | fail0: |
| 317 | kfree(cf); | 318 | kfree(cf); |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 9ad18e62658d..310ede575caa 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
| @@ -128,9 +128,12 @@ static int proc_read_drivers(char *buf, char **start, off_t pos, | |||
| 128 | int count, int *eof, void *data) | 128 | int count, int *eof, void *data) |
| 129 | { | 129 | { |
| 130 | char *p = buf; | 130 | char *p = buf; |
| 131 | int rc; | ||
| 131 | 132 | ||
| 132 | bus_for_each_drv(&pcmcia_bus_type, NULL, | 133 | rc = bus_for_each_drv(&pcmcia_bus_type, NULL, |
| 133 | (void *) &p, proc_read_drivers_callback); | 134 | (void *) &p, proc_read_drivers_callback); |
| 135 | if (rc < 0) | ||
| 136 | return rc; | ||
| 134 | 137 | ||
| 135 | return (p - buf); | 138 | return (p - buf); |
| 136 | } | 139 | } |
| @@ -269,8 +272,10 @@ rescan: | |||
| 269 | * Prevent this racing with a card insertion. | 272 | * Prevent this racing with a card insertion. |
| 270 | */ | 273 | */ |
| 271 | mutex_lock(&s->skt_mutex); | 274 | mutex_lock(&s->skt_mutex); |
| 272 | bus_rescan_devices(&pcmcia_bus_type); | 275 | ret = bus_rescan_devices(&pcmcia_bus_type); |
| 273 | mutex_unlock(&s->skt_mutex); | 276 | mutex_unlock(&s->skt_mutex); |
| 277 | if (ret) | ||
| 278 | goto err_put_module; | ||
| 274 | 279 | ||
| 275 | /* check whether the driver indeed matched. I don't care if this | 280 | /* check whether the driver indeed matched. I don't care if this |
| 276 | * is racy or not, because it can only happen on cardmgr access | 281 | * is racy or not, because it can only happen on cardmgr access |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 74cebd424032..b9201c2ec38b 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
| @@ -95,7 +95,7 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base, | |||
| 95 | * potential conflicts, just the most obvious ones. | 95 | * potential conflicts, just the most obvious ones. |
| 96 | */ | 96 | */ |
| 97 | for (i = 0; i < MAX_IO_WIN; i++) | 97 | for (i = 0; i < MAX_IO_WIN; i++) |
| 98 | if ((s->io[i].res) && | 98 | if ((s->io[i].res) && *base && |
| 99 | ((s->io[i].res->start & (align-1)) == *base)) | 99 | ((s->io[i].res->start & (align-1)) == *base)) |
| 100 | return 1; | 100 | return 1; |
| 101 | for (i = 0; i < MAX_IO_WIN; i++) { | 101 | for (i = 0; i < MAX_IO_WIN; i++) { |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index c83a0a6b158f..a70f97fdbbdd 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
| @@ -755,6 +755,7 @@ static void __devexit pd6729_pci_remove(struct pci_dev *dev) | |||
| 755 | kfree(socket); | 755 | kfree(socket); |
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | #ifdef CONFIG_PM | ||
| 758 | static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) | 759 | static int pd6729_socket_suspend(struct pci_dev *dev, pm_message_t state) |
| 759 | { | 760 | { |
| 760 | return pcmcia_socket_dev_suspend(&dev->dev, state); | 761 | return pcmcia_socket_dev_suspend(&dev->dev, state); |
| @@ -764,6 +765,7 @@ static int pd6729_socket_resume(struct pci_dev *dev) | |||
| 764 | { | 765 | { |
| 765 | return pcmcia_socket_dev_resume(&dev->dev); | 766 | return pcmcia_socket_dev_resume(&dev->dev); |
| 766 | } | 767 | } |
| 768 | #endif | ||
| 767 | 769 | ||
| 768 | static struct pci_device_id pd6729_pci_ids[] = { | 770 | static struct pci_device_id pd6729_pci_ids[] = { |
| 769 | { | 771 | { |
| @@ -781,8 +783,10 @@ static struct pci_driver pd6729_pci_drv = { | |||
| 781 | .id_table = pd6729_pci_ids, | 783 | .id_table = pd6729_pci_ids, |
| 782 | .probe = pd6729_pci_probe, | 784 | .probe = pd6729_pci_probe, |
| 783 | .remove = __devexit_p(pd6729_pci_remove), | 785 | .remove = __devexit_p(pd6729_pci_remove), |
| 786 | #ifdef CONFIG_PM | ||
| 784 | .suspend = pd6729_socket_suspend, | 787 | .suspend = pd6729_socket_suspend, |
| 785 | .resume = pd6729_socket_resume, | 788 | .resume = pd6729_socket_resume, |
| 789 | #endif | ||
| 786 | }; | 790 | }; |
| 787 | 791 | ||
| 788 | static int pd6729_module_init(void) | 792 | static int pd6729_module_init(void) |
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 3627e52e0c27..e433704e026a 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c | |||
| @@ -824,3 +824,4 @@ int soc_common_drv_pcmcia_remove(struct device *dev) | |||
| 824 | 824 | ||
| 825 | return 0; | 825 | return 0; |
| 826 | } | 826 | } |
| 827 | EXPORT_SYMBOL(soc_common_drv_pcmcia_remove); | ||
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 26229d9da762..da471bddc972 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
| @@ -1197,8 +1197,12 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
| 1197 | ret = pcmcia_register_socket(&socket->socket); | 1197 | ret = pcmcia_register_socket(&socket->socket); |
| 1198 | if (ret == 0) { | 1198 | if (ret == 0) { |
| 1199 | /* Add the yenta register attributes */ | 1199 | /* Add the yenta register attributes */ |
| 1200 | device_create_file(&dev->dev, &dev_attr_yenta_registers); | 1200 | ret = device_create_file(&dev->dev, &dev_attr_yenta_registers); |
| 1201 | goto out; | 1201 | if (ret == 0) |
| 1202 | goto out; | ||
| 1203 | |||
| 1204 | /* error path... */ | ||
| 1205 | pcmcia_unregister_socket(&socket->socket); | ||
| 1202 | } | 1206 | } |
| 1203 | 1207 | ||
| 1204 | unmap: | 1208 | unmap: |
| @@ -1213,7 +1217,7 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
| 1213 | return ret; | 1217 | return ret; |
| 1214 | } | 1218 | } |
| 1215 | 1219 | ||
| 1216 | 1220 | #ifdef CONFIG_PM | |
| 1217 | static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) | 1221 | static int yenta_dev_suspend (struct pci_dev *dev, pm_message_t state) |
| 1218 | { | 1222 | { |
| 1219 | struct yenta_socket *socket = pci_get_drvdata(dev); | 1223 | struct yenta_socket *socket = pci_get_drvdata(dev); |
| @@ -1248,12 +1252,18 @@ static int yenta_dev_resume (struct pci_dev *dev) | |||
| 1248 | struct yenta_socket *socket = pci_get_drvdata(dev); | 1252 | struct yenta_socket *socket = pci_get_drvdata(dev); |
| 1249 | 1253 | ||
| 1250 | if (socket) { | 1254 | if (socket) { |
| 1255 | int rc; | ||
| 1256 | |||
| 1251 | pci_set_power_state(dev, 0); | 1257 | pci_set_power_state(dev, 0); |
| 1252 | /* FIXME: pci_restore_state needs to have a better interface */ | 1258 | /* FIXME: pci_restore_state needs to have a better interface */ |
| 1253 | pci_restore_state(dev); | 1259 | pci_restore_state(dev); |
| 1254 | pci_write_config_dword(dev, 16*4, socket->saved_state[0]); | 1260 | pci_write_config_dword(dev, 16*4, socket->saved_state[0]); |
| 1255 | pci_write_config_dword(dev, 17*4, socket->saved_state[1]); | 1261 | pci_write_config_dword(dev, 17*4, socket->saved_state[1]); |
| 1256 | pci_enable_device(dev); | 1262 | |
| 1263 | rc = pci_enable_device(dev); | ||
| 1264 | if (rc) | ||
| 1265 | return rc; | ||
| 1266 | |||
| 1257 | pci_set_master(dev); | 1267 | pci_set_master(dev); |
| 1258 | 1268 | ||
| 1259 | if (socket->type && socket->type->restore_state) | 1269 | if (socket->type && socket->type->restore_state) |
| @@ -1262,7 +1272,7 @@ static int yenta_dev_resume (struct pci_dev *dev) | |||
| 1262 | 1272 | ||
| 1263 | return pcmcia_socket_dev_resume(&dev->dev); | 1273 | return pcmcia_socket_dev_resume(&dev->dev); |
| 1264 | } | 1274 | } |
| 1265 | 1275 | #endif | |
| 1266 | 1276 | ||
| 1267 | #define CB_ID(vend,dev,type) \ | 1277 | #define CB_ID(vend,dev,type) \ |
| 1268 | { \ | 1278 | { \ |
| @@ -1359,8 +1369,10 @@ static struct pci_driver yenta_cardbus_driver = { | |||
| 1359 | .id_table = yenta_table, | 1369 | .id_table = yenta_table, |
| 1360 | .probe = yenta_probe, | 1370 | .probe = yenta_probe, |
| 1361 | .remove = __devexit_p(yenta_close), | 1371 | .remove = __devexit_p(yenta_close), |
| 1372 | #ifdef CONFIG_PM | ||
| 1362 | .suspend = yenta_dev_suspend, | 1373 | .suspend = yenta_dev_suspend, |
| 1363 | .resume = yenta_dev_resume, | 1374 | .resume = yenta_dev_resume, |
| 1375 | #endif | ||
| 1364 | }; | 1376 | }; |
| 1365 | 1377 | ||
| 1366 | 1378 | ||
