diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-29 17:21:42 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-29 17:21:42 -0800 |
commit | c0f79c4cb11acca545f9802ee0e14ad3b5cc123d (patch) | |
tree | 89d44f772a625bca06c7cf1bbed748f58dcab24a /drivers/pcmcia/au1000_generic.c | |
parent | 7a20655bc5316ccec0f036cde46e609ba5571f5e (diff) | |
parent | f901b8c46fa9748b9d6836e9b158cf7be89447f1 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-fixes-2.6:
[PATCH] PCMCIA: fix __must_check warnings
[PATCH] PCMCIA: handle sysfs, PCI errors
[PATCH] Export soc_common_drv_pcmcia_remove to allow modular PCMCIA.
[PATCH] ioremap balanced with iounmap for drivers/pcmcia
[PATCH] pcmcia: au1000_generic fix
[PATCH] i82092: wire up errors from pci_register_driver()
[PATCH] CONFIG_PM=n slim: drivers/pcmcia/*
[PATCH] pcmcia/ds: driver layer error checking
[PATCH] pcmcia: update alloc_io_space for conflict checking for multifunction PC card
[PATCH] pcmcia: add more IDs to hostap_cs.c
[PATCH] pcmcia: at91_cf update
Diffstat (limited to 'drivers/pcmcia/au1000_generic.c')
-rw-r--r-- | drivers/pcmcia/au1000_generic.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index d5dd0ce6553..551bde5d943 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c @@ -351,6 +351,7 @@ struct skt_dev_info { int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, int first, int nr) { struct skt_dev_info *sinfo; + struct au1000_pcmcia_socket *skt; int ret, i; 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, * Initialise the per-socket structure. */ for (i = 0; i < nr; i++) { - struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i); + skt = PCMCIA_SOCKET(i); memset(skt, 0, sizeof(*skt)); skt->socket.resource_ops = &pccard_static_ops; @@ -438,17 +439,29 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, dev_set_drvdata(dev, sinfo); return 0; - do { - struct au1000_pcmcia_socket *skt = PCMCIA_SOCKET(i); + +out_err: + flush_scheduled_work(); + ops->hw_shutdown(skt); + while (i-- > 0) { + skt = PCMCIA_SOCKET(i); del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); -out_err: flush_scheduled_work(); + if (i == 0) { + iounmap(skt->virt_io + (u32)mips_io_port_base); + skt->virt_io = NULL; + } +#ifndef CONFIG_MIPS_XXS1500 + else { + iounmap(skt->virt_io + (u32)mips_io_port_base); + skt->virt_io = NULL; + } +#endif ops->hw_shutdown(skt); - i--; - } while (i > 0); + } kfree(sinfo); out: return ret; |