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 <hsweeten@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- 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 devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel