Introduce a generic (*detach) function for comedi PCI drivers to handle
the boilerplate code needed to detach a PCI driver.

This function works similar to comedi_legacy_detach() where it will:

  * free the dev->irq if it has been requested
  * iounmap the dev->mmio addres if it has been ioremap'ed

The helper then calls comedi_pci_disable() to release the regions and
disable the PCI device.

Use the new helper directly for the (*detach) in the following cases:

  * where comedi_pci_disable() is used directly for the (*detach)
  * where the detach function is just boilerplate

Use the new helper in the (*detach) of the simpler PCI drivers. Call
the helper after disabling interrupts (reset) and before any additional
cleanup (kfree) to avoid any race conditions with the interrupt handler.

Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/staging/comedi/comedi_pci.c                | 24 ++++++++++++++++++++++
 drivers/staging/comedi/comedidev.h                 |  5 +++++
 drivers/staging/comedi/drivers/8255_pci.c          |  9 +-------
 .../staging/comedi/drivers/addi-data/addi_common.c | 12 +++--------
 drivers/staging/comedi/drivers/addi_apci_1032.c    |  4 +---
 drivers/staging/comedi/drivers/addi_apci_1516.c    |  2 +-
 drivers/staging/comedi/drivers/addi_apci_1564.c    |  4 +---
 drivers/staging/comedi/drivers/addi_apci_16xx.c    |  2 +-
 drivers/staging/comedi/drivers/addi_apci_2032.c    |  4 +---
 drivers/staging/comedi/drivers/addi_apci_2200.c    |  2 +-
 drivers/staging/comedi/drivers/addi_apci_3120.c    |  8 +++-----
 drivers/staging/comedi/drivers/addi_apci_3501.c    |  4 +---
 drivers/staging/comedi/drivers/addi_apci_3xxx.c    | 14 +++----------
 drivers/staging/comedi/drivers/adl_pci6208.c       |  2 +-
 drivers/staging/comedi/drivers/adl_pci7x3x.c       |  2 +-
 drivers/staging/comedi/drivers/adl_pci8164.c       |  2 +-
 drivers/staging/comedi/drivers/adl_pci9111.c       |  4 +---
 drivers/staging/comedi/drivers/adl_pci9118.c       |  8 +++-----
 drivers/staging/comedi/drivers/adv_pci1710.c       |  4 +---
 drivers/staging/comedi/drivers/adv_pci1723.c       |  2 +-
 drivers/staging/comedi/drivers/adv_pci1724.c       |  2 +-
 drivers/staging/comedi/drivers/amplc_pci224.c      |  4 +---
 drivers/staging/comedi/drivers/amplc_pci230.c      |  4 +---
 drivers/staging/comedi/drivers/amplc_pci236.c      |  9 +-------
 drivers/staging/comedi/drivers/amplc_pci263.c      |  2 +-
 drivers/staging/comedi/drivers/cb_pcidas.c         | 13 ++++--------
 drivers/staging/comedi/drivers/cb_pcidda.c         |  2 +-
 drivers/staging/comedi/drivers/cb_pcimdas.c        |  9 +-------
 drivers/staging/comedi/drivers/cb_pcimdda.c        |  2 +-
 drivers/staging/comedi/drivers/contec_pci_dio.c    |  2 +-
 drivers/staging/comedi/drivers/das08_pci.c         |  2 +-
 drivers/staging/comedi/drivers/dt3000.c            | 11 +---------
 drivers/staging/comedi/drivers/dyna_pci10xx.c      |  2 +-
 drivers/staging/comedi/drivers/ke_counter.c        |  2 +-
 drivers/staging/comedi/drivers/me4000.c            |  4 +---
 drivers/staging/comedi/drivers/me_daq.c            |  6 ++----
 drivers/staging/comedi/drivers/mf6x4.c             |  5 +----
 drivers/staging/comedi/drivers/ni_6527.c           |  6 +-----
 drivers/staging/comedi/drivers/ni_65xx.c           |  8 ++------
 drivers/staging/comedi/drivers/ni_670x.c           |  4 +---
 drivers/staging/comedi/drivers/ni_labpc_pci.c      | 11 +---------
 drivers/staging/comedi/drivers/skel.c              |  2 +-
 42 files changed, 82 insertions(+), 148 deletions(-)

diff --git a/drivers/staging/comedi/comedi_pci.c 
b/drivers/staging/comedi/comedi_pci.c
index abbc0e4..aa0795a 100644
--- a/drivers/staging/comedi/comedi_pci.c
+++ b/drivers/staging/comedi/comedi_pci.c
@@ -17,6 +17,7 @@
  */
 
 #include <linux/pci.h>
+#include <linux/interrupt.h>
 
 #include "comedidev.h"
 
@@ -73,6 +74,29 @@ void comedi_pci_disable(struct comedi_device *dev)
 EXPORT_SYMBOL_GPL(comedi_pci_disable);
 
 /**
+ * comedi_pci_detach() - A generic (*detach) function for PCI drivers.
+ * @dev: comedi_device struct
+ */
+void comedi_pci_detach(struct comedi_device *dev)
+{
+       struct pci_dev *pcidev = comedi_to_pci_dev(dev);
+
+       if (!pcidev || !dev->ioenabled)
+               return;
+
+       if (dev->irq) {
+               free_irq(dev->irq, dev);
+               dev->irq = 0;
+       }
+       if (dev->mmio) {
+               iounmap(dev->mmio);
+               dev->mmio = NULL;
+       }
+       comedi_pci_disable(dev);
+}
+EXPORT_SYMBOL_GPL(comedi_pci_detach);
+
+/**
  * comedi_pci_auto_config() - Configure/probe a comedi PCI driver.
  * @pcidev: pci_dev struct
  * @driver: comedi_driver struct
diff --git a/drivers/staging/comedi/comedidev.h 
b/drivers/staging/comedi/comedidev.h
index 58e58a3..7ea293a 100644
--- a/drivers/staging/comedi/comedidev.h
+++ b/drivers/staging/comedi/comedidev.h
@@ -503,6 +503,7 @@ struct pci_dev *comedi_to_pci_dev(struct comedi_device *);
 
 int comedi_pci_enable(struct comedi_device *);
 void comedi_pci_disable(struct comedi_device *);
+void comedi_pci_detach(struct comedi_device *);
 
 int comedi_pci_auto_config(struct pci_dev *, struct comedi_driver *,
                           unsigned long context);
@@ -547,6 +548,10 @@ static inline void comedi_pci_disable(struct comedi_device 
*dev)
 {
 }
 
+static inline void comedi_pci_detach(struct comedi_device *dev)
+{
+}
+
 #endif /* CONFIG_COMEDI_PCI_DRIVERS */
 
 #ifdef CONFIG_COMEDI_PCMCIA_DRIVERS
diff --git a/drivers/staging/comedi/drivers/8255_pci.c 
b/drivers/staging/comedi/drivers/8255_pci.c
index f21e656..21f8b17 100644
--- a/drivers/staging/comedi/drivers/8255_pci.c
+++ b/drivers/staging/comedi/drivers/8255_pci.c
@@ -265,18 +265,11 @@ static int pci_8255_auto_attach(struct comedi_device *dev,
        return 0;
 }
 
-static void pci_8255_detach(struct comedi_device *dev)
-{
-       if (dev->mmio)
-               iounmap(dev->mmio);
-       comedi_pci_disable(dev);
-}
-
 static struct comedi_driver pci_8255_driver = {
        .driver_name    = "8255_pci",
        .module         = THIS_MODULE,
        .auto_attach    = pci_8255_auto_attach,
-       .detach         = pci_8255_detach,
+       .detach         = comedi_pci_detach,
 };
 
 static int pci_8255_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.c 
b/drivers/staging/comedi/drivers/addi-data/addi_common.c
index de5843a..025b451 100644
--- a/drivers/staging/comedi/drivers/addi-data/addi_common.c
+++ b/drivers/staging/comedi/drivers/addi-data/addi_common.c
@@ -268,13 +268,7 @@ static int addi_auto_attach(struct comedi_device *dev,
 
 static void i_ADDI_Detach(struct comedi_device *dev)
 {
-       struct addi_private *devpriv = dev->private;
-
-       if (devpriv) {
-               if (dev->iobase)
-                       i_ADDI_Reset(dev);
-               if (dev->irq)
-                       free_irq(dev->irq, dev);
-       }
-       comedi_pci_disable(dev);
+       if (dev->iobase)
+               i_ADDI_Reset(dev);
+       comedi_pci_detach(dev);
 }
diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c 
b/drivers/staging/comedi/drivers/addi_apci_1032.c
index 1b2e7c0..8a556fe 100644
--- a/drivers/staging/comedi/drivers/addi_apci_1032.c
+++ b/drivers/staging/comedi/drivers/addi_apci_1032.c
@@ -347,9 +347,7 @@ static void apci1032_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                apci1032_reset(dev);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver apci1032_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_1516.c 
b/drivers/staging/comedi/drivers/addi_apci_1516.c
index e9c5291..5cd3968 100644
--- a/drivers/staging/comedi/drivers/addi_apci_1516.c
+++ b/drivers/staging/comedi/drivers/addi_apci_1516.c
@@ -190,7 +190,7 @@ static void apci1516_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                apci1516_reset(dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver apci1516_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_1564.c 
b/drivers/staging/comedi/drivers/addi_apci_1564.c
index 543cb07..75bb60e 100644
--- a/drivers/staging/comedi/drivers/addi_apci_1564.c
+++ b/drivers/staging/comedi/drivers/addi_apci_1564.c
@@ -444,9 +444,7 @@ static void apci1564_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                apci1564_reset(dev);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver apci1564_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_16xx.c 
b/drivers/staging/comedi/drivers/addi_apci_16xx.c
index 28df4b5..4162e2d 100644
--- a/drivers/staging/comedi/drivers/addi_apci_16xx.c
+++ b/drivers/staging/comedi/drivers/addi_apci_16xx.c
@@ -159,7 +159,7 @@ static struct comedi_driver apci16xx_driver = {
        .driver_name    = "addi_apci_16xx",
        .module         = THIS_MODULE,
        .auto_attach    = apci16xx_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int apci16xx_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/addi_apci_2032.c 
b/drivers/staging/comedi/drivers/addi_apci_2032.c
index be0a8a7..3f9b909 100644
--- a/drivers/staging/comedi/drivers/addi_apci_2032.c
+++ b/drivers/staging/comedi/drivers/addi_apci_2032.c
@@ -339,11 +339,9 @@ static void apci2032_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                apci2032_reset(dev);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
+       comedi_pci_detach(dev);
        if (dev->read_subdev)
                kfree(dev->read_subdev->private);
-       comedi_pci_disable(dev);
 }
 
 static struct comedi_driver apci2032_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_2200.c 
b/drivers/staging/comedi/drivers/addi_apci_2200.c
index e1a9165..51ab1f9 100644
--- a/drivers/staging/comedi/drivers/addi_apci_2200.c
+++ b/drivers/staging/comedi/drivers/addi_apci_2200.c
@@ -118,7 +118,7 @@ static void apci2200_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                apci2200_reset(dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver apci2200_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_3120.c 
b/drivers/staging/comedi/drivers/addi_apci_3120.c
index 0b77f10..050c724 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3120.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3120.c
@@ -195,11 +195,10 @@ static void apci3120_detach(struct comedi_device *dev)
 {
        struct addi_private *devpriv = dev->private;
 
+       if (dev->iobase)
+               apci3120_reset(dev);
+       comedi_pci_detach(dev);
        if (devpriv) {
-               if (dev->iobase)
-                       apci3120_reset(dev);
-               if (dev->irq)
-                       free_irq(dev->irq, dev);
                if (devpriv->ul_DmaBufferVirtual[0]) {
                        free_pages((unsigned long)devpriv->
                                ul_DmaBufferVirtual[0],
@@ -211,7 +210,6 @@ static void apci3120_detach(struct comedi_device *dev)
                                devpriv->ui_DmaBufferPages[1]);
                }
        }
-       comedi_pci_disable(dev);
 }
 
 static struct comedi_driver apci3120_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_3501.c 
b/drivers/staging/comedi/drivers/addi_apci_3501.c
index d9594f4..b7e14c5 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3501.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3501.c
@@ -410,9 +410,7 @@ static void apci3501_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                apci3501_reset(dev);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver apci3501_driver = {
diff --git a/drivers/staging/comedi/drivers/addi_apci_3xxx.c 
b/drivers/staging/comedi/drivers/addi_apci_3xxx.c
index 0f0c7fa..a6e7662 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3xxx.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3xxx.c
@@ -901,17 +901,9 @@ static int apci3xxx_auto_attach(struct comedi_device *dev,
 
 static void apci3xxx_detach(struct comedi_device *dev)
 {
-       struct apci3xxx_private *devpriv = dev->private;
-
-       if (devpriv) {
-               if (dev->iobase)
-                       apci3xxx_reset(dev);
-               if (dev->irq)
-                       free_irq(dev->irq, dev);
-               if (dev->mmio)
-                       iounmap(dev->mmio);
-       }
-       comedi_pci_disable(dev);
+       if (dev->mmio)
+               apci3xxx_reset(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver apci3xxx_driver = {
diff --git a/drivers/staging/comedi/drivers/adl_pci6208.c 
b/drivers/staging/comedi/drivers/adl_pci6208.c
index 921f694..3b4f787 100644
--- a/drivers/staging/comedi/drivers/adl_pci6208.c
+++ b/drivers/staging/comedi/drivers/adl_pci6208.c
@@ -230,7 +230,7 @@ static struct comedi_driver adl_pci6208_driver = {
        .driver_name    = "adl_pci6208",
        .module         = THIS_MODULE,
        .auto_attach    = pci6208_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int adl_pci6208_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/adl_pci7x3x.c 
b/drivers/staging/comedi/drivers/adl_pci7x3x.c
index 5e3cc77..fb8e5f5 100644
--- a/drivers/staging/comedi/drivers/adl_pci7x3x.c
+++ b/drivers/staging/comedi/drivers/adl_pci7x3x.c
@@ -246,7 +246,7 @@ static struct comedi_driver adl_pci7x3x_driver = {
        .driver_name    = "adl_pci7x3x",
        .module         = THIS_MODULE,
        .auto_attach    = adl_pci7x3x_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int adl_pci7x3x_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/adl_pci8164.c 
b/drivers/staging/comedi/drivers/adl_pci8164.c
index 300df55..72bccb4 100644
--- a/drivers/staging/comedi/drivers/adl_pci8164.c
+++ b/drivers/staging/comedi/drivers/adl_pci8164.c
@@ -135,7 +135,7 @@ static struct comedi_driver adl_pci8164_driver = {
        .driver_name    = "adl_pci8164",
        .module         = THIS_MODULE,
        .auto_attach    = adl_pci8164_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int adl_pci8164_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/adl_pci9111.c 
b/drivers/staging/comedi/drivers/adl_pci9111.c
index 51edfeb..823ba34 100644
--- a/drivers/staging/comedi/drivers/adl_pci9111.c
+++ b/drivers/staging/comedi/drivers/adl_pci9111.c
@@ -793,9 +793,7 @@ static void pci9111_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                pci9111_reset(dev);
-       if (dev->irq != 0)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static 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 f30b84e..6fc50b3 100644
--- a/drivers/staging/comedi/drivers/adl_pci9118.c
+++ b/drivers/staging/comedi/drivers/adl_pci9118.c
@@ -2033,11 +2033,10 @@ static void pci9118_detach(struct comedi_device *dev)
        struct pci_dev *pcidev = comedi_to_pci_dev(dev);
        struct pci9118_private *devpriv = dev->private;
 
+       if (dev->iobase)
+               pci9118_reset(dev);
+       comedi_pci_detach(dev);
        if (devpriv) {
-               if (dev->iobase)
-                       pci9118_reset(dev);
-               if (dev->irq)
-                       free_irq(dev->irq, dev);
                if (devpriv->dmabuf_virt[0])
                        free_pages((unsigned long)devpriv->dmabuf_virt[0],
                                   devpriv->dmabuf_pages[0]);
@@ -2045,7 +2044,6 @@ static void pci9118_detach(struct comedi_device *dev)
                        free_pages((unsigned long)devpriv->dmabuf_virt[1],
                                   devpriv->dmabuf_pages[1]);
        }
-       comedi_pci_disable(dev);
        if (pcidev)
                pci_dev_put(pcidev);
 }
diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c 
b/drivers/staging/comedi/drivers/adv_pci1710.c
index e19ab95..3e37b0b 100644
--- a/drivers/staging/comedi/drivers/adv_pci1710.c
+++ b/drivers/staging/comedi/drivers/adv_pci1710.c
@@ -1250,9 +1250,7 @@ static void pci1710_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                pci1710_reset(dev);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static 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 1881df4..1610e2b 100644
--- a/drivers/staging/comedi/drivers/adv_pci1723.c
+++ b/drivers/staging/comedi/drivers/adv_pci1723.c
@@ -286,7 +286,7 @@ static void pci1723_detach(struct comedi_device *dev)
 {
        if (dev->iobase)
                pci1723_reset(dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver adv_pci1723_driver = {
diff --git a/drivers/staging/comedi/drivers/adv_pci1724.c 
b/drivers/staging/comedi/drivers/adv_pci1724.c
index bc3c349..2697758 100644
--- a/drivers/staging/comedi/drivers/adv_pci1724.c
+++ b/drivers/staging/comedi/drivers/adv_pci1724.c
@@ -372,7 +372,7 @@ static struct comedi_driver adv_pci1724_driver = {
        .driver_name = "adv_pci1724",
        .module = THIS_MODULE,
        .auto_attach = adv_pci1724_auto_attach,
-       .detach = comedi_pci_disable,
+       .detach = comedi_pci_detach,
 };
 
 static int adv_pci1724_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/amplc_pci224.c 
b/drivers/staging/comedi/drivers/amplc_pci224.c
index 0b056cf..1d84e84 100644
--- a/drivers/staging/comedi/drivers/amplc_pci224.c
+++ b/drivers/staging/comedi/drivers/amplc_pci224.c
@@ -1166,14 +1166,12 @@ static void pci224_detach(struct comedi_device *dev)
 {
        struct pci224_private *devpriv = dev->private;
 
-       if (dev->irq)
-               free_irq(dev->irq, dev);
+       comedi_pci_detach(dev);
        if (devpriv) {
                kfree(devpriv->ao_readback);
                kfree(devpriv->ao_scan_vals);
                kfree(devpriv->ao_scan_order);
        }
-       comedi_pci_disable(dev);
 }
 
 static 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 684275d..99f7694 100644
--- a/drivers/staging/comedi/drivers/amplc_pci230.c
+++ b/drivers/staging/comedi/drivers/amplc_pci230.c
@@ -2864,9 +2864,7 @@ static void pci230_detach(struct comedi_device *dev)
 {
        struct pci_dev *pcidev = comedi_to_pci_dev(dev);
 
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
        if (pcidev)
                pci_dev_put(pcidev);
 }
diff --git a/drivers/staging/comedi/drivers/amplc_pci236.c 
b/drivers/staging/comedi/drivers/amplc_pci236.c
index 436aeba..ad1e93d 100644
--- a/drivers/staging/comedi/drivers/amplc_pci236.c
+++ b/drivers/staging/comedi/drivers/amplc_pci236.c
@@ -119,18 +119,11 @@ static int pci236_auto_attach(struct comedi_device *dev,
                                         IRQF_SHARED);
 }
 
-static void pci236_detach(struct comedi_device *dev)
-{
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
-}
-
 static struct comedi_driver amplc_pci236_driver = {
        .driver_name = "amplc_pci236",
        .module = THIS_MODULE,
        .auto_attach = pci236_auto_attach,
-       .detach = pci236_detach,
+       .detach = comedi_pci_detach,
 };
 
 static const struct pci_device_id pci236_pci_table[] = {
diff --git a/drivers/staging/comedi/drivers/amplc_pci263.c 
b/drivers/staging/comedi/drivers/amplc_pci263.c
index 748a6b1..2259bee 100644
--- a/drivers/staging/comedi/drivers/amplc_pci263.c
+++ b/drivers/staging/comedi/drivers/amplc_pci263.c
@@ -86,7 +86,7 @@ static struct comedi_driver amplc_pci263_driver = {
        .driver_name    = "amplc_pci263",
        .module         = THIS_MODULE,
        .auto_attach    = pci263_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static const struct pci_device_id pci263_pci_table[] = {
diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c 
b/drivers/staging/comedi/drivers/cb_pcidas.c
index 4a7bd4e..80908eb 100644
--- a/drivers/staging/comedi/drivers/cb_pcidas.c
+++ b/drivers/staging/comedi/drivers/cb_pcidas.c
@@ -1599,15 +1599,10 @@ static void cb_pcidas_detach(struct comedi_device *dev)
 {
        struct cb_pcidas_private *devpriv = dev->private;
 
-       if (devpriv) {
-               if (devpriv->s5933_config) {
-                       outl(INTCSR_INBOX_INTR_STATUS,
-                            devpriv->s5933_config + AMCC_OP_REG_INTCSR);
-               }
-       }
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       if (devpriv && devpriv->s5933_config)
+               outl(INTCSR_INBOX_INTR_STATUS,
+                    devpriv->s5933_config + AMCC_OP_REG_INTCSR);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver cb_pcidas_driver = {
diff --git a/drivers/staging/comedi/drivers/cb_pcidda.c 
b/drivers/staging/comedi/drivers/cb_pcidda.c
index 901dc5d..bbec7529 100644
--- a/drivers/staging/comedi/drivers/cb_pcidda.c
+++ b/drivers/staging/comedi/drivers/cb_pcidda.c
@@ -395,7 +395,7 @@ static struct comedi_driver cb_pcidda_driver = {
        .driver_name    = "cb_pcidda",
        .module         = THIS_MODULE,
        .auto_attach    = cb_pcidda_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int cb_pcidda_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/cb_pcimdas.c 
b/drivers/staging/comedi/drivers/cb_pcimdas.c
index ccb9c72..765e0a0 100644
--- a/drivers/staging/comedi/drivers/cb_pcimdas.c
+++ b/drivers/staging/comedi/drivers/cb_pcimdas.c
@@ -259,18 +259,11 @@ static int cb_pcimdas_auto_attach(struct comedi_device 
*dev,
        return 0;
 }
 
-static void cb_pcimdas_detach(struct comedi_device *dev)
-{
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
-}
-
 static struct comedi_driver cb_pcimdas_driver = {
        .driver_name    = "cb_pcimdas",
        .module         = THIS_MODULE,
        .auto_attach    = cb_pcimdas_auto_attach,
-       .detach         = cb_pcimdas_detach,
+       .detach         = comedi_pci_detach,
 };
 
 static int cb_pcimdas_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/cb_pcimdda.c 
b/drivers/staging/comedi/drivers/cb_pcimdda.c
index 4a2b200..e5483eb 100644
--- a/drivers/staging/comedi/drivers/cb_pcimdda.c
+++ b/drivers/staging/comedi/drivers/cb_pcimdda.c
@@ -194,7 +194,7 @@ static struct comedi_driver cb_pcimdda_driver = {
        .driver_name    = "cb_pcimdda",
        .module         = THIS_MODULE,
        .auto_attach    = cb_pcimdda_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int cb_pcimdda_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/contec_pci_dio.c 
b/drivers/staging/comedi/drivers/contec_pci_dio.c
index f066fb0..205f9df 100644
--- a/drivers/staging/comedi/drivers/contec_pci_dio.c
+++ b/drivers/staging/comedi/drivers/contec_pci_dio.c
@@ -97,7 +97,7 @@ static struct comedi_driver contec_pci_dio_driver = {
        .driver_name    = "contec_pci_dio",
        .module         = THIS_MODULE,
        .auto_attach    = contec_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int contec_pci_dio_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/das08_pci.c 
b/drivers/staging/comedi/drivers/das08_pci.c
index 4ce3eb0..0987ce55 100644
--- a/drivers/staging/comedi/drivers/das08_pci.c
+++ b/drivers/staging/comedi/drivers/das08_pci.c
@@ -77,7 +77,7 @@ static struct comedi_driver das08_pci_comedi_driver = {
        .driver_name    = "pci-das08",
        .module         = THIS_MODULE,
        .auto_attach    = das08_pci_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int das08_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/dt3000.c 
b/drivers/staging/comedi/drivers/dt3000.c
index 56e21cc..c8732fb 100644
--- a/drivers/staging/comedi/drivers/dt3000.c
+++ b/drivers/staging/comedi/drivers/dt3000.c
@@ -750,20 +750,11 @@ static int dt3000_auto_attach(struct comedi_device *dev,
        return 0;
 }
 
-static void dt3000_detach(struct comedi_device *dev)
-{
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       if (dev->mmio)
-               iounmap(dev->mmio);
-       comedi_pci_disable(dev);
-}
-
 static struct comedi_driver dt3000_driver = {
        .driver_name    = "dt3000",
        .module         = THIS_MODULE,
        .auto_attach    = dt3000_auto_attach,
-       .detach         = dt3000_detach,
+       .detach         = comedi_pci_detach,
 };
 
 static int dt3000_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/dyna_pci10xx.c 
b/drivers/staging/comedi/drivers/dyna_pci10xx.c
index e5593f8..608aee0 100644
--- a/drivers/staging/comedi/drivers/dyna_pci10xx.c
+++ b/drivers/staging/comedi/drivers/dyna_pci10xx.c
@@ -243,9 +243,9 @@ static void dyna_pci10xx_detach(struct comedi_device *dev)
 {
        struct dyna_pci10xx_private *devpriv = dev->private;
 
+       comedi_pci_detach(dev);
        if (devpriv)
                mutex_destroy(&devpriv->mutex);
-       comedi_pci_disable(dev);
 }
 
 static struct comedi_driver dyna_pci10xx_driver = {
diff --git a/drivers/staging/comedi/drivers/ke_counter.c 
b/drivers/staging/comedi/drivers/ke_counter.c
index f46722c..77e94a3 100644
--- a/drivers/staging/comedi/drivers/ke_counter.c
+++ b/drivers/staging/comedi/drivers/ke_counter.c
@@ -212,7 +212,7 @@ static struct comedi_driver ke_counter_driver = {
        .driver_name    = "ke_counter",
        .module         = THIS_MODULE,
        .auto_attach    = ke_counter_auto_attach,
-       .detach         = comedi_pci_disable,
+       .detach         = comedi_pci_detach,
 };
 
 static int ke_counter_pci_probe(struct pci_dev *dev,
diff --git a/drivers/staging/comedi/drivers/me4000.c 
b/drivers/staging/comedi/drivers/me4000.c
index 9a5c535..bb2f2f1 100644
--- a/drivers/staging/comedi/drivers/me4000.c
+++ b/drivers/staging/comedi/drivers/me4000.c
@@ -1563,11 +1563,9 @@ static int me4000_auto_attach(struct comedi_device *dev,
 
 static void me4000_detach(struct comedi_device *dev)
 {
-       if (dev->irq)
-               free_irq(dev->irq, dev);
        if (dev->iobase)
                me4000_reset(dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver me4000_driver = {
diff --git a/drivers/staging/comedi/drivers/me_daq.c 
b/drivers/staging/comedi/drivers/me_daq.c
index 37a6fa9..a1e52a9 100644
--- a/drivers/staging/comedi/drivers/me_daq.c
+++ b/drivers/staging/comedi/drivers/me_daq.c
@@ -554,14 +554,12 @@ static void me_detach(struct comedi_device *dev)
        struct me_private_data *dev_private = dev->private;
 
        if (dev_private) {
-               if (dev->mmio) {
+               if (dev->mmio)
                        me_reset(dev);
-                       iounmap(dev->mmio);
-               }
                if (dev_private->plx_regbase)
                        iounmap(dev_private->plx_regbase);
        }
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver me_daq_driver = {
diff --git a/drivers/staging/comedi/drivers/mf6x4.c 
b/drivers/staging/comedi/drivers/mf6x4.c
index 464f4b4..1ee798a 100644
--- a/drivers/staging/comedi/drivers/mf6x4.c
+++ b/drivers/staging/comedi/drivers/mf6x4.c
@@ -305,12 +305,9 @@ static void mf6x4_detach(struct comedi_device *dev)
 
        if (devpriv->bar0_mem)
                iounmap(devpriv->bar0_mem);
-       if (dev->mmio)
-               iounmap(dev->mmio);
        if (devpriv->bar2_mem)
                iounmap(devpriv->bar2_mem);
-
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver mf6x4_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_6527.c 
b/drivers/staging/comedi/drivers/ni_6527.c
index e84dac2..6306f0f 100644
--- a/drivers/staging/comedi/drivers/ni_6527.c
+++ b/drivers/staging/comedi/drivers/ni_6527.c
@@ -472,11 +472,7 @@ static void ni6527_detach(struct comedi_device *dev)
 {
        if (dev->mmio)
                ni6527_reset(dev);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       if (dev->mmio)
-               iounmap(dev->mmio);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver ni6527_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_65xx.c 
b/drivers/staging/comedi/drivers/ni_65xx.c
index 873941b..9f58543 100644
--- a/drivers/staging/comedi/drivers/ni_65xx.c
+++ b/drivers/staging/comedi/drivers/ni_65xx.c
@@ -793,13 +793,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
 
 static void ni_65xx_detach(struct comedi_device *dev)
 {
-       if (dev->mmio) {
+       if (dev->mmio)
                writeb(0x00, dev->mmio + NI_65XX_CTRL_REG);
-               iounmap(dev->mmio);
-       }
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
+       comedi_pci_detach(dev);
 }
 
 static struct comedi_driver ni_65xx_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_670x.c 
b/drivers/staging/comedi/drivers/ni_670x.c
index f5caefa..d77e88c 100644
--- a/drivers/staging/comedi/drivers/ni_670x.c
+++ b/drivers/staging/comedi/drivers/ni_670x.c
@@ -266,14 +266,12 @@ static void ni_670x_detach(struct comedi_device *dev)
 {
        struct comedi_subdevice *s;
 
+       comedi_pci_detach(dev);
        if (dev->n_subdevices) {
                s = &dev->subdevices[0];
                if (s)
                        kfree(s->range_table_list);
        }
-       if (dev->mmio)
-               iounmap(dev->mmio);
-       comedi_pci_disable(dev);
 }
 
 static struct comedi_driver ni_670x_driver = {
diff --git a/drivers/staging/comedi/drivers/ni_labpc_pci.c 
b/drivers/staging/comedi/drivers/ni_labpc_pci.c
index 65984ea..3fc4204 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_pci.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_pci.c
@@ -108,20 +108,11 @@ static int labpc_pci_auto_attach(struct comedi_device 
*dev,
        return labpc_common_attach(dev, pcidev->irq, IRQF_SHARED);
 }
 
-static void labpc_pci_detach(struct comedi_device *dev)
-{
-       if (dev->mmio)
-               iounmap(dev->mmio);
-       if (dev->irq)
-               free_irq(dev->irq, dev);
-       comedi_pci_disable(dev);
-}
-
 static struct comedi_driver labpc_pci_comedi_driver = {
        .driver_name    = "labpc_pci",
        .module         = THIS_MODULE,
        .auto_attach    = labpc_pci_auto_attach,
-       .detach         = labpc_pci_detach,
+       .detach         = comedi_pci_detach,
 };
 
 static const struct pci_device_id labpc_pci_table[] = {
diff --git a/drivers/staging/comedi/drivers/skel.c 
b/drivers/staging/comedi/drivers/skel.c
index a118678..72e2507 100644
--- a/drivers/staging/comedi/drivers/skel.c
+++ b/drivers/staging/comedi/drivers/skel.c
@@ -636,7 +636,7 @@ static void skel_detach(struct comedi_device *dev)
                 * If PCI device enabled by _auto_attach() (or _attach()),
                 * disable it here.
                 */
-               comedi_pci_disable(dev);
+               comedi_pci_detach(dev);
        } else {
                /*
                 * ISA board
-- 
2.0.3

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to