aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hartleys@visionengravers.com>2012-05-17 20:11:14 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-18 20:29:55 -0400
commit484ecc95d9cdfa8b2f7029e2f3409cf078aed4ab (patch)
treecda4edeaebbd2911f9c7a8e8d2a8b3e4874eb4c8
parente3f7e1a5b118323fdb79d8092f08adf1890b8efe (diff)
staging: comedi: cleanup all the comedi_driver 'detach' functions
1. Change the return type from int to void All the detach functions, except for the comedi usb drivers, simply return success (0). Plus, the return code is never checked in the comedi core. The comedi usb drivers do return error codes but the conditions can never happen. The first check is: if (!dev) return -EFAULT; This checks that the passed comedi_device pointer is valid. The detach function itself is called using this pointer so it MUST always be valid or there is a bug in the core: if (dev->driver) dev->driver->detach(dev); And the second check: usb = dev->private; if (!usb) return -EFAULT; The dev->private pointer is setup in the attach function to point to the probed usb device. This value could be NULL if the attach fails. But, since the comedi core is going to unload the driver anyway and does not check for errors there is no gain by returning one. After removing these checks from the comedi usb drivers the detach functions required a bit of cleanup. 2. Remove all the printk noise in the detach functions All of the printk output is really just noise. The user did a rmmod to unload the driver, we really don't need to tell them about it. Also, some of the messages are output using: dev_dbg(dev->hw_dev, ... or dev_info(dev->hw_dev, ... Unfortunately the hw_dev value is only used by drivers that are doing DMA. For most drivers this variable is going to be NULL so the output is not going to work as expected. 3. Refactor a couple static 'free_resource' functions into the detach functions. The 'free_resource' function is only being called by the detach and it makes more sense to just absorb the code. 4. Remove a couple unnecessary braces for single statements. 5. Remove unnecessary comments. Most of the comedi drivers appear to be based on the comedi skel driver and have the comments from that driver included. These comments make sense in the skel driver for reference but they don't need to be in any of the actual drivers. 6. Remove all the extra whitespace. It's not needed to make the functions any more readable. 7. Remove the now unused 'attached_successfully' variable in the cb_pcimdda driver. This variable was only used to conditionally output some driver noise during the detach. Since all the printk's have been removed this variable is no longer necessary. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Cc: Mori Hess <fmhess@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/comedi/comedidev.h2
-rw-r--r--drivers/staging/comedi/drivers/8255.c6
-rw-r--r--drivers/staging/comedi/drivers/acl7225b.c6
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_common.c48
-rw-r--r--drivers/staging/comedi/drivers/addi-data/addi_common.h2
-rw-r--r--drivers/staging/comedi/drivers/adl_pci6208.c6
-rw-r--r--drivers/staging/comedi/drivers/adl_pci7230.c6
-rw-r--r--drivers/staging/comedi/drivers/adl_pci7296.c8
-rw-r--r--drivers/staging/comedi/drivers/adl_pci7432.c6
-rw-r--r--drivers/staging/comedi/drivers/adl_pci8164.c6
-rw-r--r--drivers/staging/comedi/drivers/adl_pci9111.c12
-rw-r--r--drivers/staging/comedi/drivers/adl_pci9118.c4
-rw-r--r--drivers/staging/comedi/drivers/adq12b.c7
-rw-r--r--drivers/staging/comedi/drivers/adv_pci1710.c5
-rw-r--r--drivers/staging/comedi/drivers/adv_pci1723.c7
-rw-r--r--drivers/staging/comedi/drivers/adv_pci_dio.c18
-rw-r--r--drivers/staging/comedi/drivers/aio_aio12_8.c3
-rw-r--r--drivers/staging/comedi/drivers/aio_iiro_16.c6
-rw-r--r--drivers/staging/comedi/drivers/amplc_dio200.c20
-rw-r--r--drivers/staging/comedi/drivers/amplc_pc236.c20
-rw-r--r--drivers/staging/comedi/drivers/amplc_pc263.c20
-rw-r--r--drivers/staging/comedi/drivers/amplc_pci224.c12
-rw-r--r--drivers/staging/comedi/drivers/amplc_pci230.c18
-rw-r--r--drivers/staging/comedi/drivers/c6xdigio.c15
-rw-r--r--drivers/staging/comedi/drivers/cb_das16_cs.c9
-rw-r--r--drivers/staging/comedi/drivers/cb_pcidas.c18
-rw-r--r--drivers/staging/comedi/drivers/cb_pcidas64.c12
-rw-r--r--drivers/staging/comedi/drivers/cb_pcidda.c16
-rw-r--r--drivers/staging/comedi/drivers/cb_pcidio.c3
-rw-r--r--drivers/staging/comedi/drivers/cb_pcimdas.c25
-rw-r--r--drivers/staging/comedi/drivers/cb_pcimdda.c23
-rw-r--r--drivers/staging/comedi/drivers/comedi_bond.c49
-rw-r--r--drivers/staging/comedi/drivers/comedi_parport.c7
-rw-r--r--drivers/staging/comedi/drivers/comedi_test.c6
-rw-r--r--drivers/staging/comedi/drivers/contec_pci_dio.c6
-rw-r--r--drivers/staging/comedi/drivers/daqboard2000.c5
-rw-r--r--drivers/staging/comedi/drivers/das08.c9
-rw-r--r--drivers/staging/comedi/drivers/das08.h2
-rw-r--r--drivers/staging/comedi/drivers/das16.c10
-rw-r--r--drivers/staging/comedi/drivers/das16m1.c9
-rw-r--r--drivers/staging/comedi/drivers/das1800.c8
-rw-r--r--drivers/staging/comedi/drivers/das6402.c4
-rw-r--r--drivers/staging/comedi/drivers/das800.c8
-rw-r--r--drivers/staging/comedi/drivers/dmm32at.c15
-rw-r--r--drivers/staging/comedi/drivers/dt2801.c4
-rw-r--r--drivers/staging/comedi/drivers/dt2811.c6
-rw-r--r--drivers/staging/comedi/drivers/dt2814.c7
-rw-r--r--drivers/staging/comedi/drivers/dt2815.c11
-rw-r--r--drivers/staging/comedi/drivers/dt2817.c6
-rw-r--r--drivers/staging/comedi/drivers/dt282x.c11
-rw-r--r--drivers/staging/comedi/drivers/dt3000.c5
-rw-r--r--drivers/staging/comedi/drivers/dt9812.c4
-rw-r--r--drivers/staging/comedi/drivers/dyna_pci10xx.c4
-rw-r--r--drivers/staging/comedi/drivers/fl512.c4
-rw-r--r--drivers/staging/comedi/drivers/gsc_hpdi.c5
-rw-r--r--drivers/staging/comedi/drivers/icp_multi.c8
-rw-r--r--drivers/staging/comedi/drivers/ii_pci20kc.c6
-rw-r--r--drivers/staging/comedi/drivers/jr3_pci.c5
-rw-r--r--drivers/staging/comedi/drivers/ke_counter.c5
-rw-r--r--drivers/staging/comedi/drivers/me4000.c6
-rw-r--r--drivers/staging/comedi/drivers/me_daq.c4
-rw-r--r--drivers/staging/comedi/drivers/mpc624.c6
-rw-r--r--drivers/staging/comedi/drivers/mpc8260cpm.c6
-rw-r--r--drivers/staging/comedi/drivers/multiq3.c6
-rw-r--r--drivers/staging/comedi/drivers/ni_6527.c8
-rw-r--r--drivers/staging/comedi/drivers/ni_65xx.c7
-rw-r--r--drivers/staging/comedi/drivers/ni_660x.c9
-rw-r--r--drivers/staging/comedi/drivers/ni_670x.c10
-rw-r--r--drivers/staging/comedi/drivers/ni_at_a2150.c9
-rw-r--r--drivers/staging/comedi/drivers/ni_at_ao.c6
-rw-r--r--drivers/staging/comedi/drivers/ni_atmio.c6
-rw-r--r--drivers/staging/comedi/drivers/ni_atmio16d.c9
-rw-r--r--drivers/staging/comedi/drivers/ni_daq_700.c17
-rw-r--r--drivers/staging/comedi/drivers/ni_daq_dio24.c17
-rw-r--r--drivers/staging/comedi/drivers/ni_labpc.c7
-rw-r--r--drivers/staging/comedi/drivers/ni_labpc.h2
-rw-r--r--drivers/staging/comedi/drivers/ni_labpc_cs.c10
-rw-r--r--drivers/staging/comedi/drivers/ni_mio_cs.c13
-rw-r--r--drivers/staging/comedi/drivers/ni_pcidio.c5
-rw-r--r--drivers/staging/comedi/drivers/ni_pcimio.c6
-rw-r--r--drivers/staging/comedi/drivers/pcl711.c7
-rw-r--r--drivers/staging/comedi/drivers/pcl724.c8
-rw-r--r--drivers/staging/comedi/drivers/pcl725.c6
-rw-r--r--drivers/staging/comedi/drivers/pcl726.c7
-rw-r--r--drivers/staging/comedi/drivers/pcl730.c6
-rw-r--r--drivers/staging/comedi/drivers/pcl812.c7
-rw-r--r--drivers/staging/comedi/drivers/pcl816.c62
-rw-r--r--drivers/staging/comedi/drivers/pcl818.c66
-rw-r--r--drivers/staging/comedi/drivers/pcm3724.c4
-rw-r--r--drivers/staging/comedi/drivers/pcm3730.c6
-rw-r--r--drivers/staging/comedi/drivers/pcmad.c7
-rw-r--r--drivers/staging/comedi/drivers/pcmda12.c5
-rw-r--r--drivers/staging/comedi/drivers/pcmmio.c8
-rw-r--r--drivers/staging/comedi/drivers/pcmuio.c8
-rw-r--r--drivers/staging/comedi/drivers/poc.c7
-rw-r--r--drivers/staging/comedi/drivers/quatech_daqp_cs.c16
-rw-r--r--drivers/staging/comedi/drivers/rtd520.c33
-rw-r--r--drivers/staging/comedi/drivers/rti800.c7
-rw-r--r--drivers/staging/comedi/drivers/rti802.c6
-rw-r--r--drivers/staging/comedi/drivers/s526.c6
-rw-r--r--drivers/staging/comedi/drivers/s626.c8
-rw-r--r--drivers/staging/comedi/drivers/serial2002.c4
-rw-r--r--drivers/staging/comedi/drivers/skel.c7
-rw-r--r--drivers/staging/comedi/drivers/ssv_dnp.c8
-rw-r--r--drivers/staging/comedi/drivers/unioxx5.c4
-rw-r--r--drivers/staging/comedi/drivers/usbdux.c35
-rw-r--r--drivers/staging/comedi/drivers/usbduxfast.c46
-rw-r--r--drivers/staging/comedi/drivers/usbduxsigma.c36
-rw-r--r--drivers/staging/comedi/drivers/vmk80xx.c32
109 files changed, 236 insertions, 993 deletions
diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h
index f7f023cb95c1..134be93eaa6d 100644
--- a/drivers/staging/comedi/comedidev.h
+++ b/drivers/staging/comedi/comedidev.h
@@ -189,7 +189,7 @@ struct comedi_driver {
189 const char *driver_name; 189 const char *driver_name;
190 struct module *module; 190 struct module *module;
191 int (*attach) (struct comedi_device *, struct comedi_devconfig *); 191 int (*attach) (struct comedi_device *, struct comedi_devconfig *);
192 int (*detach) (struct comedi_device *); 192 void (*detach) (struct comedi_device *);
193 int (*attach_pci) (struct comedi_device *, struct pci_dev *); 193 int (*attach_pci) (struct comedi_device *, struct pci_dev *);
194 int (*attach_usb) (struct comedi_device *, struct usb_interface *); 194 int (*attach_usb) (struct comedi_device *, struct usb_interface *);
195 195
diff --git a/drivers/staging/comedi/drivers/8255.c b/drivers/staging/comedi/drivers/8255.c
index f709107e1a37..27e39e4eb6b3 100644
--- a/drivers/staging/comedi/drivers/8255.c
+++ b/drivers/staging/comedi/drivers/8255.c
@@ -417,14 +417,12 @@ static int dev_8255_attach(struct comedi_device *dev,
417 return 0; 417 return 0;
418} 418}
419 419
420static int dev_8255_detach(struct comedi_device *dev) 420static void dev_8255_detach(struct comedi_device *dev)
421{ 421{
422 int i; 422 int i;
423 unsigned long iobase; 423 unsigned long iobase;
424 struct comedi_subdevice *s; 424 struct comedi_subdevice *s;
425 425
426 printk(KERN_INFO "comedi%d: 8255: remove\n", dev->minor);
427
428 for (i = 0; i < dev->n_subdevices; i++) { 426 for (i = 0; i < dev->n_subdevices; i++) {
429 s = dev->subdevices + i; 427 s = dev->subdevices + i;
430 if (s->type != COMEDI_SUBD_UNUSED) { 428 if (s->type != COMEDI_SUBD_UNUSED) {
@@ -433,8 +431,6 @@ static int dev_8255_detach(struct comedi_device *dev)
433 } 431 }
434 subdev_8255_cleanup(dev, s); 432 subdev_8255_cleanup(dev, s);
435 } 433 }
436
437 return 0;
438} 434}
439 435
440static struct comedi_driver dev_8255_driver = { 436static struct comedi_driver dev_8255_driver = {
diff --git a/drivers/staging/comedi/drivers/acl7225b.c b/drivers/staging/comedi/drivers/acl7225b.c
index e5f8729e0853..4e4fc418655f 100644
--- a/drivers/staging/comedi/drivers/acl7225b.c
+++ b/drivers/staging/comedi/drivers/acl7225b.c
@@ -119,14 +119,10 @@ static int acl7225b_attach(struct comedi_device *dev,
119 return 0; 119 return 0;
120} 120}
121 121
122static int acl7225b_detach(struct comedi_device *dev) 122static void acl7225b_detach(struct comedi_device *dev)
123{ 123{
124 printk(KERN_INFO "comedi%d: acl7225b: remove\n", dev->minor);
125
126 if (dev->iobase) 124 if (dev->iobase)
127 release_region(dev->iobase, this_board->io_range); 125 release_region(dev->iobase, this_board->io_range);
128
129 return 0;
130} 126}
131 127
132static const struct boardtype boardtypes[] = { 128static const struct boardtype boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.c b/drivers/staging/comedi/drivers/addi-data/addi_common.c
index 4c183043e0e4..44aaf8351ba3 100644
--- a/drivers/staging/comedi/drivers/addi-data/addi_common.c
+++ b/drivers/staging/comedi/drivers/addi-data/addi_common.c
@@ -1839,50 +1839,22 @@ static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it)
1839 return 0; 1839 return 0;
1840} 1840}
1841 1841
1842/* 1842static void i_ADDI_Detach(struct comedi_device *dev)
1843+----------------------------------------------------------------------------+
1844| Function name : static int i_ADDI_Detach(struct comedi_device *dev) |
1845| |
1846| |
1847+----------------------------------------------------------------------------+
1848| Task : Deallocates resources of the addi_common driver |
1849| Free the DMA buffers, unregister irq. |
1850| |
1851+----------------------------------------------------------------------------+
1852| Input Parameters : struct comedi_device *dev |
1853| |
1854| |
1855+----------------------------------------------------------------------------+
1856| Return Value : 0 |
1857| |
1858+----------------------------------------------------------------------------+
1859*/
1860
1861static int i_ADDI_Detach(struct comedi_device *dev)
1862{ 1843{
1863
1864 if (dev->private) { 1844 if (dev->private) {
1865 if (devpriv->b_ValidDriver) { 1845 if (devpriv->b_ValidDriver)
1866 i_ADDI_Reset(dev); 1846 i_ADDI_Reset(dev);
1867 } 1847 if (dev->irq)
1868
1869 if (dev->irq) {
1870 free_irq(dev->irq, dev); 1848 free_irq(dev->irq, dev);
1871 } 1849 if ((this_board->pc_EepromChip == NULL) ||
1872 1850 (strcmp(this_board->pc_EepromChip, ADDIDATA_9054) != 0)) {
1873 if ((this_board->pc_EepromChip == NULL) 1851 if (devpriv->allocated)
1874 || (strcmp(this_board->pc_EepromChip,
1875 ADDIDATA_9054) != 0)) {
1876 if (devpriv->allocated) {
1877 i_pci_card_free(devpriv->amcc); 1852 i_pci_card_free(devpriv->amcc);
1878 }
1879
1880 if (devpriv->ul_DmaBufferVirtual[0]) { 1853 if (devpriv->ul_DmaBufferVirtual[0]) {
1881 free_pages((unsigned long)devpriv-> 1854 free_pages((unsigned long)devpriv->
1882 ul_DmaBufferVirtual[0], 1855 ul_DmaBufferVirtual[0],
1883 devpriv->ui_DmaBufferPages[0]); 1856 devpriv->ui_DmaBufferPages[0]);
1884 } 1857 }
1885
1886 if (devpriv->ul_DmaBufferVirtual[1]) { 1858 if (devpriv->ul_DmaBufferVirtual[1]) {
1887 free_pages((unsigned long)devpriv-> 1859 free_pages((unsigned long)devpriv->
1888 ul_DmaBufferVirtual[1], 1860 ul_DmaBufferVirtual[1],
@@ -1890,20 +1862,14 @@ static int i_ADDI_Detach(struct comedi_device *dev)
1890 } 1862 }
1891 } else { 1863 } else {
1892 iounmap(devpriv->dw_AiBase); 1864 iounmap(devpriv->dw_AiBase);
1893 1865 if (devpriv->allocated)
1894 if (devpriv->allocated) {
1895 i_pci_card_free(devpriv->amcc); 1866 i_pci_card_free(devpriv->amcc);
1896 }
1897 } 1867 }
1898
1899 if (pci_list_builded) { 1868 if (pci_list_builded) {
1900 /* v_pci_card_list_cleanup(PCI_VENDOR_ID_AMCC); */
1901 v_pci_card_list_cleanup(this_board->i_VendorId); 1869 v_pci_card_list_cleanup(this_board->i_VendorId);
1902 pci_list_builded = 0; 1870 pci_list_builded = 0;
1903 } 1871 }
1904 } 1872 }
1905
1906 return 0;
1907} 1873}
1908 1874
1909/* 1875/*
diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.h b/drivers/staging/comedi/drivers/addi-data/addi_common.h
index 0a153feece90..2c3f34703dd2 100644
--- a/drivers/staging/comedi/drivers/addi-data/addi_common.h
+++ b/drivers/staging/comedi/drivers/addi-data/addi_common.h
@@ -416,7 +416,7 @@ static unsigned short pci_list_builded; /* set to 1 when list of card is known *
416 416
417/* Function declarations */ 417/* Function declarations */
418static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it); 418static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it);
419static int i_ADDI_Detach(struct comedi_device *dev); 419static void i_ADDI_Detach(struct comedi_device *dev);
420static int i_ADDI_Reset(struct comedi_device *dev); 420static int i_ADDI_Reset(struct comedi_device *dev);
421 421
422static irqreturn_t v_ADDI_Interrupt(int irq, void *d); 422static irqreturn_t v_ADDI_Interrupt(int irq, void *d);
diff --git a/drivers/staging/comedi/drivers/adl_pci6208.c b/drivers/staging/comedi/drivers/adl_pci6208.c
index f9fefef54050..de8c68af3210 100644
--- a/drivers/staging/comedi/drivers/adl_pci6208.c
+++ b/drivers/staging/comedi/drivers/adl_pci6208.c
@@ -330,17 +330,13 @@ static int pci6208_attach(struct comedi_device *dev,
330 return 1; 330 return 1;
331} 331}
332 332
333static int pci6208_detach(struct comedi_device *dev) 333static void pci6208_detach(struct comedi_device *dev)
334{ 334{
335 printk(KERN_INFO "comedi%d: pci6208: remove\n", dev->minor);
336
337 if (devpriv && devpriv->pci_dev) { 335 if (devpriv && devpriv->pci_dev) {
338 if (dev->iobase) 336 if (dev->iobase)
339 comedi_pci_disable(devpriv->pci_dev); 337 comedi_pci_disable(devpriv->pci_dev);
340 pci_dev_put(devpriv->pci_dev); 338 pci_dev_put(devpriv->pci_dev);
341 } 339 }
342
343 return 0;
344} 340}
345 341
346static struct comedi_driver adl_pci6208_driver = { 342static struct comedi_driver adl_pci6208_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci7230.c b/drivers/staging/comedi/drivers/adl_pci7230.c
index 430ec7374c76..e8053bc825f4 100644
--- a/drivers/staging/comedi/drivers/adl_pci7230.c
+++ b/drivers/staging/comedi/drivers/adl_pci7230.c
@@ -150,17 +150,13 @@ static int adl_pci7230_attach(struct comedi_device *dev,
150 return 1; 150 return 1;
151} 151}
152 152
153static int adl_pci7230_detach(struct comedi_device *dev) 153static void adl_pci7230_detach(struct comedi_device *dev)
154{ 154{
155 printk(KERN_DEBUG "comedi%d: pci7230: remove\n", dev->minor);
156
157 if (devpriv && devpriv->pci_dev) { 155 if (devpriv && devpriv->pci_dev) {
158 if (dev->iobase) 156 if (dev->iobase)
159 comedi_pci_disable(devpriv->pci_dev); 157 comedi_pci_disable(devpriv->pci_dev);
160 pci_dev_put(devpriv->pci_dev); 158 pci_dev_put(devpriv->pci_dev);
161 } 159 }
162
163 return 0;
164} 160}
165 161
166static struct comedi_driver adl_pci7230_driver = { 162static struct comedi_driver adl_pci7230_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci7296.c b/drivers/staging/comedi/drivers/adl_pci7296.c
index a84a384f9ab9..b4dae3b7598b 100644
--- a/drivers/staging/comedi/drivers/adl_pci7296.c
+++ b/drivers/staging/comedi/drivers/adl_pci7296.c
@@ -134,25 +134,19 @@ static int adl_pci7296_attach(struct comedi_device *dev,
134 return -EIO; 134 return -EIO;
135} 135}
136 136
137static int adl_pci7296_detach(struct comedi_device *dev) 137static void adl_pci7296_detach(struct comedi_device *dev)
138{ 138{
139 printk(KERN_INFO "comedi%d: pci7432: remove\n", dev->minor);
140
141 if (devpriv && devpriv->pci_dev) { 139 if (devpriv && devpriv->pci_dev) {
142 if (dev->iobase) 140 if (dev->iobase)
143 comedi_pci_disable(devpriv->pci_dev); 141 comedi_pci_disable(devpriv->pci_dev);
144 pci_dev_put(devpriv->pci_dev); 142 pci_dev_put(devpriv->pci_dev);
145 } 143 }
146 /* detach four 8255 digital io subdevices */
147 if (dev->subdevices) { 144 if (dev->subdevices) {
148 subdev_8255_cleanup(dev, dev->subdevices + 0); 145 subdev_8255_cleanup(dev, dev->subdevices + 0);
149 subdev_8255_cleanup(dev, dev->subdevices + 1); 146 subdev_8255_cleanup(dev, dev->subdevices + 1);
150 subdev_8255_cleanup(dev, dev->subdevices + 2); 147 subdev_8255_cleanup(dev, dev->subdevices + 2);
151 subdev_8255_cleanup(dev, dev->subdevices + 3); 148 subdev_8255_cleanup(dev, dev->subdevices + 3);
152
153 } 149 }
154
155 return 0;
156} 150}
157 151
158static struct comedi_driver adl_pci7296_driver = { 152static struct comedi_driver adl_pci7296_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci7432.c b/drivers/staging/comedi/drivers/adl_pci7432.c
index 330be9d04b9e..9cbfb61a4478 100644
--- a/drivers/staging/comedi/drivers/adl_pci7432.c
+++ b/drivers/staging/comedi/drivers/adl_pci7432.c
@@ -161,17 +161,13 @@ static int adl_pci7432_attach(struct comedi_device *dev,
161 return -EIO; 161 return -EIO;
162} 162}
163 163
164static int adl_pci7432_detach(struct comedi_device *dev) 164static void adl_pci7432_detach(struct comedi_device *dev)
165{ 165{
166 printk(KERN_INFO "comedi%d: pci7432: remove\n", dev->minor);
167
168 if (devpriv && devpriv->pci_dev) { 166 if (devpriv && devpriv->pci_dev) {
169 if (dev->iobase) 167 if (dev->iobase)
170 comedi_pci_disable(devpriv->pci_dev); 168 comedi_pci_disable(devpriv->pci_dev);
171 pci_dev_put(devpriv->pci_dev); 169 pci_dev_put(devpriv->pci_dev);
172 } 170 }
173
174 return 0;
175} 171}
176 172
177static struct comedi_driver adl_pci7432_driver = { 173static struct comedi_driver adl_pci7432_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci8164.c b/drivers/staging/comedi/drivers/adl_pci8164.c
index 9c5906bb1a15..409ef13ad090 100644
--- a/drivers/staging/comedi/drivers/adl_pci8164.c
+++ b/drivers/staging/comedi/drivers/adl_pci8164.c
@@ -314,17 +314,13 @@ static int adl_pci8164_attach(struct comedi_device *dev,
314 return -EIO; 314 return -EIO;
315} 315}
316 316
317static int adl_pci8164_detach(struct comedi_device *dev) 317static void adl_pci8164_detach(struct comedi_device *dev)
318{ 318{
319 printk(KERN_INFO "comedi%d: pci8164: remove\n", dev->minor);
320
321 if (devpriv && devpriv->pci_dev) { 319 if (devpriv && devpriv->pci_dev) {
322 if (dev->iobase) 320 if (dev->iobase)
323 comedi_pci_disable(devpriv->pci_dev); 321 comedi_pci_disable(devpriv->pci_dev);
324 pci_dev_put(devpriv->pci_dev); 322 pci_dev_put(devpriv->pci_dev);
325 } 323 }
326
327 return 0;
328} 324}
329 325
330static struct comedi_driver adl_pci8164_driver = { 326static struct comedi_driver adl_pci8164_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci9111.c b/drivers/staging/comedi/drivers/adl_pci9111.c
index 31dfd865e695..ccfb1a52154e 100644
--- a/drivers/staging/comedi/drivers/adl_pci9111.c
+++ b/drivers/staging/comedi/drivers/adl_pci9111.c
@@ -1382,29 +1382,19 @@ found:
1382 return 0; 1382 return 0;
1383} 1383}
1384 1384
1385/* Detach */ 1385static void pci9111_detach(struct comedi_device *dev)
1386
1387static int pci9111_detach(struct comedi_device *dev)
1388{ 1386{
1389 /* Reset device */
1390
1391 if (dev->private != NULL) { 1387 if (dev->private != NULL) {
1392 if (dev_private->is_valid) 1388 if (dev_private->is_valid)
1393 pci9111_reset(dev); 1389 pci9111_reset(dev);
1394
1395 } 1390 }
1396 /* Release previously allocated irq */
1397
1398 if (dev->irq != 0) 1391 if (dev->irq != 0)
1399 free_irq(dev->irq, dev); 1392 free_irq(dev->irq, dev);
1400
1401 if (dev_private != NULL && dev_private->pci_device != NULL) { 1393 if (dev_private != NULL && dev_private->pci_device != NULL) {
1402 if (dev->iobase) 1394 if (dev->iobase)
1403 comedi_pci_disable(dev_private->pci_device); 1395 comedi_pci_disable(dev_private->pci_device);
1404 pci_dev_put(dev_private->pci_device); 1396 pci_dev_put(dev_private->pci_device);
1405 } 1397 }
1406
1407 return 0;
1408} 1398}
1409 1399
1410static struct comedi_driver adl_pci9111_driver = { 1400static struct comedi_driver adl_pci9111_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci9118.c b/drivers/staging/comedi/drivers/adl_pci9118.c
index dd9dfec5384c..78645863297b 100644
--- a/drivers/staging/comedi/drivers/adl_pci9118.c
+++ b/drivers/staging/comedi/drivers/adl_pci9118.c
@@ -2353,7 +2353,7 @@ static int pci9118_attach(struct comedi_device *dev,
2353 return 0; 2353 return 0;
2354} 2354}
2355 2355
2356static int pci9118_detach(struct comedi_device *dev) 2356static void pci9118_detach(struct comedi_device *dev)
2357{ 2357{
2358 if (dev->private) { 2358 if (dev->private) {
2359 if (devpriv->valid) 2359 if (devpriv->valid)
@@ -2373,8 +2373,6 @@ static int pci9118_detach(struct comedi_device *dev)
2373 free_pages((unsigned long)devpriv->dmabuf_virt[1], 2373 free_pages((unsigned long)devpriv->dmabuf_virt[1],
2374 devpriv->dmabuf_pages[1]); 2374 devpriv->dmabuf_pages[1]);
2375 } 2375 }
2376
2377 return 0;
2378} 2376}
2379 2377
2380static const struct boardtype boardtypes[] = { 2378static const struct boardtype boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/adq12b.c b/drivers/staging/comedi/drivers/adq12b.c
index 6a68d5303a18..7d585a12050f 100644
--- a/drivers/staging/comedi/drivers/adq12b.c
+++ b/drivers/staging/comedi/drivers/adq12b.c
@@ -324,16 +324,11 @@ static int adq12b_attach(struct comedi_device *dev, struct comedi_devconfig *it)
324 return 0; 324 return 0;
325} 325}
326 326
327static int adq12b_detach(struct comedi_device *dev) 327static void adq12b_detach(struct comedi_device *dev)
328{ 328{
329 if (dev->iobase) 329 if (dev->iobase)
330 release_region(dev->iobase, ADQ12B_SIZE); 330 release_region(dev->iobase, ADQ12B_SIZE);
331
332 kfree(devpriv); 331 kfree(devpriv);
333
334 printk(KERN_INFO "comedi%d: adq12b: removed\n", dev->minor);
335
336 return 0;
337} 332}
338 333
339static const struct adq12b_board adq12b_boards[] = { 334static const struct adq12b_board adq12b_boards[] = {
diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c
index ff61dff9254a..de8c98cfe367 100644
--- a/drivers/staging/comedi/drivers/adv_pci1710.c
+++ b/drivers/staging/comedi/drivers/adv_pci1710.c
@@ -1551,7 +1551,7 @@ static int pci1710_attach(struct comedi_device *dev,
1551 return 0; 1551 return 0;
1552} 1552}
1553 1553
1554static int pci1710_detach(struct comedi_device *dev) 1554static void pci1710_detach(struct comedi_device *dev)
1555{ 1555{
1556 if (dev->private) { 1556 if (dev->private) {
1557 if (devpriv->valid) 1557 if (devpriv->valid)
@@ -1561,12 +1561,9 @@ static int pci1710_detach(struct comedi_device *dev)
1561 if (devpriv->pcidev) { 1561 if (devpriv->pcidev) {
1562 if (dev->iobase) 1562 if (dev->iobase)
1563 comedi_pci_disable(devpriv->pcidev); 1563 comedi_pci_disable(devpriv->pcidev);
1564
1565 pci_dev_put(devpriv->pcidev); 1564 pci_dev_put(devpriv->pcidev);
1566 } 1565 }
1567 } 1566 }
1568
1569 return 0;
1570} 1567}
1571 1568
1572static struct comedi_driver adv_pci1710_driver = { 1569static struct comedi_driver adv_pci1710_driver = {
diff --git a/drivers/staging/comedi/drivers/adv_pci1723.c b/drivers/staging/comedi/drivers/adv_pci1723.c
index 6356bd8beac3..336addcbce3a 100644
--- a/drivers/staging/comedi/drivers/adv_pci1723.c
+++ b/drivers/staging/comedi/drivers/adv_pci1723.c
@@ -431,22 +431,17 @@ static int pci1723_attach(struct comedi_device *dev,
431 return 0; 431 return 0;
432} 432}
433 433
434static int pci1723_detach(struct comedi_device *dev) 434static void pci1723_detach(struct comedi_device *dev)
435{ 435{
436 printk(KERN_ERR "comedi%d: pci1723: remove\n", dev->minor);
437
438 if (dev->private) { 436 if (dev->private) {
439 if (devpriv->valid) 437 if (devpriv->valid)
440 pci1723_reset(dev); 438 pci1723_reset(dev);
441
442 if (devpriv->pcidev) { 439 if (devpriv->pcidev) {
443 if (dev->iobase) 440 if (dev->iobase)
444 comedi_pci_disable(devpriv->pcidev); 441 comedi_pci_disable(devpriv->pcidev);
445 pci_dev_put(devpriv->pcidev); 442 pci_dev_put(devpriv->pcidev);
446 } 443 }
447 } 444 }
448
449 return 0;
450} 445}
451 446
452static struct comedi_driver adv_pci1723_driver = { 447static struct comedi_driver adv_pci1723_driver = {
diff --git a/drivers/staging/comedi/drivers/adv_pci_dio.c b/drivers/staging/comedi/drivers/adv_pci_dio.c
index 9d3868e65024..43a32dc12cde 100644
--- a/drivers/staging/comedi/drivers/adv_pci_dio.c
+++ b/drivers/staging/comedi/drivers/adv_pci_dio.c
@@ -1210,7 +1210,7 @@ static int pci_dio_attach(struct comedi_device *dev,
1210 return 0; 1210 return 0;
1211} 1211}
1212 1212
1213static int pci_dio_detach(struct comedi_device *dev) 1213static void pci_dio_detach(struct comedi_device *dev)
1214{ 1214{
1215 int i, j; 1215 int i, j;
1216 struct comedi_subdevice *s; 1216 struct comedi_subdevice *s;
@@ -1219,20 +1219,14 @@ static int pci_dio_detach(struct comedi_device *dev)
1219 if (dev->private) { 1219 if (dev->private) {
1220 if (devpriv->valid) 1220 if (devpriv->valid)
1221 pci_dio_reset(dev); 1221 pci_dio_reset(dev);
1222
1223
1224 /* This shows the silliness of using this kind of
1225 * scheme for numbering subdevices. Don't do it. --ds */
1226 subdev = 0; 1222 subdev = 0;
1227 for (i = 0; i < MAX_DI_SUBDEVS; i++) { 1223 for (i = 0; i < MAX_DI_SUBDEVS; i++) {
1228 if (this_board->sdi[i].chans) 1224 if (this_board->sdi[i].chans)
1229 subdev++; 1225 subdev++;
1230
1231 } 1226 }
1232 for (i = 0; i < MAX_DO_SUBDEVS; i++) { 1227 for (i = 0; i < MAX_DO_SUBDEVS; i++) {
1233 if (this_board->sdo[i].chans) 1228 if (this_board->sdo[i].chans)
1234 subdev++; 1229 subdev++;
1235
1236 } 1230 }
1237 for (i = 0; i < MAX_DIO_SUBDEVG; i++) { 1231 for (i = 0; i < MAX_DIO_SUBDEVG; i++) {
1238 for (j = 0; j < this_board->sdio[i].regs; j++) { 1232 for (j = 0; j < this_board->sdio[i].regs; j++) {
@@ -1241,37 +1235,27 @@ static int pci_dio_detach(struct comedi_device *dev)
1241 subdev++; 1235 subdev++;
1242 } 1236 }
1243 } 1237 }
1244
1245 if (this_board->boardid.chans) 1238 if (this_board->boardid.chans)
1246 subdev++; 1239 subdev++;
1247
1248 for (i = 0; i < MAX_8254_SUBDEVS; i++) 1240 for (i = 0; i < MAX_8254_SUBDEVS; i++)
1249 if (this_board->s8254[i].chans) 1241 if (this_board->s8254[i].chans)
1250 subdev++; 1242 subdev++;
1251
1252 for (i = 0; i < dev->n_subdevices; i++) { 1243 for (i = 0; i < dev->n_subdevices; i++) {
1253 s = dev->subdevices + i; 1244 s = dev->subdevices + i;
1254 s->private = NULL; 1245 s->private = NULL;
1255 } 1246 }
1256
1257 if (devpriv->pcidev) { 1247 if (devpriv->pcidev) {
1258 if (dev->iobase) 1248 if (dev->iobase)
1259 comedi_pci_disable(devpriv->pcidev); 1249 comedi_pci_disable(devpriv->pcidev);
1260
1261 pci_dev_put(devpriv->pcidev); 1250 pci_dev_put(devpriv->pcidev);
1262 } 1251 }
1263
1264 if (devpriv->prev) 1252 if (devpriv->prev)
1265 devpriv->prev->next = devpriv->next; 1253 devpriv->prev->next = devpriv->next;
1266 else 1254 else
1267 pci_priv = devpriv->next; 1255 pci_priv = devpriv->next;
1268
1269 if (devpriv->next) 1256 if (devpriv->next)
1270 devpriv->next->prev = devpriv->prev; 1257 devpriv->next->prev = devpriv->prev;
1271
1272 } 1258 }
1273
1274 return 0;
1275} 1259}
1276 1260
1277static struct comedi_driver adv_pci_dio_driver = { 1261static struct comedi_driver adv_pci_dio_driver = {
diff --git a/drivers/staging/comedi/drivers/aio_aio12_8.c b/drivers/staging/comedi/drivers/aio_aio12_8.c
index 1a28e67b366d..64d82bc4ffe4 100644
--- a/drivers/staging/comedi/drivers/aio_aio12_8.c
+++ b/drivers/staging/comedi/drivers/aio_aio12_8.c
@@ -209,12 +209,11 @@ static int aio_aio12_8_attach(struct comedi_device *dev,
209 return 0; 209 return 0;
210} 210}
211 211
212static int aio_aio12_8_detach(struct comedi_device *dev) 212static void aio_aio12_8_detach(struct comedi_device *dev)
213{ 213{
214 subdev_8255_cleanup(dev, &dev->subdevices[2]); 214 subdev_8255_cleanup(dev, &dev->subdevices[2]);
215 if (dev->iobase) 215 if (dev->iobase)
216 release_region(dev->iobase, 24); 216 release_region(dev->iobase, 24);
217 return 0;
218} 217}
219 218
220static struct comedi_driver aio_aio12_8_driver = { 219static struct comedi_driver aio_aio12_8_driver = {
diff --git a/drivers/staging/comedi/drivers/aio_iiro_16.c b/drivers/staging/comedi/drivers/aio_iiro_16.c
index 242255c45f31..04f6f94b1f47 100644
--- a/drivers/staging/comedi/drivers/aio_iiro_16.c
+++ b/drivers/staging/comedi/drivers/aio_iiro_16.c
@@ -149,14 +149,10 @@ static int aio_iiro_16_attach(struct comedi_device *dev,
149 return 1; 149 return 1;
150} 150}
151 151
152static int aio_iiro_16_detach(struct comedi_device *dev) 152static void aio_iiro_16_detach(struct comedi_device *dev)
153{ 153{
154 printk(KERN_INFO "comedi%d: aio_iiro_16: remove\n", dev->minor);
155
156 if (dev->iobase) 154 if (dev->iobase)
157 release_region(dev->iobase, AIO_IIRO_16_SIZE); 155 release_region(dev->iobase, AIO_IIRO_16_SIZE);
158
159 return 0;
160} 156}
161 157
162static struct comedi_driver aio_iiro_16_driver = { 158static struct comedi_driver aio_iiro_16_driver = {
diff --git a/drivers/staging/comedi/drivers/amplc_dio200.c b/drivers/staging/comedi/drivers/amplc_dio200.c
index cbfa0cd6a1d5..c9c5d97b3ca2 100644
--- a/drivers/staging/comedi/drivers/amplc_dio200.c
+++ b/drivers/staging/comedi/drivers/amplc_dio200.c
@@ -493,7 +493,7 @@ struct dio200_subdev_intr {
493 */ 493 */
494static int dio200_attach(struct comedi_device *dev, 494static int dio200_attach(struct comedi_device *dev,
495 struct comedi_devconfig *it); 495 struct comedi_devconfig *it);
496static int dio200_detach(struct comedi_device *dev); 496static void dio200_detach(struct comedi_device *dev);
497static struct comedi_driver driver_amplc_dio200 = { 497static struct comedi_driver driver_amplc_dio200 = {
498 .driver_name = DIO200_DRIVER_NAME, 498 .driver_name = DIO200_DRIVER_NAME,
499 .module = THIS_MODULE, 499 .module = THIS_MODULE,
@@ -1518,22 +1518,11 @@ static int dio200_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1518 return 1; 1518 return 1;
1519} 1519}
1520 1520
1521/* 1521static void dio200_detach(struct comedi_device *dev)
1522 * _detach is called to deconfigure a device. It should deallocate
1523 * resources.
1524 * This function is also called when _attach() fails, so it should be
1525 * careful not to release resources that were not necessarily
1526 * allocated by _attach(). dev->private and dev->subdevices are
1527 * deallocated automatically by the core.
1528 */
1529static int dio200_detach(struct comedi_device *dev)
1530{ 1522{
1531 const struct dio200_layout_struct *layout; 1523 const struct dio200_layout_struct *layout;
1532 unsigned n; 1524 unsigned n;
1533 1525
1534 printk(KERN_DEBUG "comedi%d: %s: detach\n", dev->minor,
1535 DIO200_DRIVER_NAME);
1536
1537 if (dev->irq) 1526 if (dev->irq)
1538 free_irq(dev->irq, dev); 1527 free_irq(dev->irq, dev);
1539 if (dev->subdevices) { 1528 if (dev->subdevices) {
@@ -1570,11 +1559,6 @@ static int dio200_detach(struct comedi_device *dev)
1570#endif 1559#endif
1571 } 1560 }
1572 } 1561 }
1573 if (dev->board_name)
1574 printk(KERN_INFO "comedi%d: %s removed\n",
1575 dev->minor, dev->board_name);
1576
1577 return 0;
1578} 1562}
1579 1563
1580MODULE_AUTHOR("Comedi http://www.comedi.org"); 1564MODULE_AUTHOR("Comedi http://www.comedi.org");
diff --git a/drivers/staging/comedi/drivers/amplc_pc236.c b/drivers/staging/comedi/drivers/amplc_pc236.c
index 821cf1dda578..57ba3228b1a9 100644
--- a/drivers/staging/comedi/drivers/amplc_pc236.c
+++ b/drivers/staging/comedi/drivers/amplc_pc236.c
@@ -176,7 +176,7 @@ struct pc236_private {
176 * the device code. 176 * the device code.
177 */ 177 */
178static int pc236_attach(struct comedi_device *dev, struct comedi_devconfig *it); 178static int pc236_attach(struct comedi_device *dev, struct comedi_devconfig *it);
179static int pc236_detach(struct comedi_device *dev); 179static void pc236_detach(struct comedi_device *dev);
180static struct comedi_driver driver_amplc_pc236 = { 180static struct comedi_driver driver_amplc_pc236 = {
181 .driver_name = PC236_DRIVER_NAME, 181 .driver_name = PC236_DRIVER_NAME,
182 .module = THIS_MODULE, 182 .module = THIS_MODULE,
@@ -477,21 +477,10 @@ static int pc236_attach(struct comedi_device *dev, struct comedi_devconfig *it)
477 return 1; 477 return 1;
478} 478}
479 479
480/* 480static void pc236_detach(struct comedi_device *dev)
481 * _detach is called to deconfigure a device. It should deallocate
482 * resources.
483 * This function is also called when _attach() fails, so it should be
484 * careful not to release resources that were not necessarily
485 * allocated by _attach(). dev->private and dev->subdevices are
486 * deallocated automatically by the core.
487 */
488static int pc236_detach(struct comedi_device *dev)
489{ 481{
490 printk(KERN_DEBUG "comedi%d: %s: detach\n", dev->minor,
491 PC236_DRIVER_NAME);
492 if (devpriv) 482 if (devpriv)
493 pc236_intr_disable(dev); 483 pc236_intr_disable(dev);
494
495 if (dev->irq) 484 if (dev->irq)
496 free_irq(dev->irq, dev); 485 free_irq(dev->irq, dev);
497 if (dev->subdevices) 486 if (dev->subdevices)
@@ -511,11 +500,6 @@ static int pc236_detach(struct comedi_device *dev)
511#endif 500#endif
512 } 501 }
513 } 502 }
514 if (dev->board_name) {
515 printk(KERN_INFO "comedi%d: %s removed\n",
516 dev->minor, dev->board_name);
517 }
518 return 0;
519} 503}
520 504
521/* 505/*
diff --git a/drivers/staging/comedi/drivers/amplc_pc263.c b/drivers/staging/comedi/drivers/amplc_pc263.c
index 58ef6e4cc110..974d7450051e 100644
--- a/drivers/staging/comedi/drivers/amplc_pc263.c
+++ b/drivers/staging/comedi/drivers/amplc_pc263.c
@@ -141,7 +141,7 @@ struct pc263_private {
141 * the device code. 141 * the device code.
142 */ 142 */
143static int pc263_attach(struct comedi_device *dev, struct comedi_devconfig *it); 143static int pc263_attach(struct comedi_device *dev, struct comedi_devconfig *it);
144static int pc263_detach(struct comedi_device *dev); 144static void pc263_detach(struct comedi_device *dev);
145static struct comedi_driver driver_amplc_pc263 = { 145static struct comedi_driver driver_amplc_pc263 = {
146 .driver_name = PC263_DRIVER_NAME, 146 .driver_name = PC263_DRIVER_NAME,
147 .module = THIS_MODULE, 147 .module = THIS_MODULE,
@@ -355,19 +355,8 @@ static int pc263_attach(struct comedi_device *dev, struct comedi_devconfig *it)
355 return 1; 355 return 1;
356} 356}
357 357
358/* 358static void pc263_detach(struct comedi_device *dev)
359 * _detach is called to deconfigure a device. It should deallocate
360 * resources.
361 * This function is also called when _attach() fails, so it should be
362 * careful not to release resources that were not necessarily
363 * allocated by _attach(). dev->private and dev->subdevices are
364 * deallocated automatically by the core.
365 */
366static int pc263_detach(struct comedi_device *dev)
367{ 359{
368 printk(KERN_DEBUG "comedi%d: %s: detach\n", dev->minor,
369 PC263_DRIVER_NAME);
370
371#ifdef CONFIG_COMEDI_AMPLC_PC263_PCI 360#ifdef CONFIG_COMEDI_AMPLC_PC263_PCI
372 if (devpriv) 361 if (devpriv)
373#endif 362#endif
@@ -386,11 +375,6 @@ static int pc263_detach(struct comedi_device *dev)
386#endif 375#endif
387 } 376 }
388 } 377 }
389 if (dev->board_name) {
390 printk(KERN_INFO "comedi%d: %s removed\n",
391 dev->minor, dev->board_name);
392 }
393 return 0;
394} 378}
395 379
396/* 380/*
diff --git a/drivers/staging/comedi/drivers/amplc_pci224.c b/drivers/staging/comedi/drivers/amplc_pci224.c
index 8b515f31cc9b..fbf19cae8747 100644
--- a/drivers/staging/comedi/drivers/amplc_pci224.c
+++ b/drivers/staging/comedi/drivers/amplc_pci224.c
@@ -1522,13 +1522,10 @@ pci224_attach_pci(struct comedi_device *dev, struct pci_dev *pci_dev)
1522 return pci224_attach_common(dev, pci_dev, NULL); 1522 return pci224_attach_common(dev, pci_dev, NULL);
1523} 1523}
1524 1524
1525static int pci224_detach(struct comedi_device *dev) 1525static void pci224_detach(struct comedi_device *dev)
1526{ 1526{
1527 printk(KERN_DEBUG "comedi%d: %s: detach\n", dev->minor, DRIVER_NAME);
1528
1529 if (dev->irq) 1527 if (dev->irq)
1530 free_irq(dev->irq, dev); 1528 free_irq(dev->irq, dev);
1531
1532 if (dev->subdevices) { 1529 if (dev->subdevices) {
1533 struct comedi_subdevice *s; 1530 struct comedi_subdevice *s;
1534 1531
@@ -1543,16 +1540,9 @@ static int pci224_detach(struct comedi_device *dev)
1543 if (devpriv->pci_dev) { 1540 if (devpriv->pci_dev) {
1544 if (dev->iobase) 1541 if (dev->iobase)
1545 comedi_pci_disable(devpriv->pci_dev); 1542 comedi_pci_disable(devpriv->pci_dev);
1546
1547 pci_dev_put(devpriv->pci_dev); 1543 pci_dev_put(devpriv->pci_dev);
1548 } 1544 }
1549 } 1545 }
1550 if (dev->board_name) {
1551 printk(KERN_INFO "comedi%d: %s removed\n",
1552 dev->minor, dev->board_name);
1553 }
1554
1555 return 0;
1556} 1546}
1557 1547
1558static struct comedi_driver amplc_pci224_driver = { 1548static struct comedi_driver amplc_pci224_driver = {
diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c
index 2a23f158c288..d4c80b1281f2 100644
--- a/drivers/staging/comedi/drivers/amplc_pci230.c
+++ b/drivers/staging/comedi/drivers/amplc_pci230.c
@@ -937,35 +937,19 @@ static int pci230_attach(struct comedi_device *dev, struct comedi_devconfig *it)
937 return 1; 937 return 1;
938} 938}
939 939
940/* 940static void pci230_detach(struct comedi_device *dev)
941 * _detach is called to deconfigure a device. It should deallocate
942 * resources.
943 * This function is also called when _attach() fails, so it should be
944 * careful not to release resources that were not necessarily
945 * allocated by _attach(). dev->private and dev->subdevices are
946 * deallocated automatically by the core.
947 */
948static int pci230_detach(struct comedi_device *dev)
949{ 941{
950 printk("comedi%d: amplc_pci230: remove\n", dev->minor);
951
952 if (dev->subdevices && thisboard->have_dio) 942 if (dev->subdevices && thisboard->have_dio)
953 /* Clean up dio subdevice. */
954 subdev_8255_cleanup(dev, dev->subdevices + 2); 943 subdev_8255_cleanup(dev, dev->subdevices + 2);
955
956 if (dev->irq) 944 if (dev->irq)
957 free_irq(dev->irq, dev); 945 free_irq(dev->irq, dev);
958
959 if (devpriv) { 946 if (devpriv) {
960 if (devpriv->pci_dev) { 947 if (devpriv->pci_dev) {
961 if (dev->iobase) 948 if (dev->iobase)
962 comedi_pci_disable(devpriv->pci_dev); 949 comedi_pci_disable(devpriv->pci_dev);
963
964 pci_dev_put(devpriv->pci_dev); 950 pci_dev_put(devpriv->pci_dev);
965 } 951 }
966 } 952 }
967
968 return 0;
969} 953}
970 954
971static int get_resources(struct comedi_device *dev, unsigned int res_mask, 955static int get_resources(struct comedi_device *dev, unsigned int res_mask,
diff --git a/drivers/staging/comedi/drivers/c6xdigio.c b/drivers/staging/comedi/drivers/c6xdigio.c
index 56dd33ae0d5b..fb9951a746a6 100644
--- a/drivers/staging/comedi/drivers/c6xdigio.c
+++ b/drivers/staging/comedi/drivers/c6xdigio.c
@@ -397,10 +397,6 @@ static void board_init(struct comedi_device *dev)
397 397
398} 398}
399 399
400/* static void board_halt(struct comedi_device *dev) { */
401/* C6X_pwmInit(dev->iobase); */
402/* } */
403
404/* 400/*
405 options[0] - I/O port 401 options[0] - I/O port
406 options[1] - irq 402 options[1] - irq
@@ -490,22 +486,13 @@ static int c6xdigio_attach(struct comedi_device *dev,
490 return 0; 486 return 0;
491} 487}
492 488
493static int c6xdigio_detach(struct comedi_device *dev) 489static void c6xdigio_detach(struct comedi_device *dev)
494{ 490{
495 /* board_halt(dev); may not need this */
496
497 printk(KERN_DEBUG "comedi%d: c6xdigio: remove\n", dev->minor);
498
499 if (dev->iobase) 491 if (dev->iobase)
500 release_region(dev->iobase, C6XDIGIO_SIZE); 492 release_region(dev->iobase, C6XDIGIO_SIZE);
501
502 /* Not using IRQ so I am not sure if I need this */
503 if (dev->irq) 493 if (dev->irq)
504 free_irq(dev->irq, dev); 494 free_irq(dev->irq, dev);
505
506 pnp_unregister_driver(&c6xdigio_pnp_driver); 495 pnp_unregister_driver(&c6xdigio_pnp_driver);
507
508 return 0;
509} 496}
510 497
511static struct comedi_driver c6xdigio_driver = { 498static struct comedi_driver c6xdigio_driver = {
diff --git a/drivers/staging/comedi/drivers/cb_das16_cs.c b/drivers/staging/comedi/drivers/cb_das16_cs.c
index 49404f49f7b7..35159235a1b6 100644
--- a/drivers/staging/comedi/drivers/cb_das16_cs.c
+++ b/drivers/staging/comedi/drivers/cb_das16_cs.c
@@ -91,7 +91,7 @@ struct das16cs_private {
91 91
92static int das16cs_attach(struct comedi_device *dev, 92static int das16cs_attach(struct comedi_device *dev,
93 struct comedi_devconfig *it); 93 struct comedi_devconfig *it);
94static int das16cs_detach(struct comedi_device *dev); 94static void das16cs_detach(struct comedi_device *dev);
95static struct comedi_driver driver_das16cs = { 95static struct comedi_driver driver_das16cs = {
96 .driver_name = "cb_das16_cs", 96 .driver_name = "cb_das16_cs",
97 .module = THIS_MODULE, 97 .module = THIS_MODULE,
@@ -255,15 +255,10 @@ static int das16cs_attach(struct comedi_device *dev,
255 return 1; 255 return 1;
256} 256}
257 257
258static int das16cs_detach(struct comedi_device *dev) 258static void das16cs_detach(struct comedi_device *dev)
259{ 259{
260 dev_dbg(dev->hw_dev, "comedi%d: das16cs: remove\n", dev->minor);
261
262 if (dev->irq) 260 if (dev->irq)
263 free_irq(dev->irq, dev); 261 free_irq(dev->irq, dev);
264
265
266 return 0;
267} 262}
268 263
269static irqreturn_t das16cs_interrupt(int irq, void *d) 264static irqreturn_t das16cs_interrupt(int irq, void *d)
diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c b/drivers/staging/comedi/drivers/cb_pcidas.c
index 7e119104480f..ee9e084bb96c 100644
--- a/drivers/staging/comedi/drivers/cb_pcidas.c
+++ b/drivers/staging/comedi/drivers/cb_pcidas.c
@@ -726,26 +726,12 @@ found:
726 return 1; 726 return 1;
727} 727}
728 728
729/* 729static void cb_pcidas_detach(struct comedi_device *dev)
730 * cb_pcidas_detach is called to deconfigure a device. It should deallocate
731 * resources.
732 * This function is also called when _attach() fails, so it should be
733 * careful not to release resources that were not necessarily
734 * allocated by _attach(). dev->private and dev->subdevices are
735 * deallocated automatically by the core.
736 */
737static int cb_pcidas_detach(struct comedi_device *dev)
738{ 730{
739
740 if (devpriv) { 731 if (devpriv) {
741 if (devpriv->s5933_config) { 732 if (devpriv->s5933_config) {
742 /* disable and clear interrupts on amcc s5933 */
743 outl(INTCSR_INBOX_INTR_STATUS, 733 outl(INTCSR_INBOX_INTR_STATUS,
744 devpriv->s5933_config + AMCC_OP_REG_INTCSR); 734 devpriv->s5933_config + AMCC_OP_REG_INTCSR);
745#ifdef CB_PCIDAS_DEBUG
746 dev_dbg(dev->hw_dev, "detaching, incsr is 0x%x\n",
747 inl(devpriv->s5933_config + AMCC_OP_REG_INTCSR));
748#endif
749 } 735 }
750 } 736 }
751 if (dev->irq) 737 if (dev->irq)
@@ -757,8 +743,6 @@ static int cb_pcidas_detach(struct comedi_device *dev)
757 comedi_pci_disable(devpriv->pci_dev); 743 comedi_pci_disable(devpriv->pci_dev);
758 pci_dev_put(devpriv->pci_dev); 744 pci_dev_put(devpriv->pci_dev);
759 } 745 }
760
761 return 0;
762} 746}
763 747
764/* 748/*
diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c
index bea5120efd85..9d0b8754ff5b 100644
--- a/drivers/staging/comedi/drivers/cb_pcidas64.c
+++ b/drivers/staging/comedi/drivers/cb_pcidas64.c
@@ -1790,15 +1790,7 @@ static int attach(struct comedi_device *dev, struct comedi_devconfig *it)
1790 return 0; 1790 return 0;
1791} 1791}
1792 1792
1793/* 1793static void detach(struct comedi_device *dev)
1794 * _detach is called to deconfigure a device. It should deallocate
1795 * resources.
1796 * This function is also called when _attach() fails, so it should be
1797 * careful not to release resources that were not necessarily
1798 * allocated by _attach(). dev->private and dev->subdevices are
1799 * deallocated automatically by the core.
1800 */
1801static int detach(struct comedi_device *dev)
1802{ 1794{
1803 unsigned int i; 1795 unsigned int i;
1804 1796
@@ -1860,8 +1852,6 @@ static int detach(struct comedi_device *dev)
1860 } 1852 }
1861 if (dev->subdevices) 1853 if (dev->subdevices)
1862 subdev_8255_cleanup(dev, dev->subdevices + 4); 1854 subdev_8255_cleanup(dev, dev->subdevices + 4);
1863
1864 return 0;
1865} 1855}
1866 1856
1867static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, 1857static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
diff --git a/drivers/staging/comedi/drivers/cb_pcidda.c b/drivers/staging/comedi/drivers/cb_pcidda.c
index 31b21aa7c11d..25ebca11eadc 100644
--- a/drivers/staging/comedi/drivers/cb_pcidda.c
+++ b/drivers/staging/comedi/drivers/cb_pcidda.c
@@ -374,19 +374,8 @@ found:
374 return 1; 374 return 1;
375} 375}
376 376
377/* 377static void cb_pcidda_detach(struct comedi_device *dev)
378 * _detach is called to deconfigure a device. It should deallocate
379 * resources.
380 * This function is also called when _attach() fails, so it should be
381 * careful not to release resources that were not necessarily
382 * allocated by _attach(). dev->private and dev->subdevices are
383 * deallocated automatically by the core.
384 */
385static int cb_pcidda_detach(struct comedi_device *dev)
386{ 378{
387/*
388 * Deallocate the I/O ports.
389 */
390 if (devpriv) { 379 if (devpriv) {
391 if (devpriv->pci_dev) { 380 if (devpriv->pci_dev) {
392 if (devpriv->dac) 381 if (devpriv->dac)
@@ -394,13 +383,10 @@ static int cb_pcidda_detach(struct comedi_device *dev)
394 pci_dev_put(devpriv->pci_dev); 383 pci_dev_put(devpriv->pci_dev);
395 } 384 }
396 } 385 }
397 /* cleanup 8255 */
398 if (dev->subdevices) { 386 if (dev->subdevices) {
399 subdev_8255_cleanup(dev, dev->subdevices + 1); 387 subdev_8255_cleanup(dev, dev->subdevices + 1);
400 subdev_8255_cleanup(dev, dev->subdevices + 2); 388 subdev_8255_cleanup(dev, dev->subdevices + 2);
401 } 389 }
402
403 return 0;
404} 390}
405 391
406/* 392/*
diff --git a/drivers/staging/comedi/drivers/cb_pcidio.c b/drivers/staging/comedi/drivers/cb_pcidio.c
index 47a2c9b1d219..713132c8dbb5 100644
--- a/drivers/staging/comedi/drivers/cb_pcidio.c
+++ b/drivers/staging/comedi/drivers/cb_pcidio.c
@@ -195,7 +195,7 @@ found:
195 return 1; 195 return 1;
196} 196}
197 197
198static int pcidio_detach(struct comedi_device *dev) 198static void pcidio_detach(struct comedi_device *dev)
199{ 199{
200 if (devpriv) { 200 if (devpriv) {
201 if (devpriv->pci_dev) { 201 if (devpriv->pci_dev) {
@@ -209,7 +209,6 @@ static int pcidio_detach(struct comedi_device *dev)
209 for (i = 0; i < thisboard->n_8255; i++) 209 for (i = 0; i < thisboard->n_8255; i++)
210 subdev_8255_cleanup(dev, dev->subdevices + i); 210 subdev_8255_cleanup(dev, dev->subdevices + i);
211 } 211 }
212 return 0;
213} 212}
214 213
215static struct comedi_driver cb_pcidio_driver = { 214static struct comedi_driver cb_pcidio_driver = {
diff --git a/drivers/staging/comedi/drivers/cb_pcimdas.c b/drivers/staging/comedi/drivers/cb_pcimdas.c
index 31541e1c97b4..5f834d02ec24 100644
--- a/drivers/staging/comedi/drivers/cb_pcimdas.c
+++ b/drivers/staging/comedi/drivers/cb_pcimdas.c
@@ -310,29 +310,8 @@ found:
310 return 1; 310 return 1;
311} 311}
312 312
313/* 313static void cb_pcimdas_detach(struct comedi_device *dev)
314 * _detach is called to deconfigure a device. It should deallocate
315 * resources.
316 * This function is also called when _attach() fails, so it should be
317 * careful not to release resources that were not necessarily
318 * allocated by _attach(). dev->private and dev->subdevices are
319 * deallocated automatically by the core.
320 */
321static int cb_pcimdas_detach(struct comedi_device *dev)
322{ 314{
323 if (devpriv) {
324 dev_dbg(dev->hw_dev, "devpriv->BADR0 = 0x%lx\n",
325 devpriv->BADR0);
326 dev_dbg(dev->hw_dev, "devpriv->BADR1 = 0x%lx\n",
327 devpriv->BADR1);
328 dev_dbg(dev->hw_dev, "devpriv->BADR2 = 0x%lx\n",
329 devpriv->BADR2);
330 dev_dbg(dev->hw_dev, "devpriv->BADR3 = 0x%lx\n",
331 devpriv->BADR3);
332 dev_dbg(dev->hw_dev, "devpriv->BADR4 = 0x%lx\n",
333 devpriv->BADR4);
334 }
335
336 if (dev->irq) 315 if (dev->irq)
337 free_irq(dev->irq, dev); 316 free_irq(dev->irq, dev);
338 if (devpriv) { 317 if (devpriv) {
@@ -342,8 +321,6 @@ static int cb_pcimdas_detach(struct comedi_device *dev)
342 pci_dev_put(devpriv->pci_dev); 321 pci_dev_put(devpriv->pci_dev);
343 } 322 }
344 } 323 }
345
346 return 0;
347} 324}
348 325
349/* 326/*
diff --git a/drivers/staging/comedi/drivers/cb_pcimdda.c b/drivers/staging/comedi/drivers/cb_pcimdda.c
index 857d0c3dd518..b339685e234d 100644
--- a/drivers/staging/comedi/drivers/cb_pcimdda.c
+++ b/drivers/staging/comedi/drivers/cb_pcimdda.c
@@ -150,7 +150,6 @@ struct board_private_struct {
150 unsigned long registers; /* set by probe */ 150 unsigned long registers; /* set by probe */
151 unsigned long dio_registers; 151 unsigned long dio_registers;
152 char attached_to_8255; /* boolean */ 152 char attached_to_8255; /* boolean */
153 char attached_successfully; /* boolean */
154 /* would be useful for a PCI device */ 153 /* would be useful for a PCI device */
155 struct pci_dev *pci_dev; 154 struct pci_dev *pci_dev;
156 155
@@ -283,44 +282,24 @@ static int attach(struct comedi_device *dev, struct comedi_devconfig *it)
283 s->type = COMEDI_SUBD_UNUSED; 282 s->type = COMEDI_SUBD_UNUSED;
284 } 283 }
285 284
286 devpriv->attached_successfully = 1;
287
288 printk("attached\n"); 285 printk("attached\n");
289 286
290 return 1; 287 return 1;
291} 288}
292 289
293/* 290static void detach(struct comedi_device *dev)
294 * _detach is called to deconfigure a device. It should deallocate
295 * resources.
296 * This function is also called when _attach() fails, so it should be
297 * careful not to release resources that were not necessarily
298 * allocated by _attach(). dev->private and dev->subdevices are
299 * deallocated automatically by the core.
300 */
301static int detach(struct comedi_device *dev)
302{ 291{
303 if (devpriv) { 292 if (devpriv) {
304
305 if (dev->subdevices && devpriv->attached_to_8255) { 293 if (dev->subdevices && devpriv->attached_to_8255) {
306 /* de-register us from the 8255 driver */
307 subdev_8255_cleanup(dev, dev->subdevices + 2); 294 subdev_8255_cleanup(dev, dev->subdevices + 2);
308 devpriv->attached_to_8255 = 0; 295 devpriv->attached_to_8255 = 0;
309 } 296 }
310
311 if (devpriv->pci_dev) { 297 if (devpriv->pci_dev) {
312 if (devpriv->registers) 298 if (devpriv->registers)
313 comedi_pci_disable(devpriv->pci_dev); 299 comedi_pci_disable(devpriv->pci_dev);
314 pci_dev_put(devpriv->pci_dev); 300 pci_dev_put(devpriv->pci_dev);
315 } 301 }
316
317 if (devpriv->attached_successfully && thisboard)
318 printk("comedi%d: %s: detached\n", dev->minor,
319 thisboard->name);
320
321 } 302 }
322
323 return 0;
324} 303}
325 304
326static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, 305static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
diff --git a/drivers/staging/comedi/drivers/comedi_bond.c b/drivers/staging/comedi/drivers/comedi_bond.c
index 4507bab1f14c..29412de06c31 100644
--- a/drivers/staging/comedi/drivers/comedi_bond.c
+++ b/drivers/staging/comedi/drivers/comedi_bond.c
@@ -332,30 +332,6 @@ static int doDevConfig(struct comedi_device *dev, struct comedi_devconfig *it)
332 return 1; 332 return 1;
333} 333}
334 334
335static void doDevUnconfig(struct comedi_device *dev)
336{
337 unsigned long devs_closed = 0;
338
339 if (devpriv) {
340 while (devpriv->ndevs-- && devpriv->devs) {
341 struct BondedDevice *bdev;
342
343 bdev = devpriv->devs[devpriv->ndevs];
344 if (!bdev)
345 continue;
346 if (!(devs_closed & (0x1 << bdev->minor))) {
347 comedi_close(bdev->dev);
348 devs_closed |= (0x1 << bdev->minor);
349 }
350 kfree(bdev);
351 }
352 kfree(devpriv->devs);
353 devpriv->devs = NULL;
354 kfree(devpriv);
355 dev->private = NULL;
356 }
357}
358
359static int bonding_attach(struct comedi_device *dev, 335static int bonding_attach(struct comedi_device *dev,
360 struct comedi_devconfig *it) 336 struct comedi_devconfig *it)
361{ 337{
@@ -406,11 +382,28 @@ static int bonding_attach(struct comedi_device *dev,
406 return 1; 382 return 1;
407} 383}
408 384
409static int bonding_detach(struct comedi_device *dev) 385static void bonding_detach(struct comedi_device *dev)
410{ 386{
411 LOG_MSG("comedi%d: remove\n", dev->minor); 387 unsigned long devs_closed = 0;
412 doDevUnconfig(dev); 388
413 return 0; 389 if (devpriv) {
390 while (devpriv->ndevs-- && devpriv->devs) {
391 struct BondedDevice *bdev;
392
393 bdev = devpriv->devs[devpriv->ndevs];
394 if (!bdev)
395 continue;
396 if (!(devs_closed & (0x1 << bdev->minor))) {
397 comedi_close(bdev->dev);
398 devs_closed |= (0x1 << bdev->minor);
399 }
400 kfree(bdev);
401 }
402 kfree(devpriv->devs);
403 devpriv->devs = NULL;
404 kfree(devpriv);
405 dev->private = NULL;
406 }
414} 407}
415 408
416static const struct BondingBoard bondingBoards[] = { 409static const struct BondingBoard bondingBoards[] = {
diff --git a/drivers/staging/comedi/drivers/comedi_parport.c b/drivers/staging/comedi/drivers/comedi_parport.c
index 117211430070..bff5dcd76107 100644
--- a/drivers/staging/comedi/drivers/comedi_parport.c
+++ b/drivers/staging/comedi/drivers/comedi_parport.c
@@ -372,17 +372,12 @@ static int parport_attach(struct comedi_device *dev,
372 return 1; 372 return 1;
373} 373}
374 374
375static int parport_detach(struct comedi_device *dev) 375static void parport_detach(struct comedi_device *dev)
376{ 376{
377 printk(KERN_INFO "comedi%d: parport: remove\n", dev->minor);
378
379 if (dev->iobase) 377 if (dev->iobase)
380 release_region(dev->iobase, PARPORT_SIZE); 378 release_region(dev->iobase, PARPORT_SIZE);
381
382 if (dev->irq) 379 if (dev->irq)
383 free_irq(dev->irq, dev); 380 free_irq(dev->irq, dev);
384
385 return 0;
386} 381}
387 382
388static struct comedi_driver parport_driver = { 383static struct comedi_driver parport_driver = {
diff --git a/drivers/staging/comedi/drivers/comedi_test.c b/drivers/staging/comedi/drivers/comedi_test.c
index 6594046c1c62..873e37450bba 100644
--- a/drivers/staging/comedi/drivers/comedi_test.c
+++ b/drivers/staging/comedi/drivers/comedi_test.c
@@ -494,14 +494,10 @@ static int waveform_attach(struct comedi_device *dev,
494 return 1; 494 return 1;
495} 495}
496 496
497static int waveform_detach(struct comedi_device *dev) 497static void waveform_detach(struct comedi_device *dev)
498{ 498{
499 printk("comedi%d: comedi_test: remove\n", dev->minor);
500
501 if (dev->private) 499 if (dev->private)
502 waveform_ai_cancel(dev, dev->read_subdev); 500 waveform_ai_cancel(dev, dev->read_subdev);
503
504 return 0;
505} 501}
506 502
507static const struct waveform_board waveform_boards[] = { 503static const struct waveform_board waveform_boards[] = {
diff --git a/drivers/staging/comedi/drivers/contec_pci_dio.c b/drivers/staging/comedi/drivers/contec_pci_dio.c
index 9dc3a92b569e..b8bac80f2baf 100644
--- a/drivers/staging/comedi/drivers/contec_pci_dio.c
+++ b/drivers/staging/comedi/drivers/contec_pci_dio.c
@@ -169,17 +169,13 @@ static int contec_attach(struct comedi_device *dev, struct comedi_devconfig *it)
169 return -EIO; 169 return -EIO;
170} 170}
171 171
172static int contec_detach(struct comedi_device *dev) 172static void contec_detach(struct comedi_device *dev)
173{ 173{
174 printk("comedi%d: contec: remove\n", dev->minor);
175
176 if (devpriv && devpriv->pci_dev) { 174 if (devpriv && devpriv->pci_dev) {
177 if (dev->iobase) 175 if (dev->iobase)
178 comedi_pci_disable(devpriv->pci_dev); 176 comedi_pci_disable(devpriv->pci_dev);
179 pci_dev_put(devpriv->pci_dev); 177 pci_dev_put(devpriv->pci_dev);
180 } 178 }
181
182 return 0;
183} 179}
184 180
185static struct comedi_driver contec_pci_dio_driver = { 181static struct comedi_driver contec_pci_dio_driver = {
diff --git a/drivers/staging/comedi/drivers/daqboard2000.c b/drivers/staging/comedi/drivers/daqboard2000.c
index dc974ce24ebf..696b58ca2e59 100644
--- a/drivers/staging/comedi/drivers/daqboard2000.c
+++ b/drivers/staging/comedi/drivers/daqboard2000.c
@@ -836,14 +836,12 @@ out:
836 return result; 836 return result;
837} 837}
838 838
839static int daqboard2000_detach(struct comedi_device *dev) 839static void daqboard2000_detach(struct comedi_device *dev)
840{ 840{
841 if (dev->subdevices) 841 if (dev->subdevices)
842 subdev_8255_cleanup(dev, dev->subdevices + 2); 842 subdev_8255_cleanup(dev, dev->subdevices + 2);
843
844 if (dev->irq) 843 if (dev->irq)
845 free_irq(dev->irq, dev); 844 free_irq(dev->irq, dev);
846
847 if (devpriv) { 845 if (devpriv) {
848 if (devpriv->daq) 846 if (devpriv->daq)
849 iounmap(devpriv->daq); 847 iounmap(devpriv->daq);
@@ -855,7 +853,6 @@ static int daqboard2000_detach(struct comedi_device *dev)
855 pci_dev_put(devpriv->pci_dev); 853 pci_dev_put(devpriv->pci_dev);
856 } 854 }
857 } 855 }
858 return 0;
859} 856}
860 857
861static struct comedi_driver daqboard2000_driver = { 858static struct comedi_driver daqboard2000_driver = {
diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c
index 575c5cc31176..1f319435e23f 100644
--- a/drivers/staging/comedi/drivers/das08.c
+++ b/drivers/staging/comedi/drivers/das08.c
@@ -1079,15 +1079,10 @@ static int das08_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1079} 1079}
1080#endif /* DO_COMEDI_DRIVER_REGISTER */ 1080#endif /* DO_COMEDI_DRIVER_REGISTER */
1081 1081
1082 1082void das08_common_detach(struct comedi_device *dev)
1083int das08_common_detach(struct comedi_device *dev)
1084{ 1083{
1085 printk(KERN_INFO "comedi%d: das08: remove\n", dev->minor);
1086
1087 if (dev->subdevices) 1084 if (dev->subdevices)
1088 subdev_8255_cleanup(dev, dev->subdevices + 4); 1085 subdev_8255_cleanup(dev, dev->subdevices + 4);
1089
1090 /* deallocate ioports for non-pcmcia, non-pci boards */
1091 if ((thisboard->bustype != pcmcia) && (thisboard->bustype != pci)) { 1086 if ((thisboard->bustype != pcmcia) && (thisboard->bustype != pci)) {
1092 if (dev->iobase) 1087 if (dev->iobase)
1093 release_region(dev->iobase, thisboard->iosize); 1088 release_region(dev->iobase, thisboard->iosize);
@@ -1102,8 +1097,6 @@ int das08_common_detach(struct comedi_device *dev)
1102 } 1097 }
1103 } 1098 }
1104#endif 1099#endif
1105
1106 return 0;
1107} 1100}
1108EXPORT_SYMBOL_GPL(das08_common_detach); 1101EXPORT_SYMBOL_GPL(das08_common_detach);
1109 1102
diff --git a/drivers/staging/comedi/drivers/das08.h b/drivers/staging/comedi/drivers/das08.h
index 2a30d764ddfc..0b92f24b261f 100644
--- a/drivers/staging/comedi/drivers/das08.h
+++ b/drivers/staging/comedi/drivers/das08.h
@@ -74,6 +74,6 @@ struct das08_private_struct {
74extern struct das08_board_struct das08_cs_boards[NUM_DAS08_CS_BOARDS]; 74extern struct das08_board_struct das08_cs_boards[NUM_DAS08_CS_BOARDS];
75 75
76int das08_common_attach(struct comedi_device *dev, unsigned long iobase); 76int das08_common_attach(struct comedi_device *dev, unsigned long iobase);
77int das08_common_detach(struct comedi_device *dev); 77void das08_common_detach(struct comedi_device *dev);
78 78
79#endif /* _DAS08_H */ 79#endif /* _DAS08_H */
diff --git a/drivers/staging/comedi/drivers/das16.c b/drivers/staging/comedi/drivers/das16.c
index 73c0a2d149d6..998444c1ba32 100644
--- a/drivers/staging/comedi/drivers/das16.c
+++ b/drivers/staging/comedi/drivers/das16.c
@@ -1362,15 +1362,11 @@ static int das16_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1362 return 0; 1362 return 0;
1363} 1363}
1364 1364
1365static int das16_detach(struct comedi_device *dev) 1365static void das16_detach(struct comedi_device *dev)
1366{ 1366{
1367 printk(KERN_INFO "comedi%d: das16: remove\n", dev->minor);
1368
1369 das16_reset(dev); 1367 das16_reset(dev);
1370
1371 if (dev->subdevices) 1368 if (dev->subdevices)
1372 subdev_8255_cleanup(dev, dev->subdevices + 4); 1369 subdev_8255_cleanup(dev, dev->subdevices + 4);
1373
1374 if (devpriv) { 1370 if (devpriv) {
1375 int i; 1371 int i;
1376 for (i = 0; i < 2; i++) { 1372 for (i = 0; i < 2; i++) {
@@ -1385,10 +1381,8 @@ static int das16_detach(struct comedi_device *dev)
1385 kfree(devpriv->user_ai_range_table); 1381 kfree(devpriv->user_ai_range_table);
1386 kfree(devpriv->user_ao_range_table); 1382 kfree(devpriv->user_ao_range_table);
1387 } 1383 }
1388
1389 if (dev->irq) 1384 if (dev->irq)
1390 free_irq(dev->irq, dev); 1385 free_irq(dev->irq, dev);
1391
1392 if (dev->iobase) { 1386 if (dev->iobase) {
1393 if (thisboard->size < 0x400) { 1387 if (thisboard->size < 0x400) {
1394 release_region(dev->iobase, thisboard->size); 1388 release_region(dev->iobase, thisboard->size);
@@ -1398,8 +1392,6 @@ static int das16_detach(struct comedi_device *dev)
1398 thisboard->size & 0x3ff); 1392 thisboard->size & 0x3ff);
1399 } 1393 }
1400 } 1394 }
1401
1402 return 0;
1403} 1395}
1404 1396
1405static const struct das16_board das16_boards[] = { 1397static const struct das16_board das16_boards[] = {
diff --git a/drivers/staging/comedi/drivers/das16m1.c b/drivers/staging/comedi/drivers/das16m1.c
index b22382e36eaa..d2e1490cd808 100644
--- a/drivers/staging/comedi/drivers/das16m1.c
+++ b/drivers/staging/comedi/drivers/das16m1.c
@@ -703,23 +703,16 @@ static int das16m1_attach(struct comedi_device *dev,
703 return 0; 703 return 0;
704} 704}
705 705
706static int das16m1_detach(struct comedi_device *dev) 706static void das16m1_detach(struct comedi_device *dev)
707{ 707{
708
709/* das16m1_reset(dev); */
710
711 if (dev->subdevices) 708 if (dev->subdevices)
712 subdev_8255_cleanup(dev, dev->subdevices + 3); 709 subdev_8255_cleanup(dev, dev->subdevices + 3);
713
714 if (dev->irq) 710 if (dev->irq)
715 free_irq(dev->irq, dev); 711 free_irq(dev->irq, dev);
716
717 if (dev->iobase) { 712 if (dev->iobase) {
718 release_region(dev->iobase, DAS16M1_SIZE); 713 release_region(dev->iobase, DAS16M1_SIZE);
719 release_region(dev->iobase + DAS16M1_82C55, DAS16M1_SIZE2); 714 release_region(dev->iobase + DAS16M1_82C55, DAS16M1_SIZE2);
720 } 715 }
721
722 return 0;
723} 716}
724 717
725static const struct das16m1_board das16m1_boards[] = { 718static const struct das16m1_board das16m1_boards[] = {
diff --git a/drivers/staging/comedi/drivers/das1800.c b/drivers/staging/comedi/drivers/das1800.c
index 0b1f499dea3a..2ac344354c1d 100644
--- a/drivers/staging/comedi/drivers/das1800.c
+++ b/drivers/staging/comedi/drivers/das1800.c
@@ -767,9 +767,8 @@ static int das1800_attach(struct comedi_device *dev,
767 return 0; 767 return 0;
768}; 768};
769 769
770static int das1800_detach(struct comedi_device *dev) 770static void das1800_detach(struct comedi_device *dev)
771{ 771{
772 /* only free stuff if it has been allocated by _attach */
773 if (dev->iobase) 772 if (dev->iobase)
774 release_region(dev->iobase, DAS1800_SIZE); 773 release_region(dev->iobase, DAS1800_SIZE);
775 if (dev->irq) 774 if (dev->irq)
@@ -784,11 +783,6 @@ static int das1800_detach(struct comedi_device *dev)
784 kfree(devpriv->ai_buf0); 783 kfree(devpriv->ai_buf0);
785 kfree(devpriv->ai_buf1); 784 kfree(devpriv->ai_buf1);
786 } 785 }
787
788 dev_dbg(dev->hw_dev, "comedi%d: %s: remove\n", dev->minor,
789 dev->driver->driver_name);
790
791 return 0;
792}; 786};
793 787
794/* probes and checks das-1800 series board type 788/* probes and checks das-1800 series board type
diff --git a/drivers/staging/comedi/drivers/das6402.c b/drivers/staging/comedi/drivers/das6402.c
index 889527dcf7b8..881f392d1dba 100644
--- a/drivers/staging/comedi/drivers/das6402.c
+++ b/drivers/staging/comedi/drivers/das6402.c
@@ -327,14 +327,12 @@ static int das6402_attach(struct comedi_device *dev,
327 return 0; 327 return 0;
328} 328}
329 329
330static int das6402_detach(struct comedi_device *dev) 330static void das6402_detach(struct comedi_device *dev)
331{ 331{
332 if (dev->irq) 332 if (dev->irq)
333 free_irq(dev->irq, dev); 333 free_irq(dev->irq, dev);
334 if (dev->iobase) 334 if (dev->iobase)
335 release_region(dev->iobase, DAS6402_SIZE); 335 release_region(dev->iobase, DAS6402_SIZE);
336
337 return 0;
338} 336}
339 337
340static struct comedi_driver das6402_driver = { 338static struct comedi_driver das6402_driver = {
diff --git a/drivers/staging/comedi/drivers/das800.c b/drivers/staging/comedi/drivers/das800.c
index 6e347b40fe61..a3a54e1c5c98 100644
--- a/drivers/staging/comedi/drivers/das800.c
+++ b/drivers/staging/comedi/drivers/das800.c
@@ -245,7 +245,7 @@ struct das800_private {
245 245
246static int das800_attach(struct comedi_device *dev, 246static int das800_attach(struct comedi_device *dev,
247 struct comedi_devconfig *it); 247 struct comedi_devconfig *it);
248static int das800_detach(struct comedi_device *dev); 248static void das800_detach(struct comedi_device *dev);
249static int das800_cancel(struct comedi_device *dev, struct comedi_subdevice *s); 249static int das800_cancel(struct comedi_device *dev, struct comedi_subdevice *s);
250 250
251static struct comedi_driver driver_das800 = { 251static struct comedi_driver driver_das800 = {
@@ -556,16 +556,12 @@ static int das800_attach(struct comedi_device *dev, struct comedi_devconfig *it)
556 return 0; 556 return 0;
557}; 557};
558 558
559static int das800_detach(struct comedi_device *dev) 559static void das800_detach(struct comedi_device *dev)
560{ 560{
561 dev_info(dev->hw_dev, "comedi%d: das800: remove\n", dev->minor);
562
563 /* only free stuff if it has been allocated by _attach */
564 if (dev->iobase) 561 if (dev->iobase)
565 release_region(dev->iobase, DAS800_SIZE); 562 release_region(dev->iobase, DAS800_SIZE);
566 if (dev->irq) 563 if (dev->irq)
567 free_irq(dev->irq, dev); 564 free_irq(dev->irq, dev);
568 return 0;
569}; 565};
570 566
571static int das800_cancel(struct comedi_device *dev, struct comedi_subdevice *s) 567static int das800_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
diff --git a/drivers/staging/comedi/drivers/dmm32at.c b/drivers/staging/comedi/drivers/dmm32at.c
index 2b4e6e6eb825..83828903db4b 100644
--- a/drivers/staging/comedi/drivers/dmm32at.c
+++ b/drivers/staging/comedi/drivers/dmm32at.c
@@ -224,7 +224,7 @@ struct dmm32at_private {
224 */ 224 */
225static int dmm32at_attach(struct comedi_device *dev, 225static int dmm32at_attach(struct comedi_device *dev,
226 struct comedi_devconfig *it); 226 struct comedi_devconfig *it);
227static int dmm32at_detach(struct comedi_device *dev); 227static void dmm32at_detach(struct comedi_device *dev);
228static struct comedi_driver driver_dmm32at = { 228static struct comedi_driver driver_dmm32at = {
229 .driver_name = "dmm32at", 229 .driver_name = "dmm32at",
230 .module = THIS_MODULE, 230 .module = THIS_MODULE,
@@ -450,23 +450,12 @@ static int dmm32at_attach(struct comedi_device *dev,
450 450
451} 451}
452 452
453/* 453static void dmm32at_detach(struct comedi_device *dev)
454 * _detach is called to deconfigure a device. It should deallocate
455 * resources.
456 * This function is also called when _attach() fails, so it should be
457 * careful not to release resources that were not necessarily
458 * allocated by _attach(). dev->private and dev->subdevices are
459 * deallocated automatically by the core.
460 */
461static int dmm32at_detach(struct comedi_device *dev)
462{ 454{
463 printk(KERN_INFO "comedi%d: dmm32at: remove\n", dev->minor);
464 if (dev->irq) 455 if (dev->irq)
465 free_irq(dev->irq, dev); 456 free_irq(dev->irq, dev);
466 if (dev->iobase) 457 if (dev->iobase)
467 release_region(dev->iobase, DMM32AT_MEMSIZE); 458 release_region(dev->iobase, DMM32AT_MEMSIZE);
468
469 return 0;
470} 459}
471 460
472/* 461/*
diff --git a/drivers/staging/comedi/drivers/dt2801.c b/drivers/staging/comedi/drivers/dt2801.c
index 7aafd850d274..625bd617a8e9 100644
--- a/drivers/staging/comedi/drivers/dt2801.c
+++ b/drivers/staging/comedi/drivers/dt2801.c
@@ -693,12 +693,10 @@ out:
693 return ret; 693 return ret;
694} 694}
695 695
696static int dt2801_detach(struct comedi_device *dev) 696static void dt2801_detach(struct comedi_device *dev)
697{ 697{
698 if (dev->iobase) 698 if (dev->iobase)
699 release_region(dev->iobase, DT2801_IOSIZE); 699 release_region(dev->iobase, DT2801_IOSIZE);
700
701 return 0;
702} 700}
703 701
704static struct comedi_driver dt2801_driver = { 702static struct comedi_driver dt2801_driver = {
diff --git a/drivers/staging/comedi/drivers/dt2811.c b/drivers/staging/comedi/drivers/dt2811.c
index 22924262e021..106ffea30b95 100644
--- a/drivers/staging/comedi/drivers/dt2811.c
+++ b/drivers/staging/comedi/drivers/dt2811.c
@@ -571,16 +571,12 @@ static int dt2811_attach(struct comedi_device *dev, struct comedi_devconfig *it)
571 return 0; 571 return 0;
572} 572}
573 573
574static int dt2811_detach(struct comedi_device *dev) 574static void dt2811_detach(struct comedi_device *dev)
575{ 575{
576 printk(KERN_INFO "comedi%d: dt2811: remove\n", dev->minor);
577
578 if (dev->irq) 576 if (dev->irq)
579 free_irq(dev->irq, dev); 577 free_irq(dev->irq, dev);
580 if (dev->iobase) 578 if (dev->iobase)
581 release_region(dev->iobase, DT2811_SIZE); 579 release_region(dev->iobase, DT2811_SIZE);
582
583 return 0;
584} 580}
585 581
586static const struct dt2811_board boardtypes[] = { 582static const struct dt2811_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/dt2814.c b/drivers/staging/comedi/drivers/dt2814.c
index a935e9c68dc8..fa4ade61be5f 100644
--- a/drivers/staging/comedi/drivers/dt2814.c
+++ b/drivers/staging/comedi/drivers/dt2814.c
@@ -361,17 +361,12 @@ static int dt2814_attach(struct comedi_device *dev, struct comedi_devconfig *it)
361 return 0; 361 return 0;
362} 362}
363 363
364static int dt2814_detach(struct comedi_device *dev) 364static void dt2814_detach(struct comedi_device *dev)
365{ 365{
366 printk(KERN_INFO "comedi%d: dt2814: remove\n", dev->minor);
367
368 if (dev->irq) 366 if (dev->irq)
369 free_irq(dev->irq, dev); 367 free_irq(dev->irq, dev);
370
371 if (dev->iobase) 368 if (dev->iobase)
372 release_region(dev->iobase, DT2814_SIZE); 369 release_region(dev->iobase, DT2814_SIZE);
373
374 return 0;
375} 370}
376 371
377static struct comedi_driver dt2814_driver = { 372static struct comedi_driver dt2814_driver = {
diff --git a/drivers/staging/comedi/drivers/dt2815.c b/drivers/staging/comedi/drivers/dt2815.c
index 152959c96408..bbab712be4b9 100644
--- a/drivers/staging/comedi/drivers/dt2815.c
+++ b/drivers/staging/comedi/drivers/dt2815.c
@@ -227,21 +227,12 @@ static int dt2815_attach(struct comedi_device *dev, struct comedi_devconfig *it)
227 return 0; 227 return 0;
228} 228}
229 229
230static void dt2815_free_resources(struct comedi_device *dev) 230static void dt2815_detach(struct comedi_device *dev)
231{ 231{
232 if (dev->iobase) 232 if (dev->iobase)
233 release_region(dev->iobase, DT2815_SIZE); 233 release_region(dev->iobase, DT2815_SIZE);
234} 234}
235 235
236static int dt2815_detach(struct comedi_device *dev)
237{
238 printk(KERN_INFO "comedi%d: dt2815: remove\n", dev->minor);
239
240 dt2815_free_resources(dev);
241
242 return 0;
243}
244
245static struct comedi_driver dt2815_driver = { 236static struct comedi_driver dt2815_driver = {
246 .driver_name = "dt2815", 237 .driver_name = "dt2815",
247 .module = THIS_MODULE, 238 .module = THIS_MODULE,
diff --git a/drivers/staging/comedi/drivers/dt2817.c b/drivers/staging/comedi/drivers/dt2817.c
index d8149f4bf008..1ee10e7bf1d2 100644
--- a/drivers/staging/comedi/drivers/dt2817.c
+++ b/drivers/staging/comedi/drivers/dt2817.c
@@ -159,14 +159,10 @@ static int dt2817_attach(struct comedi_device *dev, struct comedi_devconfig *it)
159 return 0; 159 return 0;
160} 160}
161 161
162static int dt2817_detach(struct comedi_device *dev) 162static void dt2817_detach(struct comedi_device *dev)
163{ 163{
164 printk(KERN_INFO "comedi%d: dt2817: remove\n", dev->minor);
165
166 if (dev->iobase) 164 if (dev->iobase)
167 release_region(dev->iobase, DT2817_SIZE); 165 release_region(dev->iobase, DT2817_SIZE);
168
169 return 0;
170} 166}
171 167
172static struct comedi_driver dt2817_driver = { 168static struct comedi_driver dt2817_driver = {
diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c
index 461a056f21ef..736d8facaee8 100644
--- a/drivers/staging/comedi/drivers/dt282x.c
+++ b/drivers/staging/comedi/drivers/dt282x.c
@@ -1331,7 +1331,7 @@ static int dt282x_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1331 return 0; 1331 return 0;
1332} 1332}
1333 1333
1334static void free_resources(struct comedi_device *dev) 1334static void dt282x_detach(struct comedi_device *dev)
1335{ 1335{
1336 if (dev->irq) 1336 if (dev->irq)
1337 free_irq(dev->irq, dev); 1337 free_irq(dev->irq, dev);
@@ -1349,15 +1349,6 @@ static void free_resources(struct comedi_device *dev)
1349 } 1349 }
1350} 1350}
1351 1351
1352static int dt282x_detach(struct comedi_device *dev)
1353{
1354 printk(KERN_INFO "comedi%d: dt282x: remove\n", dev->minor);
1355
1356 free_resources(dev);
1357
1358 return 0;
1359}
1360
1361static const struct dt282x_board boardtypes[] = { 1352static const struct dt282x_board boardtypes[] = {
1362 { 1353 {
1363 .name = "dt2821", 1354 .name = "dt2821",
diff --git a/drivers/staging/comedi/drivers/dt3000.c b/drivers/staging/comedi/drivers/dt3000.c
index 6d113cdee964..0d273269b572 100644
--- a/drivers/staging/comedi/drivers/dt3000.c
+++ b/drivers/staging/comedi/drivers/dt3000.c
@@ -944,11 +944,10 @@ static int dt3000_attach(struct comedi_device *dev, struct comedi_devconfig *it)
944 return 0; 944 return 0;
945} 945}
946 946
947static int dt3000_detach(struct comedi_device *dev) 947static void dt3000_detach(struct comedi_device *dev)
948{ 948{
949 if (dev->irq) 949 if (dev->irq)
950 free_irq(dev->irq, dev); 950 free_irq(dev->irq, dev);
951
952 if (devpriv) { 951 if (devpriv) {
953 if (devpriv->pci_dev) { 952 if (devpriv->pci_dev) {
954 if (devpriv->phys_addr) 953 if (devpriv->phys_addr)
@@ -958,8 +957,6 @@ static int dt3000_detach(struct comedi_device *dev)
958 if (devpriv->io_addr) 957 if (devpriv->io_addr)
959 iounmap(devpriv->io_addr); 958 iounmap(devpriv->io_addr);
960 } 959 }
961
962 return 0;
963} 960}
964 961
965static struct comedi_driver dt3000_driver = { 962static struct comedi_driver dt3000_driver = {
diff --git a/drivers/staging/comedi/drivers/dt9812.c b/drivers/staging/comedi/drivers/dt9812.c
index cd3a44a0bfcc..22cda5c76ce4 100644
--- a/drivers/staging/comedi/drivers/dt9812.c
+++ b/drivers/staging/comedi/drivers/dt9812.c
@@ -1111,9 +1111,9 @@ static int dt9812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1111 return 0; 1111 return 0;
1112} 1112}
1113 1113
1114static int dt9812_detach(struct comedi_device *dev) 1114static void dt9812_detach(struct comedi_device *dev)
1115{ 1115{
1116 return 0; 1116 /* Nothing to cleanup */
1117} 1117}
1118 1118
1119static struct comedi_driver dt9812_comedi_driver = { 1119static struct comedi_driver dt9812_comedi_driver = {
diff --git a/drivers/staging/comedi/drivers/dyna_pci10xx.c b/drivers/staging/comedi/drivers/dyna_pci10xx.c
index 23375deb3f30..b0cec7b1b0c9 100644
--- a/drivers/staging/comedi/drivers/dyna_pci10xx.c
+++ b/drivers/staging/comedi/drivers/dyna_pci10xx.c
@@ -387,14 +387,12 @@ found:
387 return 1; 387 return 1;
388} 388}
389 389
390static int dyna_pci10xx_detach(struct comedi_device *dev) 390static void dyna_pci10xx_detach(struct comedi_device *dev)
391{ 391{
392 if (devpriv && devpriv->pci_dev) { 392 if (devpriv && devpriv->pci_dev) {
393 comedi_pci_disable(devpriv->pci_dev); 393 comedi_pci_disable(devpriv->pci_dev);
394 mutex_destroy(&devpriv->mutex); 394 mutex_destroy(&devpriv->mutex);
395 } 395 }
396
397 return 0;
398} 396}
399 397
400static struct comedi_driver dyna_pci10xx_driver = { 398static struct comedi_driver dyna_pci10xx_driver = {
diff --git a/drivers/staging/comedi/drivers/fl512.c b/drivers/staging/comedi/drivers/fl512.c
index 25fed75b08b7..d23814450b40 100644
--- a/drivers/staging/comedi/drivers/fl512.c
+++ b/drivers/staging/comedi/drivers/fl512.c
@@ -174,12 +174,10 @@ static int fl512_attach(struct comedi_device *dev, struct comedi_devconfig *it)
174 return 1; 174 return 1;
175} 175}
176 176
177static int fl512_detach(struct comedi_device *dev) 177static void fl512_detach(struct comedi_device *dev)
178{ 178{
179 if (dev->iobase) 179 if (dev->iobase)
180 release_region(dev->iobase, FL512_SIZE); 180 release_region(dev->iobase, FL512_SIZE);
181 printk(KERN_INFO "comedi%d: fl512: dummy i detach\n", dev->minor);
182 return 0;
183} 181}
184 182
185static struct comedi_driver fl512_driver = { 183static struct comedi_driver fl512_driver = {
diff --git a/drivers/staging/comedi/drivers/gsc_hpdi.c b/drivers/staging/comedi/drivers/gsc_hpdi.c
index 3195022fc6f5..8aece08bd0dd 100644
--- a/drivers/staging/comedi/drivers/gsc_hpdi.c
+++ b/drivers/staging/comedi/drivers/gsc_hpdi.c
@@ -664,12 +664,10 @@ static int hpdi_attach(struct comedi_device *dev, struct comedi_devconfig *it)
664 return init_hpdi(dev); 664 return init_hpdi(dev);
665} 665}
666 666
667static int hpdi_detach(struct comedi_device *dev) 667static void hpdi_detach(struct comedi_device *dev)
668{ 668{
669 unsigned int i; 669 unsigned int i;
670 670
671 printk(KERN_WARNING "comedi%d: gsc_hpdi: remove\n", dev->minor);
672
673 if (dev->irq) 671 if (dev->irq)
674 free_irq(dev->irq, dev); 672 free_irq(dev->irq, dev);
675 if ((priv(dev)) && (priv(dev)->hw_dev)) { 673 if ((priv(dev)) && (priv(dev)->hw_dev)) {
@@ -702,7 +700,6 @@ static int hpdi_detach(struct comedi_device *dev)
702 comedi_pci_disable(priv(dev)->hw_dev); 700 comedi_pci_disable(priv(dev)->hw_dev);
703 pci_dev_put(priv(dev)->hw_dev); 701 pci_dev_put(priv(dev)->hw_dev);
704 } 702 }
705 return 0;
706} 703}
707 704
708static int dio_config_block_size(struct comedi_device *dev, unsigned int *data) 705static int dio_config_block_size(struct comedi_device *dev, unsigned int *data)
diff --git a/drivers/staging/comedi/drivers/icp_multi.c b/drivers/staging/comedi/drivers/icp_multi.c
index 0f63fc04b5fd..fdc596fb0990 100644
--- a/drivers/staging/comedi/drivers/icp_multi.c
+++ b/drivers/staging/comedi/drivers/icp_multi.c
@@ -1007,25 +1007,19 @@ static int icp_multi_attach(struct comedi_device *dev,
1007 return 0; 1007 return 0;
1008} 1008}
1009 1009
1010static int icp_multi_detach(struct comedi_device *dev) 1010static void icp_multi_detach(struct comedi_device *dev)
1011{ 1011{
1012 if (dev->private) 1012 if (dev->private)
1013 if (devpriv->valid) 1013 if (devpriv->valid)
1014 icp_multi_reset(dev); 1014 icp_multi_reset(dev);
1015
1016 if (dev->irq) 1015 if (dev->irq)
1017 free_irq(dev->irq, dev); 1016 free_irq(dev->irq, dev);
1018
1019 if (dev->private && devpriv->io_addr) 1017 if (dev->private && devpriv->io_addr)
1020 iounmap(devpriv->io_addr); 1018 iounmap(devpriv->io_addr);
1021
1022 if (dev->private && devpriv->card) 1019 if (dev->private && devpriv->card)
1023 pci_card_free(devpriv->card); 1020 pci_card_free(devpriv->card);
1024
1025 if (--pci_list_builded == 0) 1021 if (--pci_list_builded == 0)
1026 pci_card_list_cleanup(PCI_VENDOR_ID_ICP); 1022 pci_card_list_cleanup(PCI_VENDOR_ID_ICP);
1027
1028 return 0;
1029} 1023}
1030 1024
1031static const struct boardtype boardtypes[] = { 1025static const struct boardtype boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/ii_pci20kc.c b/drivers/staging/comedi/drivers/ii_pci20kc.c
index 6b1b5c88ca88..f0a579a04a7d 100644
--- a/drivers/staging/comedi/drivers/ii_pci20kc.c
+++ b/drivers/staging/comedi/drivers/ii_pci20kc.c
@@ -264,11 +264,9 @@ static int pci20xxx_attach(struct comedi_device *dev,
264 return 1; 264 return 1;
265} 265}
266 266
267static int pci20xxx_detach(struct comedi_device *dev) 267static void pci20xxx_detach(struct comedi_device *dev)
268{ 268{
269 printk(KERN_INFO "comedi%d: pci20xxx: remove\n", dev->minor); 269 /* Nothing to cleanup */
270
271 return 0;
272} 270}
273 271
274/* pci20006m */ 272/* pci20006m */
diff --git a/drivers/staging/comedi/drivers/jr3_pci.c b/drivers/staging/comedi/drivers/jr3_pci.c
index beb82d97d836..d536a11edb95 100644
--- a/drivers/staging/comedi/drivers/jr3_pci.c
+++ b/drivers/staging/comedi/drivers/jr3_pci.c
@@ -926,7 +926,7 @@ out:
926 return result; 926 return result;
927} 927}
928 928
929static int jr3_pci_detach(struct comedi_device *dev) 929static void jr3_pci_detach(struct comedi_device *dev)
930{ 930{
931 int i; 931 int i;
932 struct jr3_pci_dev_private *devpriv = dev->private; 932 struct jr3_pci_dev_private *devpriv = dev->private;
@@ -938,16 +938,13 @@ static int jr3_pci_detach(struct comedi_device *dev)
938 for (i = 0; i < devpriv->n_channels; i++) 938 for (i = 0; i < devpriv->n_channels; i++)
939 kfree(dev->subdevices[i].private); 939 kfree(dev->subdevices[i].private);
940 } 940 }
941
942 if (devpriv->iobase) 941 if (devpriv->iobase)
943 iounmap((void *)devpriv->iobase); 942 iounmap((void *)devpriv->iobase);
944 if (devpriv->pci_enabled) 943 if (devpriv->pci_enabled)
945 comedi_pci_disable(devpriv->pci_dev); 944 comedi_pci_disable(devpriv->pci_dev);
946
947 if (devpriv->pci_dev) 945 if (devpriv->pci_dev)
948 pci_dev_put(devpriv->pci_dev); 946 pci_dev_put(devpriv->pci_dev);
949 } 947 }
950 return 0;
951} 948}
952 949
953static struct comedi_driver jr3_pci_driver = { 950static struct comedi_driver jr3_pci_driver = {
diff --git a/drivers/staging/comedi/drivers/ke_counter.c b/drivers/staging/comedi/drivers/ke_counter.c
index 708704dbe436..09d191844bf8 100644
--- a/drivers/staging/comedi/drivers/ke_counter.c
+++ b/drivers/staging/comedi/drivers/ke_counter.c
@@ -219,16 +219,13 @@ found:
219 return 0; 219 return 0;
220} 220}
221 221
222static int cnt_detach(struct comedi_device *dev) 222static void cnt_detach(struct comedi_device *dev)
223{ 223{
224 if (devpriv && devpriv->pcidev) { 224 if (devpriv && devpriv->pcidev) {
225 if (dev->iobase) 225 if (dev->iobase)
226 comedi_pci_disable(devpriv->pcidev); 226 comedi_pci_disable(devpriv->pcidev);
227 pci_dev_put(devpriv->pcidev); 227 pci_dev_put(devpriv->pcidev);
228 } 228 }
229 printk(KERN_INFO "comedi%d: " CNT_DRIVER_NAME " remove\n",
230 dev->minor);
231 return 0;
232} 229}
233 230
234static struct comedi_driver ke_counter_driver = { 231static struct comedi_driver ke_counter_driver = {
diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c
index 879acbcca16c..8ca1b54600db 100644
--- a/drivers/staging/comedi/drivers/me4000.c
+++ b/drivers/staging/comedi/drivers/me4000.c
@@ -2304,10 +2304,8 @@ static int me4000_attach(struct comedi_device *dev, struct comedi_devconfig *it)
2304 return 0; 2304 return 0;
2305} 2305}
2306 2306
2307static int me4000_detach(struct comedi_device *dev) 2307static void me4000_detach(struct comedi_device *dev)
2308{ 2308{
2309 CALL_PDEBUG("In me4000_detach()\n");
2310
2311 if (info) { 2309 if (info) {
2312 if (info->pci_dev_p) { 2310 if (info->pci_dev_p) {
2313 reset_board(dev); 2311 reset_board(dev);
@@ -2316,8 +2314,6 @@ static int me4000_detach(struct comedi_device *dev)
2316 pci_dev_put(info->pci_dev_p); 2314 pci_dev_put(info->pci_dev_p);
2317 } 2315 }
2318 } 2316 }
2319
2320 return 0;
2321} 2317}
2322 2318
2323static struct comedi_driver me4000_driver = { 2319static struct comedi_driver me4000_driver = {
diff --git a/drivers/staging/comedi/drivers/me_daq.c b/drivers/staging/comedi/drivers/me_daq.c
index 1f99527a7fa9..ffe251250e6f 100644
--- a/drivers/staging/comedi/drivers/me_daq.c
+++ b/drivers/staging/comedi/drivers/me_daq.c
@@ -806,7 +806,7 @@ found:
806 return 0; 806 return 0;
807} 807}
808 808
809static int me_detach(struct comedi_device *dev) 809static void me_detach(struct comedi_device *dev)
810{ 810{
811 if (dev_private) { 811 if (dev_private) {
812 if (dev_private->me_regbase) { 812 if (dev_private->me_regbase) {
@@ -818,11 +818,9 @@ static int me_detach(struct comedi_device *dev)
818 if (dev_private->pci_device) { 818 if (dev_private->pci_device) {
819 if (dev_private->plx_regbase_size) 819 if (dev_private->plx_regbase_size)
820 comedi_pci_disable(dev_private->pci_device); 820 comedi_pci_disable(dev_private->pci_device);
821
822 pci_dev_put(dev_private->pci_device); 821 pci_dev_put(dev_private->pci_device);
823 } 822 }
824 } 823 }
825 return 0;
826} 824}
827 825
828static struct comedi_driver me_daq_driver = { 826static struct comedi_driver me_daq_driver = {
diff --git a/drivers/staging/comedi/drivers/mpc624.c b/drivers/staging/comedi/drivers/mpc624.c
index 25d85531fc36..4304e864a4d4 100644
--- a/drivers/staging/comedi/drivers/mpc624.c
+++ b/drivers/staging/comedi/drivers/mpc624.c
@@ -379,14 +379,10 @@ static int mpc624_attach(struct comedi_device *dev, struct comedi_devconfig *it)
379 return 1; 379 return 1;
380} 380}
381 381
382static int mpc624_detach(struct comedi_device *dev) 382static void mpc624_detach(struct comedi_device *dev)
383{ 383{
384 printk(KERN_INFO "comedi%d: mpc624: remove\n", dev->minor);
385
386 if (dev->iobase) 384 if (dev->iobase)
387 release_region(dev->iobase, MPC624_SIZE); 385 release_region(dev->iobase, MPC624_SIZE);
388
389 return 0;
390} 386}
391 387
392static struct comedi_driver mpc624_driver = { 388static struct comedi_driver mpc624_driver = {
diff --git a/drivers/staging/comedi/drivers/mpc8260cpm.c b/drivers/staging/comedi/drivers/mpc8260cpm.c
index f468775527db..364470e4458f 100644
--- a/drivers/staging/comedi/drivers/mpc8260cpm.c
+++ b/drivers/staging/comedi/drivers/mpc8260cpm.c
@@ -148,11 +148,9 @@ static int mpc8260cpm_attach(struct comedi_device *dev,
148 return 1; 148 return 1;
149} 149}
150 150
151static int mpc8260cpm_detach(struct comedi_device *dev) 151static void mpc8260cpm_detach(struct comedi_device *dev)
152{ 152{
153 printk("comedi%d: mpc8260cpm: remove\n", dev->minor); 153 /* Nothing to cleanup */
154
155 return 0;
156} 154}
157 155
158static struct comedi_driver mpc8260cpm_driver = { 156static struct comedi_driver mpc8260cpm_driver = {
diff --git a/drivers/staging/comedi/drivers/multiq3.c b/drivers/staging/comedi/drivers/multiq3.c
index 206296cfa068..e951e73d66f5 100644
--- a/drivers/staging/comedi/drivers/multiq3.c
+++ b/drivers/staging/comedi/drivers/multiq3.c
@@ -315,16 +315,12 @@ static int multiq3_attach(struct comedi_device *dev,
315 return 0; 315 return 0;
316} 316}
317 317
318static int multiq3_detach(struct comedi_device *dev) 318static void multiq3_detach(struct comedi_device *dev)
319{ 319{
320 printk(KERN_INFO "comedi%d: multiq3: remove\n", dev->minor);
321
322 if (dev->iobase) 320 if (dev->iobase)
323 release_region(dev->iobase, MULTIQ3_SIZE); 321 release_region(dev->iobase, MULTIQ3_SIZE);
324 if (dev->irq) 322 if (dev->irq)
325 free_irq(dev->irq, dev); 323 free_irq(dev->irq, dev);
326
327 return 0;
328} 324}
329 325
330static struct comedi_driver multiq3_driver = { 326static struct comedi_driver multiq3_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c
index 75c146d75f35..b02aa0efcd86 100644
--- a/drivers/staging/comedi/drivers/ni_6527.c
+++ b/drivers/staging/comedi/drivers/ni_6527.c
@@ -78,7 +78,7 @@ Updated: Sat, 25 Jan 2003 13:24:40 -0800
78 78
79static int ni6527_attach(struct comedi_device *dev, 79static int ni6527_attach(struct comedi_device *dev,
80 struct comedi_devconfig *it); 80 struct comedi_devconfig *it);
81static int ni6527_detach(struct comedi_device *dev); 81static void ni6527_detach(struct comedi_device *dev);
82static struct comedi_driver driver_ni6527 = { 82static struct comedi_driver driver_ni6527 = {
83 .driver_name = "ni6527", 83 .driver_name = "ni6527",
84 .module = THIS_MODULE, 84 .module = THIS_MODULE,
@@ -449,19 +449,15 @@ static int ni6527_attach(struct comedi_device *dev, struct comedi_devconfig *it)
449 return 0; 449 return 0;
450} 450}
451 451
452static int ni6527_detach(struct comedi_device *dev) 452static void ni6527_detach(struct comedi_device *dev)
453{ 453{
454 if (devpriv && devpriv->mite && devpriv->mite->daq_io_addr) 454 if (devpriv && devpriv->mite && devpriv->mite->daq_io_addr)
455 writeb(0x00, 455 writeb(0x00,
456 devpriv->mite->daq_io_addr + Master_Interrupt_Control); 456 devpriv->mite->daq_io_addr + Master_Interrupt_Control);
457
458 if (dev->irq) 457 if (dev->irq)
459 free_irq(dev->irq, dev); 458 free_irq(dev->irq, dev);
460
461 if (devpriv && devpriv->mite) 459 if (devpriv && devpriv->mite)
462 mite_unsetup(devpriv->mite); 460 mite_unsetup(devpriv->mite);
463
464 return 0;
465} 461}
466 462
467static int ni6527_find_device(struct comedi_device *dev, int bus, int slot) 463static int ni6527_find_device(struct comedi_device *dev, int bus, int slot)
diff --git a/drivers/staging/comedi/drivers/ni_65xx.c b/drivers/staging/comedi/drivers/ni_65xx.c
index 4a3f54ed3ce7..0d27a9323bc0 100644
--- a/drivers/staging/comedi/drivers/ni_65xx.c
+++ b/drivers/staging/comedi/drivers/ni_65xx.c
@@ -111,7 +111,7 @@ static inline unsigned Filter_Enable(unsigned port)
111 111
112static int ni_65xx_attach(struct comedi_device *dev, 112static int ni_65xx_attach(struct comedi_device *dev,
113 struct comedi_devconfig *it); 113 struct comedi_devconfig *it);
114static int ni_65xx_detach(struct comedi_device *dev); 114static void ni_65xx_detach(struct comedi_device *dev);
115static struct comedi_driver driver_ni_65xx = { 115static struct comedi_driver driver_ni_65xx = {
116 .driver_name = "ni_65xx", 116 .driver_name = "ni_65xx",
117 .module = THIS_MODULE, 117 .module = THIS_MODULE,
@@ -784,7 +784,7 @@ static int ni_65xx_attach(struct comedi_device *dev,
784 return 0; 784 return 0;
785} 785}
786 786
787static int ni_65xx_detach(struct comedi_device *dev) 787static void ni_65xx_detach(struct comedi_device *dev)
788{ 788{
789 if (private(dev) && private(dev)->mite 789 if (private(dev) && private(dev)->mite
790 && private(dev)->mite->daq_io_addr) { 790 && private(dev)->mite->daq_io_addr) {
@@ -792,10 +792,8 @@ static int ni_65xx_detach(struct comedi_device *dev)
792 private(dev)->mite->daq_io_addr + 792 private(dev)->mite->daq_io_addr +
793 Master_Interrupt_Control); 793 Master_Interrupt_Control);
794 } 794 }
795
796 if (dev->irq) 795 if (dev->irq)
797 free_irq(dev->irq, dev); 796 free_irq(dev->irq, dev);
798
799 if (private(dev)) { 797 if (private(dev)) {
800 unsigned i; 798 unsigned i;
801 for (i = 0; i < dev->n_subdevices; ++i) { 799 for (i = 0; i < dev->n_subdevices; ++i) {
@@ -805,7 +803,6 @@ static int ni_65xx_detach(struct comedi_device *dev)
805 if (private(dev)->mite) 803 if (private(dev)->mite)
806 mite_unsetup(private(dev)->mite); 804 mite_unsetup(private(dev)->mite);
807 } 805 }
808 return 0;
809} 806}
810 807
811static int ni_65xx_find_device(struct comedi_device *dev, int bus, int slot) 808static int ni_65xx_find_device(struct comedi_device *dev, int bus, int slot)
diff --git a/drivers/staging/comedi/drivers/ni_660x.c b/drivers/staging/comedi/drivers/ni_660x.c
index 21eb7fb5c42c..8c40730e296a 100644
--- a/drivers/staging/comedi/drivers/ni_660x.c
+++ b/drivers/staging/comedi/drivers/ni_660x.c
@@ -458,7 +458,7 @@ static inline const struct ni_660x_board *board(struct comedi_device *dev)
458 458
459static int ni_660x_attach(struct comedi_device *dev, 459static int ni_660x_attach(struct comedi_device *dev,
460 struct comedi_devconfig *it); 460 struct comedi_devconfig *it);
461static int ni_660x_detach(struct comedi_device *dev); 461static void ni_660x_detach(struct comedi_device *dev);
462static void init_tio_chip(struct comedi_device *dev, int chipset); 462static void init_tio_chip(struct comedi_device *dev, int chipset);
463static void ni_660x_select_pfi_output(struct comedi_device *dev, 463static void ni_660x_select_pfi_output(struct comedi_device *dev,
464 unsigned pfi_channel, 464 unsigned pfi_channel,
@@ -1188,14 +1188,10 @@ static int ni_660x_attach(struct comedi_device *dev,
1188 return 0; 1188 return 0;
1189} 1189}
1190 1190
1191static int ni_660x_detach(struct comedi_device *dev) 1191static void ni_660x_detach(struct comedi_device *dev)
1192{ 1192{
1193 printk(KERN_INFO "comedi%d: ni_660x: remove\n", dev->minor);
1194
1195 /* Free irq */
1196 if (dev->irq) 1193 if (dev->irq)
1197 free_irq(dev->irq, dev); 1194 free_irq(dev->irq, dev);
1198
1199 if (dev->private) { 1195 if (dev->private) {
1200 if (private(dev)->counter_dev) 1196 if (private(dev)->counter_dev)
1201 ni_gpct_device_destroy(private(dev)->counter_dev); 1197 ni_gpct_device_destroy(private(dev)->counter_dev);
@@ -1204,7 +1200,6 @@ static int ni_660x_detach(struct comedi_device *dev)
1204 mite_unsetup(private(dev)->mite); 1200 mite_unsetup(private(dev)->mite);
1205 } 1201 }
1206 } 1202 }
1207 return 0;
1208} 1203}
1209 1204
1210static int 1205static int
diff --git a/drivers/staging/comedi/drivers/ni_670x.c b/drivers/staging/comedi/drivers/ni_670x.c
index c74efc40679b..a9cf94fd0c30 100644
--- a/drivers/staging/comedi/drivers/ni_670x.c
+++ b/drivers/staging/comedi/drivers/ni_670x.c
@@ -111,7 +111,7 @@ struct ni_670x_private {
111 111
112static int ni_670x_attach(struct comedi_device *dev, 112static int ni_670x_attach(struct comedi_device *dev,
113 struct comedi_devconfig *it); 113 struct comedi_devconfig *it);
114static int ni_670x_detach(struct comedi_device *dev); 114static void ni_670x_detach(struct comedi_device *dev);
115 115
116static struct comedi_driver driver_ni_670x = { 116static struct comedi_driver driver_ni_670x = {
117 .driver_name = "ni_670x", 117 .driver_name = "ni_670x",
@@ -249,19 +249,13 @@ static int ni_670x_attach(struct comedi_device *dev,
249 return 1; 249 return 1;
250} 250}
251 251
252static int ni_670x_detach(struct comedi_device *dev) 252static void ni_670x_detach(struct comedi_device *dev)
253{ 253{
254 printk(KERN_INFO "comedi%d: ni_670x: remove\n", dev->minor);
255
256 kfree(dev->subdevices[0].range_table_list); 254 kfree(dev->subdevices[0].range_table_list);
257
258 if (dev->private && devpriv->mite) 255 if (dev->private && devpriv->mite)
259 mite_unsetup(devpriv->mite); 256 mite_unsetup(devpriv->mite);
260
261 if (dev->irq) 257 if (dev->irq)
262 free_irq(dev->irq, dev); 258 free_irq(dev->irq, dev);
263
264 return 0;
265} 259}
266 260
267static int ni_670x_ao_winsn(struct comedi_device *dev, 261static int ni_670x_ao_winsn(struct comedi_device *dev,
diff --git a/drivers/staging/comedi/drivers/ni_at_a2150.c b/drivers/staging/comedi/drivers/ni_at_a2150.c
index 3231d102839e..ae896a094150 100644
--- a/drivers/staging/comedi/drivers/ni_at_a2150.c
+++ b/drivers/staging/comedi/drivers/ni_at_a2150.c
@@ -873,17 +873,12 @@ static int a2150_attach(struct comedi_device *dev, struct comedi_devconfig *it)
873 return 0; 873 return 0;
874}; 874};
875 875
876static int a2150_detach(struct comedi_device *dev) 876static void a2150_detach(struct comedi_device *dev)
877{ 877{
878 printk("comedi%d: %s: remove\n", dev->minor, dev->driver->driver_name);
879
880 /* only free stuff if it has been allocated by _attach */
881 if (dev->iobase) { 878 if (dev->iobase) {
882 /* put board in power-down mode */
883 outw(APD_BIT | DPD_BIT, dev->iobase + CONFIG_REG); 879 outw(APD_BIT | DPD_BIT, dev->iobase + CONFIG_REG);
884 release_region(dev->iobase, A2150_SIZE); 880 release_region(dev->iobase, A2150_SIZE);
885 } 881 }
886
887 if (dev->irq) 882 if (dev->irq)
888 free_irq(dev->irq, dev); 883 free_irq(dev->irq, dev);
889 if (devpriv) { 884 if (devpriv) {
@@ -891,8 +886,6 @@ static int a2150_detach(struct comedi_device *dev)
891 free_dma(devpriv->dma); 886 free_dma(devpriv->dma);
892 kfree(devpriv->dma_buffer); 887 kfree(devpriv->dma_buffer);
893 } 888 }
894
895 return 0;
896}; 889};
897 890
898static struct comedi_driver ni_at_a2150_driver = { 891static struct comedi_driver ni_at_a2150_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_at_ao.c b/drivers/staging/comedi/drivers/ni_at_ao.c
index d7963bae4741..c43dd8ada1da 100644
--- a/drivers/staging/comedi/drivers/ni_at_ao.c
+++ b/drivers/staging/comedi/drivers/ni_at_ao.c
@@ -406,14 +406,10 @@ static int atao_attach(struct comedi_device *dev, struct comedi_devconfig *it)
406 return 0; 406 return 0;
407} 407}
408 408
409static int atao_detach(struct comedi_device *dev) 409static void atao_detach(struct comedi_device *dev)
410{ 410{
411 printk(KERN_INFO "comedi%d: atao: remove\n", dev->minor);
412
413 if (dev->iobase) 411 if (dev->iobase)
414 release_region(dev->iobase, ATAO_SIZE); 412 release_region(dev->iobase, ATAO_SIZE);
415
416 return 0;
417} 413}
418 414
419static const struct atao_board atao_boards[] = { 415static const struct atao_board atao_boards[] = {
diff --git a/drivers/staging/comedi/drivers/ni_atmio.c b/drivers/staging/comedi/drivers/ni_atmio.c
index 02cf44b38590..6448373878ed 100644
--- a/drivers/staging/comedi/drivers/ni_atmio.c
+++ b/drivers/staging/comedi/drivers/ni_atmio.c
@@ -497,19 +497,15 @@ static int ni_atmio_attach(struct comedi_device *dev,
497 return 0; 497 return 0;
498} 498}
499 499
500static int ni_atmio_detach(struct comedi_device *dev) 500static void ni_atmio_detach(struct comedi_device *dev)
501{ 501{
502 mio_common_detach(dev); 502 mio_common_detach(dev);
503
504 if (dev->iobase) 503 if (dev->iobase)
505 release_region(dev->iobase, NI_SIZE); 504 release_region(dev->iobase, NI_SIZE);
506 if (dev->irq) 505 if (dev->irq)
507 free_irq(dev->irq, dev); 506 free_irq(dev->irq, dev);
508
509 if (devpriv->isapnp_dev) 507 if (devpriv->isapnp_dev)
510 pnp_device_detach(devpriv->isapnp_dev); 508 pnp_device_detach(devpriv->isapnp_dev);
511
512 return 0;
513} 509}
514 510
515static struct comedi_driver ni_atmio_driver = { 511static struct comedi_driver ni_atmio_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_atmio16d.c b/drivers/staging/comedi/drivers/ni_atmio16d.c
index 8044e9282112..4f6145326747 100644
--- a/drivers/staging/comedi/drivers/ni_atmio16d.c
+++ b/drivers/staging/comedi/drivers/ni_atmio16d.c
@@ -829,22 +829,15 @@ static int atmio16d_attach(struct comedi_device *dev,
829 return 0; 829 return 0;
830} 830}
831 831
832static int atmio16d_detach(struct comedi_device *dev) 832static void atmio16d_detach(struct comedi_device *dev)
833{ 833{
834 printk(KERN_INFO "comedi%d: atmio16d: remove\n", dev->minor);
835
836 if (dev->subdevices && boardtype->has_8255) 834 if (dev->subdevices && boardtype->has_8255)
837 subdev_8255_cleanup(dev, dev->subdevices + 3); 835 subdev_8255_cleanup(dev, dev->subdevices + 3);
838
839 if (dev->irq) 836 if (dev->irq)
840 free_irq(dev->irq, dev); 837 free_irq(dev->irq, dev);
841
842 reset_atmio16d(dev); 838 reset_atmio16d(dev);
843
844 if (dev->iobase) 839 if (dev->iobase)
845 release_region(dev->iobase, ATMIO16D_SIZE); 840 release_region(dev->iobase, ATMIO16D_SIZE);
846
847 return 0;
848} 841}
849 842
850static const struct atmio16_board_t atmio16_boards[] = { 843static const struct atmio16_board_t atmio16_boards[] = {
diff --git a/drivers/staging/comedi/drivers/ni_daq_700.c b/drivers/staging/comedi/drivers/ni_daq_700.c
index e2420123db87..75764e8d27eb 100644
--- a/drivers/staging/comedi/drivers/ni_daq_700.c
+++ b/drivers/staging/comedi/drivers/ni_daq_700.c
@@ -57,7 +57,7 @@ static struct pcmcia_device *pcmcia_cur_dev;
57 57
58static int dio700_attach(struct comedi_device *dev, 58static int dio700_attach(struct comedi_device *dev,
59 struct comedi_devconfig *it); 59 struct comedi_devconfig *it);
60static int dio700_detach(struct comedi_device *dev); 60static void dio700_detach(struct comedi_device *dev);
61 61
62enum dio700_bustype { pcmcia_bustype }; 62enum dio700_bustype { pcmcia_bustype };
63 63
@@ -419,19 +419,14 @@ static int dio700_attach(struct comedi_device *dev, struct comedi_devconfig *it)
419 return 0; 419 return 0;
420}; 420};
421 421
422static int dio700_detach(struct comedi_device *dev) 422static void dio700_detach(struct comedi_device *dev)
423{ 423{
424 printk(KERN_ERR "comedi%d: ni_daq_700: cs-remove\n", dev->minor);
425
426 if (dev->subdevices) 424 if (dev->subdevices)
427 subdev_700_cleanup(dev, dev->subdevices + 0); 425 subdev_700_cleanup(dev, dev->subdevices + 0);
428
429 if (thisboard->bustype != pcmcia_bustype && dev->iobase) 426 if (thisboard->bustype != pcmcia_bustype && dev->iobase)
430 release_region(dev->iobase, DIO700_SIZE); 427 release_region(dev->iobase, DIO700_SIZE);
431 if (dev->irq) 428 if (dev->irq)
432 free_irq(dev->irq, dev); 429 free_irq(dev->irq, dev);
433
434 return 0;
435}; 430};
436 431
437static void dio700_config(struct pcmcia_device *link); 432static void dio700_config(struct pcmcia_device *link);
@@ -472,18 +467,12 @@ static int dio700_cs_attach(struct pcmcia_device *link)
472 467
473static void dio700_cs_detach(struct pcmcia_device *link) 468static void dio700_cs_detach(struct pcmcia_device *link)
474{ 469{
475
476 printk(KERN_INFO "ni_daq_700: cs-detach!\n");
477
478 dev_dbg(&link->dev, "dio700_cs_detach\n");
479
480 ((struct local_info_t *)link->priv)->stop = 1; 470 ((struct local_info_t *)link->priv)->stop = 1;
481 dio700_release(link); 471 dio700_release(link);
482 472
483 /* This points to the parent struct local_info_t struct */ 473 /* This points to the parent struct local_info_t struct */
484 kfree(link->priv); 474 kfree(link->priv);
485 475}
486} /* dio700_cs_detach */
487 476
488static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev, 477static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev,
489 void *priv_data) 478 void *priv_data)
diff --git a/drivers/staging/comedi/drivers/ni_daq_dio24.c b/drivers/staging/comedi/drivers/ni_daq_dio24.c
index c0423a8c3e36..493a22788637 100644
--- a/drivers/staging/comedi/drivers/ni_daq_dio24.c
+++ b/drivers/staging/comedi/drivers/ni_daq_dio24.c
@@ -57,7 +57,7 @@ static struct pcmcia_device *pcmcia_cur_dev;
57#define DIO24_SIZE 4 /* size of io region used by board */ 57#define DIO24_SIZE 4 /* size of io region used by board */
58 58
59static int dio24_attach(struct comedi_device *dev, struct comedi_devconfig *it); 59static int dio24_attach(struct comedi_device *dev, struct comedi_devconfig *it);
60static int dio24_detach(struct comedi_device *dev); 60static void dio24_detach(struct comedi_device *dev);
61 61
62enum dio24_bustype { pcmcia_bustype }; 62enum dio24_bustype { pcmcia_bustype };
63 63
@@ -168,19 +168,14 @@ static int dio24_attach(struct comedi_device *dev, struct comedi_devconfig *it)
168 return 0; 168 return 0;
169}; 169};
170 170
171static int dio24_detach(struct comedi_device *dev) 171static void dio24_detach(struct comedi_device *dev)
172{ 172{
173 dev_info(dev->hw_dev, "comedi%d: ni_daq_dio24: remove\n", dev->minor);
174
175 if (dev->subdevices) 173 if (dev->subdevices)
176 subdev_8255_cleanup(dev, dev->subdevices + 0); 174 subdev_8255_cleanup(dev, dev->subdevices + 0);
177
178 if (thisboard->bustype != pcmcia_bustype && dev->iobase) 175 if (thisboard->bustype != pcmcia_bustype && dev->iobase)
179 release_region(dev->iobase, DIO24_SIZE); 176 release_region(dev->iobase, DIO24_SIZE);
180 if (dev->irq) 177 if (dev->irq)
181 free_irq(dev->irq, dev); 178 free_irq(dev->irq, dev);
182
183 return 0;
184}; 179};
185 180
186static void dio24_config(struct pcmcia_device *link); 181static void dio24_config(struct pcmcia_device *link);
@@ -221,18 +216,12 @@ static int dio24_cs_attach(struct pcmcia_device *link)
221 216
222static void dio24_cs_detach(struct pcmcia_device *link) 217static void dio24_cs_detach(struct pcmcia_device *link)
223{ 218{
224
225 printk(KERN_INFO "ni_daq_dio24: HOLA SOY YO - cs-detach!\n");
226
227 dev_dbg(&link->dev, "dio24_cs_detach\n");
228
229 ((struct local_info_t *)link->priv)->stop = 1; 219 ((struct local_info_t *)link->priv)->stop = 1;
230 dio24_release(link); 220 dio24_release(link);
231 221
232 /* This points to the parent local_info_t struct */ 222 /* This points to the parent local_info_t struct */
233 kfree(link->priv); 223 kfree(link->priv);
234 224}
235} /* dio24_cs_detach */
236 225
237static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev, 226static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
238 void *priv_data) 227 void *priv_data)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index b281fc6e6b7d..53349777246b 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -805,13 +805,10 @@ static int labpc_find_device(struct comedi_device *dev, int bus, int slot)
805} 805}
806#endif 806#endif
807 807
808int labpc_common_detach(struct comedi_device *dev) 808void labpc_common_detach(struct comedi_device *dev)
809{ 809{
810 printk(KERN_ERR "comedi%d: ni_labpc: detach\n", dev->minor);
811
812 if (dev->subdevices) 810 if (dev->subdevices)
813 subdev_8255_cleanup(dev, dev->subdevices + 2); 811 subdev_8255_cleanup(dev, dev->subdevices + 2);
814
815#ifdef CONFIG_ISA_DMA_API 812#ifdef CONFIG_ISA_DMA_API
816 /* only free stuff if it has been allocated by _attach */ 813 /* only free stuff if it has been allocated by _attach */
817 kfree(devpriv->dma_buffer); 814 kfree(devpriv->dma_buffer);
@@ -826,8 +823,6 @@ int labpc_common_detach(struct comedi_device *dev)
826 if (devpriv->mite) 823 if (devpriv->mite)
827 mite_unsetup(devpriv->mite); 824 mite_unsetup(devpriv->mite);
828#endif 825#endif
829
830 return 0;
831}; 826};
832EXPORT_SYMBOL_GPL(labpc_common_detach); 827EXPORT_SYMBOL_GPL(labpc_common_detach);
833 828
diff --git a/drivers/staging/comedi/drivers/ni_labpc.h b/drivers/staging/comedi/drivers/ni_labpc.h
index 422cee58a967..e052ed3ba544 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.h
+++ b/drivers/staging/comedi/drivers/ni_labpc.h
@@ -103,7 +103,7 @@ struct labpc_private {
103 103
104int labpc_common_attach(struct comedi_device *dev, unsigned long iobase, 104int labpc_common_attach(struct comedi_device *dev, unsigned long iobase,
105 unsigned int irq, unsigned int dma); 105 unsigned int irq, unsigned int dma);
106int labpc_common_detach(struct comedi_device *dev); 106void labpc_common_detach(struct comedi_device *dev);
107 107
108extern const int labpc_1200_is_unipolar[]; 108extern const int labpc_1200_is_unipolar[];
109extern const int labpc_1200_ai_gain_bits[]; 109extern const int labpc_1200_ai_gain_bits[];
diff --git a/drivers/staging/comedi/drivers/ni_labpc_cs.c b/drivers/staging/comedi/drivers/ni_labpc_cs.c
index ff3840544dd4..dbb61b6b3ed1 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_cs.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_cs.c
@@ -188,21 +188,13 @@ static int labpc_cs_attach(struct pcmcia_device *link)
188 188
189static void labpc_cs_detach(struct pcmcia_device *link) 189static void labpc_cs_detach(struct pcmcia_device *link)
190{ 190{
191 dev_dbg(&link->dev, "labpc_cs_detach\n");
192
193 /*
194 If the device is currently configured and active, we won't
195 actually delete it yet. Instead, it is marked so that when
196 the release() function is called, that will trigger a proper
197 detach().
198 */
199 ((struct local_info_t *)link->priv)->stop = 1; 191 ((struct local_info_t *)link->priv)->stop = 1;
200 labpc_release(link); 192 labpc_release(link);
201 193
202 /* This points to the parent local_info_t struct (may be null) */ 194 /* This points to the parent local_info_t struct (may be null) */
203 kfree(link->priv); 195 kfree(link->priv);
204 196
205} /* labpc_cs_detach */ 197}
206 198
207static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev, 199static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
208 void *priv_data) 200 void *priv_data)
diff --git a/drivers/staging/comedi/drivers/ni_mio_cs.c b/drivers/staging/comedi/drivers/ni_mio_cs.c
index 53ec24bb6dce..b85765d266c2 100644
--- a/drivers/staging/comedi/drivers/ni_mio_cs.c
+++ b/drivers/staging/comedi/drivers/ni_mio_cs.c
@@ -227,7 +227,7 @@ static uint16_t mio_cs_win_in(struct comedi_device *dev, int addr)
227 227
228static int mio_cs_attach(struct comedi_device *dev, 228static int mio_cs_attach(struct comedi_device *dev,
229 struct comedi_devconfig *it); 229 struct comedi_devconfig *it);
230static int mio_cs_detach(struct comedi_device *dev); 230static void mio_cs_detach(struct comedi_device *dev);
231static struct comedi_driver driver_ni_mio_cs = { 231static struct comedi_driver driver_ni_mio_cs = {
232 .driver_name = "ni_mio_cs", 232 .driver_name = "ni_mio_cs",
233 .module = THIS_MODULE, 233 .module = THIS_MODULE,
@@ -240,18 +240,11 @@ static struct comedi_driver driver_ni_mio_cs = {
240static int ni_getboardtype(struct comedi_device *dev, 240static int ni_getboardtype(struct comedi_device *dev,
241 struct pcmcia_device *link); 241 struct pcmcia_device *link);
242 242
243/* clean up allocated resources */ 243static void mio_cs_detach(struct comedi_device *dev)
244/* called when driver is removed */
245static int mio_cs_detach(struct comedi_device *dev)
246{ 244{
247 mio_common_detach(dev); 245 mio_common_detach(dev);
248
249 /* PCMCIA layer frees the IO region */
250
251 if (dev->irq) 246 if (dev->irq)
252 free_irq(dev->irq, dev); 247 free_irq(dev->irq, dev);
253
254 return 0;
255} 248}
256 249
257static void mio_cs_config(struct pcmcia_device *link); 250static void mio_cs_config(struct pcmcia_device *link);
@@ -276,8 +269,6 @@ static void cs_release(struct pcmcia_device *link)
276 269
277static void cs_detach(struct pcmcia_device *link) 270static void cs_detach(struct pcmcia_device *link)
278{ 271{
279 DPRINTK("cs_detach(link=%p)\n", link);
280
281 cs_release(link); 272 cs_release(link);
282} 273}
283 274
diff --git a/drivers/staging/comedi/drivers/ni_pcidio.c b/drivers/staging/comedi/drivers/ni_pcidio.c
index ed42ee3a7836..37b700830e21 100644
--- a/drivers/staging/comedi/drivers/ni_pcidio.c
+++ b/drivers/staging/comedi/drivers/ni_pcidio.c
@@ -1307,7 +1307,7 @@ static int nidio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1307 return 0; 1307 return 0;
1308} 1308}
1309 1309
1310static int nidio_detach(struct comedi_device *dev) 1310static void nidio_detach(struct comedi_device *dev)
1311{ 1311{
1312 int i; 1312 int i;
1313 1313
@@ -1315,10 +1315,8 @@ static int nidio_detach(struct comedi_device *dev)
1315 for (i = 0; i < this_board->n_8255; i++) 1315 for (i = 0; i < this_board->n_8255; i++)
1316 subdev_8255_cleanup(dev, dev->subdevices + i); 1316 subdev_8255_cleanup(dev, dev->subdevices + i);
1317 } 1317 }
1318
1319 if (dev->irq) 1318 if (dev->irq)
1320 free_irq(dev->irq, dev); 1319 free_irq(dev->irq, dev);
1321
1322 if (devpriv) { 1320 if (devpriv) {
1323 if (devpriv->di_mite_ring) { 1321 if (devpriv->di_mite_ring) {
1324 mite_free_ring(devpriv->di_mite_ring); 1322 mite_free_ring(devpriv->di_mite_ring);
@@ -1327,7 +1325,6 @@ static int nidio_detach(struct comedi_device *dev)
1327 if (devpriv->mite) 1325 if (devpriv->mite)
1328 mite_unsetup(devpriv->mite); 1326 mite_unsetup(devpriv->mite);
1329 } 1327 }
1330 return 0;
1331} 1328}
1332 1329
1333static struct comedi_driver ni_pcidio_driver = { 1330static struct comedi_driver ni_pcidio_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_pcimio.c b/drivers/staging/comedi/drivers/ni_pcimio.c
index 9d0a08f52beb..3974c0d98d2a 100644
--- a/drivers/staging/comedi/drivers/ni_pcimio.c
+++ b/drivers/staging/comedi/drivers/ni_pcimio.c
@@ -1573,13 +1573,11 @@ static void init_6143(struct comedi_device *dev)
1573 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143); 1573 ni_writew(devpriv->ai_calib_source, Calibration_Channel_6143);
1574} 1574}
1575 1575
1576/* cleans up allocated resources */ 1576static void pcimio_detach(struct comedi_device *dev)
1577static int pcimio_detach(struct comedi_device *dev)
1578{ 1577{
1579 mio_common_detach(dev); 1578 mio_common_detach(dev);
1580 if (dev->irq) 1579 if (dev->irq)
1581 free_irq(dev->irq, dev); 1580 free_irq(dev->irq, dev);
1582
1583 if (dev->private) { 1581 if (dev->private) {
1584 mite_free_ring(devpriv->ai_mite_ring); 1582 mite_free_ring(devpriv->ai_mite_ring);
1585 mite_free_ring(devpriv->ao_mite_ring); 1583 mite_free_ring(devpriv->ao_mite_ring);
@@ -1589,8 +1587,6 @@ static int pcimio_detach(struct comedi_device *dev)
1589 if (devpriv->mite) 1587 if (devpriv->mite)
1590 mite_unsetup(devpriv->mite); 1588 mite_unsetup(devpriv->mite);
1591 } 1589 }
1592
1593 return 0;
1594} 1590}
1595 1591
1596static int pcimio_attach(struct comedi_device *dev, struct comedi_devconfig *it) 1592static int pcimio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c
index 6a12dca3df8d..2e7753f988aa 100644
--- a/drivers/staging/comedi/drivers/pcl711.c
+++ b/drivers/staging/comedi/drivers/pcl711.c
@@ -591,17 +591,12 @@ static int pcl711_attach(struct comedi_device *dev, struct comedi_devconfig *it)
591 return 0; 591 return 0;
592} 592}
593 593
594static int pcl711_detach(struct comedi_device *dev) 594static void pcl711_detach(struct comedi_device *dev)
595{ 595{
596 printk(KERN_INFO "comedi%d: pcl711: remove\n", dev->minor);
597
598 if (dev->irq) 596 if (dev->irq)
599 free_irq(dev->irq, dev); 597 free_irq(dev->irq, dev);
600
601 if (dev->iobase) 598 if (dev->iobase)
602 release_region(dev->iobase, PCL711_SIZE); 599 release_region(dev->iobase, PCL711_SIZE);
603
604 return 0;
605} 600}
606 601
607static const struct pcl711_board boardtypes[] = { 602static const struct pcl711_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcl724.c b/drivers/staging/comedi/drivers/pcl724.c
index 75628586cdbf..1f66fe1c7d5e 100644
--- a/drivers/staging/comedi/drivers/pcl724.c
+++ b/drivers/staging/comedi/drivers/pcl724.c
@@ -177,23 +177,17 @@ static int pcl724_attach(struct comedi_device *dev, struct comedi_devconfig *it)
177 return 0; 177 return 0;
178} 178}
179 179
180static int pcl724_detach(struct comedi_device *dev) 180static void pcl724_detach(struct comedi_device *dev)
181{ 181{
182 int i; 182 int i;
183 183
184 /* printk("comedi%d: pcl724: remove\n",dev->minor); */
185
186 for (i = 0; i < dev->n_subdevices; i++) 184 for (i = 0; i < dev->n_subdevices; i++)
187 subdev_8255_cleanup(dev, dev->subdevices + i); 185 subdev_8255_cleanup(dev, dev->subdevices + i);
188
189#ifdef PCL724_IRQ 186#ifdef PCL724_IRQ
190 if (dev->irq) 187 if (dev->irq)
191 free_irq(dev->irq, dev); 188 free_irq(dev->irq, dev);
192#endif 189#endif
193
194 release_region(dev->iobase, this_board->io_range); 190 release_region(dev->iobase, this_board->io_range);
195
196 return 0;
197} 191}
198 192
199static const struct pcl724_board boardtypes[] = { 193static const struct pcl724_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcl725.c b/drivers/staging/comedi/drivers/pcl725.c
index eeac943fddf0..83a6fa53dddd 100644
--- a/drivers/staging/comedi/drivers/pcl725.c
+++ b/drivers/staging/comedi/drivers/pcl725.c
@@ -89,14 +89,10 @@ static int pcl725_attach(struct comedi_device *dev, struct comedi_devconfig *it)
89 return 0; 89 return 0;
90} 90}
91 91
92static int pcl725_detach(struct comedi_device *dev) 92static void pcl725_detach(struct comedi_device *dev)
93{ 93{
94 printk(KERN_INFO "comedi%d: pcl725: remove\n", dev->minor);
95
96 if (dev->iobase) 94 if (dev->iobase)
97 release_region(dev->iobase, PCL725_SIZE); 95 release_region(dev->iobase, PCL725_SIZE);
98
99 return 0;
100} 96}
101 97
102static struct comedi_driver pcl725_driver = { 98static struct comedi_driver pcl725_driver = {
diff --git a/drivers/staging/comedi/drivers/pcl726.c b/drivers/staging/comedi/drivers/pcl726.c
index 8e2fb366d2eb..d25c30c694e3 100644
--- a/drivers/staging/comedi/drivers/pcl726.c
+++ b/drivers/staging/comedi/drivers/pcl726.c
@@ -350,19 +350,14 @@ static int pcl726_attach(struct comedi_device *dev, struct comedi_devconfig *it)
350 return 0; 350 return 0;
351} 351}
352 352
353static int pcl726_detach(struct comedi_device *dev) 353static void pcl726_detach(struct comedi_device *dev)
354{ 354{
355/* printk("comedi%d: pcl726: remove\n",dev->minor); */
356
357#ifdef ACL6126_IRQ 355#ifdef ACL6126_IRQ
358 if (dev->irq) 356 if (dev->irq)
359 free_irq(dev->irq, dev); 357 free_irq(dev->irq, dev);
360#endif 358#endif
361
362 if (dev->iobase) 359 if (dev->iobase)
363 release_region(dev->iobase, this_board->io_range); 360 release_region(dev->iobase, this_board->io_range);
364
365 return 0;
366} 361}
367 362
368static struct comedi_driver pcl726_driver = { 363static struct comedi_driver pcl726_driver = {
diff --git a/drivers/staging/comedi/drivers/pcl730.c b/drivers/staging/comedi/drivers/pcl730.c
index 73b4394fe478..e11704addedb 100644
--- a/drivers/staging/comedi/drivers/pcl730.c
+++ b/drivers/staging/comedi/drivers/pcl730.c
@@ -134,14 +134,10 @@ static int pcl730_attach(struct comedi_device *dev, struct comedi_devconfig *it)
134 return 0; 134 return 0;
135} 135}
136 136
137static int pcl730_detach(struct comedi_device *dev) 137static void pcl730_detach(struct comedi_device *dev)
138{ 138{
139 printk(KERN_INFO "comedi%d: pcl730: remove\n", dev->minor);
140
141 if (dev->iobase) 139 if (dev->iobase)
142 release_region(dev->iobase, this_board->io_range); 140 release_region(dev->iobase, this_board->io_range);
143
144 return 0;
145} 141}
146 142
147static const struct pcl730_board boardtypes[] = { 143static const struct pcl730_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcl812.c b/drivers/staging/comedi/drivers/pcl812.c
index 613b397ea046..51f4ca9f7927 100644
--- a/drivers/staging/comedi/drivers/pcl812.c
+++ b/drivers/staging/comedi/drivers/pcl812.c
@@ -1614,14 +1614,9 @@ no_dma:
1614 return 0; 1614 return 0;
1615} 1615}
1616 1616
1617static int pcl812_detach(struct comedi_device *dev) 1617static void pcl812_detach(struct comedi_device *dev)
1618{ 1618{
1619
1620#ifdef PCL812_EXTDEBUG
1621 printk(KERN_DEBUG "comedi%d: pcl812: remove\n", dev->minor);
1622#endif
1623 free_resources(dev); 1619 free_resources(dev);
1624 return 0;
1625} 1620}
1626 1621
1627static const struct pcl812_board boardtypes[] = { 1622static const struct pcl812_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcl816.c b/drivers/staging/comedi/drivers/pcl816.c
index 1559c05b8f14..cc67b6d46059 100644
--- a/drivers/staging/comedi/drivers/pcl816.c
+++ b/drivers/staging/comedi/drivers/pcl816.c
@@ -1026,40 +1026,6 @@ static int set_rtc_irq_bit(unsigned char bit)
1026} 1026}
1027#endif 1027#endif
1028 1028
1029/*
1030==============================================================================
1031 Free any resources that we have claimed
1032*/
1033static void free_resources(struct comedi_device *dev)
1034{
1035 /* printk("free_resource()\n"); */
1036 if (dev->private) {
1037 pcl816_ai_cancel(dev, devpriv->sub_ai);
1038 pcl816_reset(dev);
1039 if (devpriv->dma)
1040 free_dma(devpriv->dma);
1041 if (devpriv->dmabuf[0])
1042 free_pages(devpriv->dmabuf[0], devpriv->dmapages[0]);
1043 if (devpriv->dmabuf[1])
1044 free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]);
1045#ifdef unused
1046 if (devpriv->rtc_irq)
1047 free_irq(devpriv->rtc_irq, dev);
1048 if ((devpriv->dma_rtc) && (RTC_lock == 1)) {
1049 if (devpriv->rtc_iobase)
1050 release_region(devpriv->rtc_iobase,
1051 devpriv->rtc_iosize);
1052 }
1053#endif
1054 }
1055
1056 if (dev->irq)
1057 free_irq(dev->irq, dev);
1058 if (dev->iobase)
1059 release_region(dev->iobase, this_board->io_range);
1060 /* printk("free_resource() end\n"); */
1061}
1062
1063static int pcl816_attach(struct comedi_device *dev, struct comedi_devconfig *it) 1029static int pcl816_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1064{ 1030{
1065 int ret; 1031 int ret;
@@ -1285,15 +1251,35 @@ case COMEDI_SUBD_DO:
1285 return 0; 1251 return 0;
1286} 1252}
1287 1253
1288static int pcl816_detach(struct comedi_device *dev) 1254static void pcl816_detach(struct comedi_device *dev)
1289{ 1255{
1290 DEBUG(printk(KERN_INFO "comedi%d: pcl816: remove\n", dev->minor);) 1256 if (dev->private) {
1291 free_resources(dev); 1257 pcl816_ai_cancel(dev, devpriv->sub_ai);
1258 pcl816_reset(dev);
1259 if (devpriv->dma)
1260 free_dma(devpriv->dma);
1261 if (devpriv->dmabuf[0])
1262 free_pages(devpriv->dmabuf[0], devpriv->dmapages[0]);
1263 if (devpriv->dmabuf[1])
1264 free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]);
1265#ifdef unused
1266 if (devpriv->rtc_irq)
1267 free_irq(devpriv->rtc_irq, dev);
1268 if ((devpriv->dma_rtc) && (RTC_lock == 1)) {
1269 if (devpriv->rtc_iobase)
1270 release_region(devpriv->rtc_iobase,
1271 devpriv->rtc_iosize);
1272 }
1273#endif
1274 }
1275 if (dev->irq)
1276 free_irq(dev->irq, dev);
1277 if (dev->iobase)
1278 release_region(dev->iobase, this_board->io_range);
1292#ifdef unused 1279#ifdef unused
1293 if (devpriv->dma_rtc) 1280 if (devpriv->dma_rtc)
1294 RTC_lock--; 1281 RTC_lock--;
1295#endif 1282#endif
1296 return 0;
1297} 1283}
1298 1284
1299static const struct pcl816_board boardtypes[] = { 1285static const struct pcl816_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c
index 9b8a1ff5c8a4..1406c9720f5d 100644
--- a/drivers/staging/comedi/drivers/pcl818.c
+++ b/drivers/staging/comedi/drivers/pcl818.c
@@ -1634,42 +1634,6 @@ static int rtc_setfreq_irq(int freq)
1634} 1634}
1635#endif 1635#endif
1636 1636
1637/*
1638==============================================================================
1639 Free any resources that we have claimed
1640*/
1641static void free_resources(struct comedi_device *dev)
1642{
1643 /* printk("free_resource()\n"); */
1644 if (dev->private) {
1645 pcl818_ai_cancel(dev, devpriv->sub_ai);
1646 pcl818_reset(dev);
1647 if (devpriv->dma)
1648 free_dma(devpriv->dma);
1649 if (devpriv->dmabuf[0])
1650 free_pages(devpriv->dmabuf[0], devpriv->dmapages[0]);
1651 if (devpriv->dmabuf[1])
1652 free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]);
1653#ifdef unused
1654 if (devpriv->rtc_irq)
1655 free_irq(devpriv->rtc_irq, dev);
1656 if ((devpriv->dma_rtc) && (RTC_lock == 1)) {
1657 if (devpriv->rtc_iobase)
1658 release_region(devpriv->rtc_iobase,
1659 devpriv->rtc_iosize);
1660 }
1661 if (devpriv->dma_rtc)
1662 RTC_lock--;
1663#endif
1664 }
1665
1666 if (dev->irq)
1667 free_irq(dev->irq, dev);
1668 if (dev->iobase)
1669 release_region(dev->iobase, devpriv->io_range);
1670 /* printk("free_resource() end\n"); */
1671}
1672
1673static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it) 1637static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1674{ 1638{
1675 int ret; 1639 int ret;
@@ -1960,11 +1924,33 @@ no_dma:
1960 return 0; 1924 return 0;
1961} 1925}
1962 1926
1963static int pcl818_detach(struct comedi_device *dev) 1927static void pcl818_detach(struct comedi_device *dev)
1964{ 1928{
1965 /* printk("comedi%d: pcl818: remove\n", dev->minor); */ 1929 if (dev->private) {
1966 free_resources(dev); 1930 pcl818_ai_cancel(dev, devpriv->sub_ai);
1967 return 0; 1931 pcl818_reset(dev);
1932 if (devpriv->dma)
1933 free_dma(devpriv->dma);
1934 if (devpriv->dmabuf[0])
1935 free_pages(devpriv->dmabuf[0], devpriv->dmapages[0]);
1936 if (devpriv->dmabuf[1])
1937 free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]);
1938#ifdef unused
1939 if (devpriv->rtc_irq)
1940 free_irq(devpriv->rtc_irq, dev);
1941 if ((devpriv->dma_rtc) && (RTC_lock == 1)) {
1942 if (devpriv->rtc_iobase)
1943 release_region(devpriv->rtc_iobase,
1944 devpriv->rtc_iosize);
1945 }
1946 if (devpriv->dma_rtc)
1947 RTC_lock--;
1948#endif
1949 }
1950 if (dev->irq)
1951 free_irq(dev->irq, dev);
1952 if (dev->iobase)
1953 release_region(dev->iobase, devpriv->io_range);
1968} 1954}
1969 1955
1970static const struct pcl818_board boardtypes[] = { 1956static const struct pcl818_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcm3724.c b/drivers/staging/comedi/drivers/pcm3724.c
index 36c04597dae8..7492b8f1d499 100644
--- a/drivers/staging/comedi/drivers/pcm3724.c
+++ b/drivers/staging/comedi/drivers/pcm3724.c
@@ -273,7 +273,7 @@ static int pcm3724_attach(struct comedi_device *dev,
273 return 0; 273 return 0;
274} 274}
275 275
276static int pcm3724_detach(struct comedi_device *dev) 276static void pcm3724_detach(struct comedi_device *dev)
277{ 277{
278 int i; 278 int i;
279 279
@@ -283,8 +283,6 @@ static int pcm3724_detach(struct comedi_device *dev)
283 } 283 }
284 if (dev->iobase) 284 if (dev->iobase)
285 release_region(dev->iobase, this_board->io_range); 285 release_region(dev->iobase, this_board->io_range);
286
287 return 0;
288} 286}
289 287
290static const struct pcm3724_board boardtypes[] = { 288static const struct pcm3724_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/pcm3730.c b/drivers/staging/comedi/drivers/pcm3730.c
index 1571b8357ed7..f8d1c644daf8 100644
--- a/drivers/staging/comedi/drivers/pcm3730.c
+++ b/drivers/staging/comedi/drivers/pcm3730.c
@@ -133,14 +133,10 @@ static int pcm3730_attach(struct comedi_device *dev,
133 return 0; 133 return 0;
134} 134}
135 135
136static int pcm3730_detach(struct comedi_device *dev) 136static void pcm3730_detach(struct comedi_device *dev)
137{ 137{
138 printk(KERN_INFO "comedi%d: pcm3730: remove\n", dev->minor);
139
140 if (dev->iobase) 138 if (dev->iobase)
141 release_region(dev->iobase, PCM3730_SIZE); 139 release_region(dev->iobase, PCM3730_SIZE);
142
143 return 0;
144} 140}
145 141
146static struct comedi_driver pcm3730_driver = { 142static struct comedi_driver pcm3730_driver = {
diff --git a/drivers/staging/comedi/drivers/pcmad.c b/drivers/staging/comedi/drivers/pcmad.c
index 05a2363a55bf..1ec7d5cb346a 100644
--- a/drivers/staging/comedi/drivers/pcmad.c
+++ b/drivers/staging/comedi/drivers/pcmad.c
@@ -139,17 +139,12 @@ static int pcmad_attach(struct comedi_device *dev, struct comedi_devconfig *it)
139 return 0; 139 return 0;
140} 140}
141 141
142static int pcmad_detach(struct comedi_device *dev) 142static void pcmad_detach(struct comedi_device *dev)
143{ 143{
144 printk(KERN_INFO "comedi%d: pcmad: remove\n", dev->minor);
145
146 if (dev->irq) 144 if (dev->irq)
147 free_irq(dev->irq, dev); 145 free_irq(dev->irq, dev);
148
149 if (dev->iobase) 146 if (dev->iobase)
150 release_region(dev->iobase, PCMAD_SIZE); 147 release_region(dev->iobase, PCMAD_SIZE);
151
152 return 0;
153} 148}
154 149
155static const struct pcmad_board_struct pcmad_boards[] = { 150static const struct pcmad_board_struct pcmad_boards[] = {
diff --git a/drivers/staging/comedi/drivers/pcmda12.c b/drivers/staging/comedi/drivers/pcmda12.c
index aaea0e600108..4786148b4fd0 100644
--- a/drivers/staging/comedi/drivers/pcmda12.c
+++ b/drivers/staging/comedi/drivers/pcmda12.c
@@ -227,13 +227,10 @@ static int pcmda12_attach(struct comedi_device *dev,
227 return 1; 227 return 1;
228} 228}
229 229
230static int pcmda12_detach(struct comedi_device *dev) 230static void pcmda12_detach(struct comedi_device *dev)
231{ 231{
232 printk(KERN_INFO
233 "comedi%d: %s: remove\n", dev->minor, dev->driver->driver_name);
234 if (dev->iobase) 232 if (dev->iobase)
235 release_region(dev->iobase, IOSIZE); 233 release_region(dev->iobase, IOSIZE);
236 return 0;
237} 234}
238 235
239static const struct pcmda12_board pcmda12_boards[] = { 236static const struct pcmda12_board pcmda12_boards[] = {
diff --git a/drivers/staging/comedi/drivers/pcmmio.c b/drivers/staging/comedi/drivers/pcmmio.c
index a977acbf9416..efed168d2bac 100644
--- a/drivers/staging/comedi/drivers/pcmmio.c
+++ b/drivers/staging/comedi/drivers/pcmmio.c
@@ -1223,24 +1223,18 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1223 return 1; 1223 return 1;
1224} 1224}
1225 1225
1226static int pcmmio_detach(struct comedi_device *dev) 1226static void pcmmio_detach(struct comedi_device *dev)
1227{ 1227{
1228 int i; 1228 int i;
1229 1229
1230 printk(KERN_INFO "comedi%d: %s: remove\n", dev->minor,
1231 dev->driver->driver_name);
1232 if (dev->iobase) 1230 if (dev->iobase)
1233 release_region(dev->iobase, thisboard->total_iosize); 1231 release_region(dev->iobase, thisboard->total_iosize);
1234
1235 for (i = 0; i < MAX_ASICS; ++i) { 1232 for (i = 0; i < MAX_ASICS; ++i) {
1236 if (devpriv && devpriv->asics[i].irq) 1233 if (devpriv && devpriv->asics[i].irq)
1237 free_irq(devpriv->asics[i].irq, dev); 1234 free_irq(devpriv->asics[i].irq, dev);
1238 } 1235 }
1239
1240 if (devpriv && devpriv->sprivs) 1236 if (devpriv && devpriv->sprivs)
1241 kfree(devpriv->sprivs); 1237 kfree(devpriv->sprivs);
1242
1243 return 0;
1244} 1238}
1245 1239
1246static const struct pcmmio_board pcmmio_boards[] = { 1240static const struct pcmmio_board pcmmio_boards[] = {
diff --git a/drivers/staging/comedi/drivers/pcmuio.c b/drivers/staging/comedi/drivers/pcmuio.c
index b18912ac8e21..623381d50dac 100644
--- a/drivers/staging/comedi/drivers/pcmuio.c
+++ b/drivers/staging/comedi/drivers/pcmuio.c
@@ -908,24 +908,18 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
908 return 1; 908 return 1;
909} 909}
910 910
911static int pcmuio_detach(struct comedi_device *dev) 911static void pcmuio_detach(struct comedi_device *dev)
912{ 912{
913 int i; 913 int i;
914 914
915 dev_dbg(dev->hw_dev, "comedi%d: %s: remove\n", dev->minor,
916 dev->driver->driver_name);
917 if (dev->iobase) 915 if (dev->iobase)
918 release_region(dev->iobase, ASIC_IOSIZE * thisboard->num_asics); 916 release_region(dev->iobase, ASIC_IOSIZE * thisboard->num_asics);
919
920 for (i = 0; i < MAX_ASICS; ++i) { 917 for (i = 0; i < MAX_ASICS; ++i) {
921 if (devpriv->asics[i].irq) 918 if (devpriv->asics[i].irq)
922 free_irq(devpriv->asics[i].irq, dev); 919 free_irq(devpriv->asics[i].irq, dev);
923 } 920 }
924
925 if (devpriv && devpriv->sprivs) 921 if (devpriv && devpriv->sprivs)
926 kfree(devpriv->sprivs); 922 kfree(devpriv->sprivs);
927
928 return 0;
929} 923}
930 924
931static const struct pcmuio_board pcmuio_boards[] = { 925static const struct pcmuio_board pcmuio_boards[] = {
diff --git a/drivers/staging/comedi/drivers/poc.c b/drivers/staging/comedi/drivers/poc.c
index 2e50c7fd7882..e7120480687b 100644
--- a/drivers/staging/comedi/drivers/poc.c
+++ b/drivers/staging/comedi/drivers/poc.c
@@ -181,15 +181,10 @@ static int poc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
181 return 0; 181 return 0;
182} 182}
183 183
184static int poc_detach(struct comedi_device *dev) 184static void poc_detach(struct comedi_device *dev)
185{ 185{
186 /* only free stuff if it has been allocated by _attach */
187 if (dev->iobase) 186 if (dev->iobase)
188 release_region(dev->iobase, this_board->iosize); 187 release_region(dev->iobase, this_board->iosize);
189
190 printk(KERN_INFO "comedi%d: dac02: remove\n", dev->minor);
191
192 return 0;
193} 188}
194 189
195static const struct boarddef_struct boards[] = { 190static const struct boarddef_struct boards[] = {
diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
index e0bb73445dd8..2f130b3095e9 100644
--- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c
+++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c
@@ -181,7 +181,7 @@ static const struct comedi_lrange range_daqp_ao = { 1, {BIP_RANGE(5)} };
181/* comedi interface code */ 181/* comedi interface code */
182 182
183static int daqp_attach(struct comedi_device *dev, struct comedi_devconfig *it); 183static int daqp_attach(struct comedi_device *dev, struct comedi_devconfig *it);
184static int daqp_detach(struct comedi_device *dev); 184static void daqp_detach(struct comedi_device *dev);
185static struct comedi_driver driver_daqp = { 185static struct comedi_driver driver_daqp = {
186 .driver_name = "quatech_daqp_cs", 186 .driver_name = "quatech_daqp_cs",
187 .module = THIS_MODULE, 187 .module = THIS_MODULE,
@@ -922,15 +922,9 @@ static int daqp_attach(struct comedi_device *dev, struct comedi_devconfig *it)
922 return 1; 922 return 1;
923} 923}
924 924
925/* daqp_detach (called from comedi_comdig) does nothing. If the PCMCIA 925static void daqp_detach(struct comedi_device *dev)
926 * card is removed, daqp_cs_detach() is called by the pcmcia subsystem.
927 */
928
929static int daqp_detach(struct comedi_device *dev)
930{ 926{
931 printk(KERN_INFO "comedi%d: detaching daqp\n", dev->minor); 927 /* Nothing to cleanup */
932
933 return 0;
934} 928}
935 929
936/*==================================================================== 930/*====================================================================
@@ -1010,8 +1004,6 @@ static void daqp_cs_detach(struct pcmcia_device *link)
1010{ 1004{
1011 struct local_info_t *dev = link->priv; 1005 struct local_info_t *dev = link->priv;
1012 1006
1013 dev_dbg(&link->dev, "daqp_cs_detach\n");
1014
1015 dev->stop = 1; 1007 dev->stop = 1;
1016 daqp_cs_release(link); 1008 daqp_cs_release(link);
1017 1009
@@ -1019,7 +1011,7 @@ static void daqp_cs_detach(struct pcmcia_device *link)
1019 dev_table[dev->table_index] = NULL; 1011 dev_table[dev->table_index] = NULL;
1020 kfree(dev); 1012 kfree(dev);
1021 1013
1022} /* daqp_cs_detach */ 1014}
1023 1015
1024static int daqp_pcmcia_config_loop(struct pcmcia_device *p_dev, void *priv_data) 1016static int daqp_pcmcia_config_loop(struct pcmcia_device *p_dev, void *priv_data)
1025{ 1017{
diff --git a/drivers/staging/comedi/drivers/rtd520.c b/drivers/staging/comedi/drivers/rtd520.c
index 32766edcde37..1678a0ccb8c1 100644
--- a/drivers/staging/comedi/drivers/rtd520.c
+++ b/drivers/staging/comedi/drivers/rtd520.c
@@ -1081,30 +1081,12 @@ static int rtd_attach(struct comedi_device *dev, struct comedi_devconfig *it)
1081#endif 1081#endif
1082} 1082}
1083 1083
1084/* 1084static void rtd_detach(struct comedi_device *dev)
1085 * _detach is called to deconfigure a device. It should deallocate
1086 * resources.
1087 * This function is also called when _attach() fails, so it should be
1088 * careful not to release resources that were not necessarily
1089 * allocated by _attach(). dev->private and dev->subdevices are
1090 * deallocated automatically by the core.
1091 */
1092static int rtd_detach(struct comedi_device *dev)
1093{ 1085{
1094#ifdef USE_DMA 1086#ifdef USE_DMA
1095 int index; 1087 int index;
1096#endif 1088#endif
1097 1089
1098 DPRINTK("comedi%d: rtd520: removing (%ld ints)\n",
1099 dev->minor, (devpriv ? devpriv->intCount : 0L));
1100 if (devpriv && devpriv->lcfg) {
1101 DPRINTK
1102 ("(int status 0x%x, overrun status 0x%x, fifo status 0x%x)...\n",
1103 0xffff & RtdInterruptStatus(dev),
1104 0xffff & RtdInterruptOverrunStatus(dev),
1105 (0xffff & RtdFifoStatus(dev)) ^ 0x6666);
1106 }
1107
1108 if (devpriv) { 1090 if (devpriv) {
1109 /* Shut down any board ops by resetting it */ 1091 /* Shut down any board ops by resetting it */
1110#ifdef USE_DMA 1092#ifdef USE_DMA
@@ -1141,37 +1123,24 @@ static int rtd_detach(struct comedi_device *dev)
1141 devpriv->dma0Chain = NULL; 1123 devpriv->dma0Chain = NULL;
1142 } 1124 }
1143#endif /* USE_DMA */ 1125#endif /* USE_DMA */
1144
1145 /* release IRQ */
1146 if (dev->irq) { 1126 if (dev->irq) {
1147 /* disable interrupt controller */
1148 RtdPlxInterruptWrite(dev, RtdPlxInterruptRead(dev) 1127 RtdPlxInterruptWrite(dev, RtdPlxInterruptRead(dev)
1149 & ~(ICS_PLIE | ICS_DMA0_E | 1128 & ~(ICS_PLIE | ICS_DMA0_E |
1150 ICS_DMA1_E)); 1129 ICS_DMA1_E));
1151 free_irq(dev->irq, dev); 1130 free_irq(dev->irq, dev);
1152 } 1131 }
1153
1154 /* release all regions that were allocated */
1155 if (devpriv->las0) 1132 if (devpriv->las0)
1156 iounmap(devpriv->las0); 1133 iounmap(devpriv->las0);
1157
1158 if (devpriv->las1) 1134 if (devpriv->las1)
1159 iounmap(devpriv->las1); 1135 iounmap(devpriv->las1);
1160
1161 if (devpriv->lcfg) 1136 if (devpriv->lcfg)
1162 iounmap(devpriv->lcfg); 1137 iounmap(devpriv->lcfg);
1163
1164 if (devpriv->pci_dev) { 1138 if (devpriv->pci_dev) {
1165 if (devpriv->got_regions) 1139 if (devpriv->got_regions)
1166 comedi_pci_disable(devpriv->pci_dev); 1140 comedi_pci_disable(devpriv->pci_dev);
1167
1168 pci_dev_put(devpriv->pci_dev); 1141 pci_dev_put(devpriv->pci_dev);
1169 } 1142 }
1170 } 1143 }
1171
1172 printk(KERN_INFO "comedi%d: rtd520: removed.\n", dev->minor);
1173
1174 return 0;
1175} 1144}
1176 1145
1177/* 1146/*
diff --git a/drivers/staging/comedi/drivers/rti800.c b/drivers/staging/comedi/drivers/rti800.c
index c073bf46f62f..f0eb52a77881 100644
--- a/drivers/staging/comedi/drivers/rti800.c
+++ b/drivers/staging/comedi/drivers/rti800.c
@@ -443,17 +443,12 @@ static int rti800_attach(struct comedi_device *dev, struct comedi_devconfig *it)
443 return 0; 443 return 0;
444} 444}
445 445
446static int rti800_detach(struct comedi_device *dev) 446static void rti800_detach(struct comedi_device *dev)
447{ 447{
448 printk(KERN_INFO "comedi%d: rti800: remove\n", dev->minor);
449
450 if (dev->iobase) 448 if (dev->iobase)
451 release_region(dev->iobase, RTI800_SIZE); 449 release_region(dev->iobase, RTI800_SIZE);
452
453 if (dev->irq) 450 if (dev->irq)
454 free_irq(dev->irq, dev); 451 free_irq(dev->irq, dev);
455
456 return 0;
457} 452}
458 453
459static const struct rti800_board boardtypes[] = { 454static const struct rti800_board boardtypes[] = {
diff --git a/drivers/staging/comedi/drivers/rti802.c b/drivers/staging/comedi/drivers/rti802.c
index b4980b41596f..09da5c21858c 100644
--- a/drivers/staging/comedi/drivers/rti802.c
+++ b/drivers/staging/comedi/drivers/rti802.c
@@ -129,14 +129,10 @@ static int rti802_attach(struct comedi_device *dev, struct comedi_devconfig *it)
129 return 0; 129 return 0;
130} 130}
131 131
132static int rti802_detach(struct comedi_device *dev) 132static void rti802_detach(struct comedi_device *dev)
133{ 133{
134 printk(KERN_INFO "comedi%d: rti802: remove\n", dev->minor);
135
136 if (dev->iobase) 134 if (dev->iobase)
137 release_region(dev->iobase, RTI802_SIZE); 135 release_region(dev->iobase, RTI802_SIZE);
138
139 return 0;
140} 136}
141 137
142static struct comedi_driver rti802_driver = { 138static struct comedi_driver rti802_driver = {
diff --git a/drivers/staging/comedi/drivers/s526.c b/drivers/staging/comedi/drivers/s526.c
index 3f86ed781d72..7a56434eb224 100644
--- a/drivers/staging/comedi/drivers/s526.c
+++ b/drivers/staging/comedi/drivers/s526.c
@@ -938,14 +938,10 @@ static int s526_attach(struct comedi_device *dev, struct comedi_devconfig *it)
938 return 1; 938 return 1;
939} 939}
940 940
941static int s526_detach(struct comedi_device *dev) 941static void s526_detach(struct comedi_device *dev)
942{ 942{
943 printk(KERN_INFO "comedi%d: s526: remove\n", dev->minor);
944
945 if (dev->iobase > 0) 943 if (dev->iobase > 0)
946 release_region(dev->iobase, S526_IOSIZE); 944 release_region(dev->iobase, S526_IOSIZE);
947
948 return 0;
949} 945}
950 946
951static struct comedi_driver s526_driver = { 947static struct comedi_driver s526_driver = {
diff --git a/drivers/staging/comedi/drivers/s626.c b/drivers/staging/comedi/drivers/s626.c
index 56b111f3eccc..7beb8f6853af 100644
--- a/drivers/staging/comedi/drivers/s626.c
+++ b/drivers/staging/comedi/drivers/s626.c
@@ -1312,7 +1312,7 @@ static irqreturn_t s626_irq_handler(int irq, void *d)
1312 return IRQ_HANDLED; 1312 return IRQ_HANDLED;
1313} 1313}
1314 1314
1315static int s626_detach(struct comedi_device *dev) 1315static void s626_detach(struct comedi_device *dev)
1316{ 1316{
1317 if (devpriv) { 1317 if (devpriv) {
1318 /* stop ai_command */ 1318 /* stop ai_command */
@@ -1336,20 +1336,14 @@ static int s626_detach(struct comedi_device *dev)
1336 1336
1337 if (dev->irq) 1337 if (dev->irq)
1338 free_irq(dev->irq, dev); 1338 free_irq(dev->irq, dev);
1339
1340 if (devpriv->base_addr) 1339 if (devpriv->base_addr)
1341 iounmap(devpriv->base_addr); 1340 iounmap(devpriv->base_addr);
1342
1343 if (devpriv->pdev) { 1341 if (devpriv->pdev) {
1344 if (devpriv->got_regions) 1342 if (devpriv->got_regions)
1345 comedi_pci_disable(devpriv->pdev); 1343 comedi_pci_disable(devpriv->pdev);
1346 pci_dev_put(devpriv->pdev); 1344 pci_dev_put(devpriv->pdev);
1347 } 1345 }
1348 } 1346 }
1349
1350 DEBUG("s626_detach: S626 detached!\n");
1351
1352 return 0;
1353} 1347}
1354 1348
1355/* 1349/*
diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c
index 0fbd9f93ab0b..6342bc5ddb3e 100644
--- a/drivers/staging/comedi/drivers/serial2002.c
+++ b/drivers/staging/comedi/drivers/serial2002.c
@@ -848,18 +848,16 @@ static int serial2002_attach(struct comedi_device *dev,
848 return 1; 848 return 1;
849} 849}
850 850
851static int serial2002_detach(struct comedi_device *dev) 851static void serial2002_detach(struct comedi_device *dev)
852{ 852{
853 struct comedi_subdevice *s; 853 struct comedi_subdevice *s;
854 int i; 854 int i;
855 855
856 dev_dbg(dev->hw_dev, "comedi%d: remove\n", dev->minor);
857 for (i = 0; i < 5; i++) { 856 for (i = 0; i < 5; i++) {
858 s = &dev->subdevices[i]; 857 s = &dev->subdevices[i];
859 kfree(s->maxdata_list); 858 kfree(s->maxdata_list);
860 kfree(s->range_table_list); 859 kfree(s->range_table_list);
861 } 860 }
862 return 0;
863} 861}
864 862
865static const struct serial2002_board serial2002_boards[] = { 863static const struct serial2002_board serial2002_boards[] = {
diff --git a/drivers/staging/comedi/drivers/skel.c b/drivers/staging/comedi/drivers/skel.c
index 19a513eeebfe..7d13ffa7f4f9 100644
--- a/drivers/staging/comedi/drivers/skel.c
+++ b/drivers/staging/comedi/drivers/skel.c
@@ -156,7 +156,7 @@ struct skel_private {
156 * the device code. 156 * the device code.
157 */ 157 */
158static int skel_attach(struct comedi_device *dev, struct comedi_devconfig *it); 158static int skel_attach(struct comedi_device *dev, struct comedi_devconfig *it);
159static int skel_detach(struct comedi_device *dev); 159static void skel_detach(struct comedi_device *dev);
160static struct comedi_driver driver_skel = { 160static struct comedi_driver driver_skel = {
161 .driver_name = "dummy", 161 .driver_name = "dummy",
162 .module = THIS_MODULE, 162 .module = THIS_MODULE,
@@ -295,11 +295,8 @@ static int skel_attach(struct comedi_device *dev, struct comedi_devconfig *it)
295 * allocated by _attach(). dev->private and dev->subdevices are 295 * allocated by _attach(). dev->private and dev->subdevices are
296 * deallocated automatically by the core. 296 * deallocated automatically by the core.
297 */ 297 */
298static int skel_detach(struct comedi_device *dev) 298static void skel_detach(struct comedi_device *dev)
299{ 299{
300 pr_info("comedi%d: skel: remove\n", dev->minor);
301
302 return 0;
303} 300}
304 301
305/* 302/*
diff --git a/drivers/staging/comedi/drivers/ssv_dnp.c b/drivers/staging/comedi/drivers/ssv_dnp.c
index 25cb6593ac1c..16c4f5a757bb 100644
--- a/drivers/staging/comedi/drivers/ssv_dnp.c
+++ b/drivers/staging/comedi/drivers/ssv_dnp.c
@@ -239,20 +239,14 @@ static int dnp_attach(struct comedi_device *dev, struct comedi_devconfig *it)
239 return 1; 239 return 1;
240} 240}
241 241
242static int dnp_detach(struct comedi_device *dev) 242static void dnp_detach(struct comedi_device *dev)
243{ 243{
244 /* configure all ports as input (default) */
245 outb(PAMR, CSCIR); 244 outb(PAMR, CSCIR);
246 outb(0x00, CSCDR); 245 outb(0x00, CSCDR);
247 outb(PBMR, CSCIR); 246 outb(PBMR, CSCIR);
248 outb(0x00, CSCDR); 247 outb(0x00, CSCDR);
249 outb(PCMR, CSCIR); 248 outb(PCMR, CSCIR);
250 outb((inb(CSCDR) & 0xAA), CSCDR); 249 outb((inb(CSCDR) & 0xAA), CSCDR);
251
252 /* announce that we are finished */
253 printk(KERN_INFO "comedi%d: dnp: remove\n", dev->minor);
254
255 return 0;
256} 250}
257 251
258static const struct dnp_board dnp_boards[] = { 252static const struct dnp_board dnp_boards[] = {
diff --git a/drivers/staging/comedi/drivers/unioxx5.c b/drivers/staging/comedi/drivers/unioxx5.c
index 2d238ae7c936..d5f1f22aa708 100644
--- a/drivers/staging/comedi/drivers/unioxx5.c
+++ b/drivers/staging/comedi/drivers/unioxx5.c
@@ -484,7 +484,7 @@ static int unioxx5_attach(struct comedi_device *dev,
484 return 0; 484 return 0;
485} 485}
486 486
487static int unioxx5_detach(struct comedi_device *dev) 487static void unioxx5_detach(struct comedi_device *dev)
488{ 488{
489 int i; 489 int i;
490 struct comedi_subdevice *subdev; 490 struct comedi_subdevice *subdev;
@@ -496,8 +496,6 @@ static int unioxx5_detach(struct comedi_device *dev)
496 release_region(usp->usp_iobase, UNIOXX5_SIZE); 496 release_region(usp->usp_iobase, UNIOXX5_SIZE);
497 kfree(subdev->private); 497 kfree(subdev->private);
498 } 498 }
499
500 return 0;
501} 499}
502 500
503static struct comedi_driver unioxx5_driver = { 501static struct comedi_driver unioxx5_driver = {
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c
index 3d300eff493f..13d9fd3efcfd 100644
--- a/drivers/staging/comedi/drivers/usbdux.c
+++ b/drivers/staging/comedi/drivers/usbdux.c
@@ -2823,36 +2823,17 @@ static int usbdux_attach_usb(struct comedi_device *dev,
2823 return ret; 2823 return ret;
2824} 2824}
2825 2825
2826static int usbdux_detach(struct comedi_device *dev) 2826static void usbdux_detach(struct comedi_device *dev)
2827{ 2827{
2828 struct usbduxsub *usbduxsub_tmp; 2828 struct usbduxsub *usb = dev->private;
2829 2829
2830 if (!dev) { 2830 if (usb) {
2831 printk(KERN_ERR 2831 down(&usb->sem);
2832 "comedi?: usbdux: detach without dev variable...\n"); 2832 dev->private = NULL;
2833 return -EFAULT; 2833 usb->attached = 0;
2834 } 2834 usb->comedidev = NULL;
2835 2835 up(&usb->sem);
2836 usbduxsub_tmp = dev->private;
2837 if (!usbduxsub_tmp) {
2838 printk(KERN_ERR
2839 "comedi?: usbdux: detach without ptr to usbduxsub[]\n");
2840 return -EFAULT;
2841 } 2836 }
2842
2843 dev_dbg(&usbduxsub_tmp->interface->dev, "comedi%d: detach usb device\n",
2844 dev->minor);
2845
2846 down(&usbduxsub_tmp->sem);
2847 /* Don't allow detach to free the private structure */
2848 /* It's one entry of of usbduxsub[] */
2849 dev->private = NULL;
2850 usbduxsub_tmp->attached = 0;
2851 usbduxsub_tmp->comedidev = NULL;
2852 dev_dbg(&usbduxsub_tmp->interface->dev,
2853 "comedi%d: detach: successfully removed\n", dev->minor);
2854 up(&usbduxsub_tmp->sem);
2855 return 0;
2856} 2837}
2857 2838
2858/* main driver struct */ 2839/* main driver struct */
diff --git a/drivers/staging/comedi/drivers/usbduxfast.c b/drivers/staging/comedi/drivers/usbduxfast.c
index c672ea3784a6..7b1d21a6fc53 100644
--- a/drivers/staging/comedi/drivers/usbduxfast.c
+++ b/drivers/staging/comedi/drivers/usbduxfast.c
@@ -1726,43 +1726,19 @@ static int usbduxfast_attach(struct comedi_device *dev,
1726 return 0; 1726 return 0;
1727} 1727}
1728 1728
1729static int usbduxfast_detach(struct comedi_device *dev) 1729static void usbduxfast_detach(struct comedi_device *dev)
1730{ 1730{
1731 struct usbduxfastsub_s *udfs; 1731 struct usbduxfastsub_s *usb = dev->private;
1732 1732
1733 if (!dev) { 1733 if (usb) {
1734 printk(KERN_ERR "comedi?: usbduxfast: detach without dev " 1734 down(&usb->sem);
1735 "variable...\n"); 1735 down(&start_stop_sem);
1736 return -EFAULT; 1736 dev->private = NULL;
1737 } 1737 usb->attached = 0;
1738#ifdef CONFIG_COMEDI_DEBUG 1738 usb->comedidev = NULL;
1739 printk(KERN_DEBUG "comedi%d: usbduxfast: detach usb device\n", 1739 up(&start_stop_sem);
1740 dev->minor); 1740 up(&usb->sem);
1741#endif
1742
1743 udfs = dev->private;
1744 if (!udfs) {
1745 printk(KERN_ERR "comedi?: usbduxfast: detach without ptr to "
1746 "usbduxfastsub[]\n");
1747 return -EFAULT;
1748 } 1741 }
1749
1750 down(&udfs->sem);
1751 down(&start_stop_sem);
1752 /*
1753 * Don't allow detach to free the private structure
1754 * It's one entry of of usbduxfastsub[]
1755 */
1756 dev->private = NULL;
1757 udfs->attached = 0;
1758 udfs->comedidev = NULL;
1759#ifdef CONFIG_COMEDI_DEBUG
1760 printk(KERN_DEBUG "comedi%d: usbduxfast: detach: successfully "
1761 "removed\n", dev->minor);
1762#endif
1763 up(&start_stop_sem);
1764 up(&udfs->sem);
1765 return 0;
1766} 1742}
1767 1743
1768/* 1744/*
diff --git a/drivers/staging/comedi/drivers/usbduxsigma.c b/drivers/staging/comedi/drivers/usbduxsigma.c
index f21bb0dd9167..465afbdf4069 100644
--- a/drivers/staging/comedi/drivers/usbduxsigma.c
+++ b/drivers/staging/comedi/drivers/usbduxsigma.c
@@ -2801,37 +2801,17 @@ static int usbduxsigma_attach(struct comedi_device *dev,
2801 return 0; 2801 return 0;
2802} 2802}
2803 2803
2804static int usbduxsigma_detach(struct comedi_device *dev) 2804static void usbduxsigma_detach(struct comedi_device *dev)
2805{ 2805{
2806 struct usbduxsub *usbduxsub_tmp; 2806 struct usbduxsub *usb = dev->private;
2807 2807
2808 if (!dev) { 2808 if (usb) {
2809 printk(KERN_ERR 2809 down(&usb->sem);
2810 "comedi? usbduxsigma detach: dev=NULL\n"); 2810 dev->private = NULL;
2811 return -EFAULT; 2811 usb->attached = 0;
2812 } 2812 usb->comedidev = NULL;
2813 2813 up(&usb->sem);
2814 usbduxsub_tmp = dev->private;
2815 if (!usbduxsub_tmp) {
2816 printk(KERN_ERR
2817 "comedi?: usbduxsigma detach: private=NULL\n");
2818 return -EFAULT;
2819 } 2814 }
2820
2821 dev_dbg(&usbduxsub_tmp->interface->dev,
2822 "comedi%d: detach usb device\n",
2823 dev->minor);
2824
2825 down(&usbduxsub_tmp->sem);
2826 /* Don't allow detach to free the private structure */
2827 /* It's one entry of of usbduxsub[] */
2828 dev->private = NULL;
2829 usbduxsub_tmp->attached = 0;
2830 usbduxsub_tmp->comedidev = NULL;
2831 dev_info(&usbduxsub_tmp->interface->dev,
2832 "comedi%d: successfully detached.\n", dev->minor);
2833 up(&usbduxsub_tmp->sem);
2834 return 0;
2835} 2815}
2836 2816
2837/* main driver struct */ 2817/* main driver struct */
diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c
index d0e106523a56..baee8d767636 100644
--- a/drivers/staging/comedi/drivers/vmk80xx.c
+++ b/drivers/staging/comedi/drivers/vmk80xx.c
@@ -1250,32 +1250,16 @@ static int vmk80xx_attach(struct comedi_device *cdev,
1250 return 0; 1250 return 0;
1251} 1251}
1252 1252
1253static int vmk80xx_detach(struct comedi_device *cdev) 1253static void vmk80xx_detach(struct comedi_device *dev)
1254{ 1254{
1255 struct vmk80xx_usb *dev; 1255 struct vmk80xx_usb *usb = dev->private;
1256 int minor;
1257
1258 if (!cdev)
1259 return -EFAULT;
1260
1261 dev = cdev->private;
1262 if (!dev)
1263 return -EFAULT;
1264
1265 down(&dev->limit_sem);
1266
1267 cdev->private = NULL;
1268 dev->attached = 0;
1269 1256
1270 minor = cdev->minor; 1257 if (usb) {
1271 1258 down(&usb->limit_sem);
1272 printk(KERN_INFO 1259 dev->private = NULL;
1273 "comedi%d: vmk80xx: board #%d [%s] detached from comedi\n", 1260 usb->attached = 0;
1274 minor, dev->count, dev->board.name); 1261 up(&usb->limit_sem);
1275 1262 }
1276 up(&dev->limit_sem);
1277
1278 return 0;
1279} 1263}
1280 1264
1281static int vmk80xx_probe(struct usb_interface *intf, 1265static int vmk80xx_probe(struct usb_interface *intf,