summaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia/i82365.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-07-14 13:24:39 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-14 13:24:39 -0700
commit42c59208219a2d43f0dde94bebc68c20b95b13ce (patch)
treeff20941f83a92ffb4224c95ddee9b7eb225ed958 /drivers/pcmcia/i82365.c
parentdddec01eb8e2b56267b37a6f9f0997a64b4e0b2a (diff)
parent727c6742c29e46177951fdc8f6758085e03bb981 (diff)
downloadop-kernel-dev-42c59208219a2d43f0dde94bebc68c20b95b13ce.zip
op-kernel-dev-42c59208219a2d43f0dde94bebc68c20b95b13ce.tar.gz
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6: (23 commits) pcmcia: Fix ide-cs sparse warning pcmcia: ide-cs debugging bugfix pcmcia: allow for longer CIS firmware files pcmcia: cm40x0 cdev lock_kernel() pushdown pcmcia: (re)move {pcmcia,pccard}_get_status pcmcia: kill IN_CARD_SERVICES pcmcia: Remove unused header file code pcmcia: remove unused bulkmem.h pcmcia: simplify pccard_validate_cis pcmcia: carve out ioctl adjust function to pcmcia_ioctl pcmcia: irq probe can be done without risking an IRQ storm pcmcia: Fix ti12xx_2nd_slot_empty always failing pcmcia: check for pointer instead of pointer address pcmcia: switch cm4000_cs.c to unlocked_ioctl pcmcia: simplify rsrc_nonstatic attributes pcmcia: add support CompactFlash PCMCIA support for Blackfin. pcmcia: remove version.h pcmcia: cs: kill thread_wait pcmcia: i82365.c: check request_irq return value pcmcia: fix Alchemy warnings ...
Diffstat (limited to 'drivers/pcmcia/i82365.c')
-rw-r--r--drivers/pcmcia/i82365.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
index 32a2ab1..68f6b27 100644
--- a/drivers/pcmcia/i82365.c
+++ b/drivers/pcmcia/i82365.c
@@ -1263,7 +1263,7 @@ static int __init init_i82365(void)
ret = driver_register(&i82365_driver);
if (ret)
- return ret;
+ goto err_out;
i82365_device = platform_device_alloc("i82365", 0);
if (i82365_device) {
@@ -1273,10 +1273,8 @@ static int __init init_i82365(void)
} else
ret = -ENOMEM;
- if (ret) {
- driver_unregister(&i82365_driver);
- return ret;
- }
+ if (ret)
+ goto err_driver_unregister;
printk(KERN_INFO "Intel ISA PCIC probe: ");
sockets = 0;
@@ -1285,16 +1283,17 @@ static int __init init_i82365(void)
if (sockets == 0) {
printk("not found.\n");
- platform_device_unregister(i82365_device);
- release_region(i365_base, 2);
- driver_unregister(&i82365_driver);
- return -ENODEV;
+ ret = -ENODEV;
+ goto err_dev_unregister;
}
/* Set up interrupt handler(s) */
if (grab_irq != 0)
- request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
-
+ ret = request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
+
+ if (ret)
+ goto err_socket_release;
+
/* register sockets with the pcmcia core */
for (i = 0; i < sockets; i++) {
socket[i].socket.dev.parent = &i82365_device->dev;
@@ -1324,7 +1323,23 @@ static int __init init_i82365(void)
}
return 0;
-
+err_socket_release:
+ for (i = 0; i < sockets; i++) {
+ /* Turn off all interrupt sources! */
+ i365_set(i, I365_CSCINT, 0);
+ release_region(socket[i].ioaddr, 2);
+ }
+err_dev_unregister:
+ platform_device_unregister(i82365_device);
+ release_region(i365_base, 2);
+#ifdef CONFIG_PNP
+ if (i82365_pnpdev)
+ pnp_disable_dev(i82365_pnpdev);
+#endif
+err_driver_unregister:
+ driver_unregister(&i82365_driver);
+err_out:
+ return ret;
} /* init_i82365 */
static void __exit exit_i82365(void)
OpenPOWER on IntegriCloud