All the PCI comedi drivers call comedi_pci_disable() either directly or as part of their (*detach). Move the free_irq() into comedi_pci_disable() so that the drivers don't have to deal with it. For drivers that then only call comedi_pci_disable() in their private (*detach), remove the private function and use the helper directly for the (*detach). For aesthetic reasons, tidy up the (*detach) in the icp_multi, ni_6527, and ni_65xx drivers. In the rtd520 driver, the write to the PLX_INTRCS_REG register to disable the interrupts is not needed. The previous call to rtd_reset() already cleared the register. 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 | 5 +++++ drivers/staging/comedi/drivers/addi-data/addi_common.c | 2 -- drivers/staging/comedi/drivers/addi_apci_1032.c | 2 -- drivers/staging/comedi/drivers/addi_apci_1710.c | 2 -- drivers/staging/comedi/drivers/addi_apci_2032.c | 2 -- drivers/staging/comedi/drivers/addi_apci_3120.c | 2 -- drivers/staging/comedi/drivers/addi_apci_3501.c | 2 -- drivers/staging/comedi/drivers/adl_pci9111.c | 2 -- drivers/staging/comedi/drivers/adl_pci9118.c | 2 -- drivers/staging/comedi/drivers/adv_pci1710.c | 2 -- drivers/staging/comedi/drivers/amplc_dio200_common.c | 2 -- drivers/staging/comedi/drivers/amplc_pc236.c | 2 -- drivers/staging/comedi/drivers/amplc_pci224.c | 2 -- drivers/staging/comedi/drivers/amplc_pci230.c | 2 -- drivers/staging/comedi/drivers/cb_pcidas.c | 2 -- drivers/staging/comedi/drivers/cb_pcidas64.c | 2 -- drivers/staging/comedi/drivers/cb_pcimdas.c | 9 +-------- drivers/staging/comedi/drivers/daqboard2000.c | 2 -- drivers/staging/comedi/drivers/dt3000.c | 2 -- drivers/staging/comedi/drivers/gsc_hpdi.c | 2 -- drivers/staging/comedi/drivers/icp_multi.c | 9 ++++----- drivers/staging/comedi/drivers/me4000.c | 2 -- drivers/staging/comedi/drivers/ni_6527.c | 8 +++----- drivers/staging/comedi/drivers/ni_65xx.c | 18 ++++++------------ drivers/staging/comedi/drivers/ni_660x.c | 2 -- drivers/staging/comedi/drivers/ni_labpc.c | 5 +---- drivers/staging/comedi/drivers/ni_pcidio.c | 2 -- drivers/staging/comedi/drivers/ni_pcimio.c | 2 -- drivers/staging/comedi/drivers/rtd520.c | 6 ------ drivers/staging/comedi/drivers/s626.c | 2 -- 30 files changed, 20 insertions(+), 86 deletions(-) diff --git a/drivers/staging/comedi/comedi_pci.c b/drivers/staging/comedi/comedi_pci.c index 5fad084..62e3554 100644 --- a/drivers/staging/comedi/comedi_pci.c +++ b/drivers/staging/comedi/comedi_pci.c @@ -21,6 +21,7 @@ */ #include <linux/pci.h> +#include <linux/interrupt.h> #include "comedidev.h" @@ -69,6 +70,10 @@ void comedi_pci_disable(struct comedi_device *dev) struct pci_dev *pcidev = comedi_to_pci_dev(dev); if (pcidev && dev->ioenabled) { + if (dev->irq) { + free_irq(dev->irq, dev); + dev->irq = 0; + } pci_release_regions(pcidev); pci_disable_device(pcidev); } diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.c b/drivers/staging/comedi/drivers/addi-data/addi_common.c index 0c3db57..54f1843 100644 --- a/drivers/staging/comedi/drivers/addi-data/addi_common.c +++ b/drivers/staging/comedi/drivers/addi-data/addi_common.c @@ -321,8 +321,6 @@ static void i_ADDI_Detach(struct comedi_device *dev) if (devpriv) { if (dev->iobase) i_ADDI_Reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv->dw_AiBase) iounmap(devpriv->dw_AiBase); } diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c b/drivers/staging/comedi/drivers/addi_apci_1032.c index 3d4878f..a2e0d6e 100644 --- a/drivers/staging/comedi/drivers/addi_apci_1032.c +++ b/drivers/staging/comedi/drivers/addi_apci_1032.c @@ -353,8 +353,6 @@ 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); } diff --git a/drivers/staging/comedi/drivers/addi_apci_1710.c b/drivers/staging/comedi/drivers/addi_apci_1710.c index c9e6471..03884a5 100644 --- a/drivers/staging/comedi/drivers/addi_apci_1710.c +++ b/drivers/staging/comedi/drivers/addi_apci_1710.c @@ -62,8 +62,6 @@ static void apci1710_detach(struct comedi_device *dev) { if (dev->iobase) i_APCI1710_Reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/addi_apci_2032.c b/drivers/staging/comedi/drivers/addi_apci_2032.c index b666637..b5bbcf8 100644 --- a/drivers/staging/comedi/drivers/addi_apci_2032.c +++ b/drivers/staging/comedi/drivers/addi_apci_2032.c @@ -350,8 +350,6 @@ static void apci2032_detach(struct comedi_device *dev) { if (dev->iobase) apci2032_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (dev->read_subdev) kfree(dev->read_subdev->private); comedi_spriv_free(dev, 1); diff --git a/drivers/staging/comedi/drivers/addi_apci_3120.c b/drivers/staging/comedi/drivers/addi_apci_3120.c index 317a26d..b54e273 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3120.c +++ b/drivers/staging/comedi/drivers/addi_apci_3120.c @@ -208,8 +208,6 @@ static void apci3120_detach(struct comedi_device *dev) if (devpriv) { if (dev->iobase) i_APCI3120_Reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv->ul_DmaBufferVirtual[0]) { free_pages((unsigned long)devpriv-> ul_DmaBufferVirtual[0], diff --git a/drivers/staging/comedi/drivers/addi_apci_3501.c b/drivers/staging/comedi/drivers/addi_apci_3501.c index a0cf6ec..9beeee9 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3501.c +++ b/drivers/staging/comedi/drivers/addi_apci_3501.c @@ -423,8 +423,6 @@ 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); } diff --git a/drivers/staging/comedi/drivers/adl_pci9111.c b/drivers/staging/comedi/drivers/adl_pci9111.c index 6247fdc..9d6a525 100644 --- a/drivers/staging/comedi/drivers/adl_pci9111.c +++ b/drivers/staging/comedi/drivers/adl_pci9111.c @@ -933,8 +933,6 @@ 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); } diff --git a/drivers/staging/comedi/drivers/adl_pci9118.c b/drivers/staging/comedi/drivers/adl_pci9118.c index cb4ef2d..cb423e6 100644 --- a/drivers/staging/comedi/drivers/adl_pci9118.c +++ b/drivers/staging/comedi/drivers/adl_pci9118.c @@ -2190,8 +2190,6 @@ static void pci9118_detach(struct comedi_device *dev) if (devpriv) { if (devpriv->valid) 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]); diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c index f847bbc..520a1b4 100644 --- a/drivers/staging/comedi/drivers/adv_pci1710.c +++ b/drivers/staging/comedi/drivers/adv_pci1710.c @@ -1364,8 +1364,6 @@ 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); } diff --git a/drivers/staging/comedi/drivers/amplc_dio200_common.c b/drivers/staging/comedi/drivers/amplc_dio200_common.c index 3403e5c..5cea2bd 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200_common.c +++ b/drivers/staging/comedi/drivers/amplc_dio200_common.c @@ -1235,8 +1235,6 @@ void amplc_dio200_common_detach(struct comedi_device *dev) if (!thisboard || !devpriv) return; - if (dev->irq) - free_irq(dev->irq, dev); if (dev->subdevices) { layout = dio200_board_layout(thisboard); for (n = 0; n < dev->n_subdevices; n++) { diff --git a/drivers/staging/comedi/drivers/amplc_pc236.c b/drivers/staging/comedi/drivers/amplc_pc236.c index 115ecd5..5e3b600 100644 --- a/drivers/staging/comedi/drivers/amplc_pc236.c +++ b/drivers/staging/comedi/drivers/amplc_pc236.c @@ -548,8 +548,6 @@ static void pc236_detach(struct comedi_device *dev) comedi_legacy_detach(dev); } else if (is_pci_board(thisboard)) { struct pci_dev *pcidev = comedi_to_pci_dev(dev); - if (dev->irq) - free_irq(dev->irq, dev); comedi_pci_disable(dev); if (pcidev) pci_dev_put(pcidev); diff --git a/drivers/staging/comedi/drivers/amplc_pci224.c b/drivers/staging/comedi/drivers/amplc_pci224.c index 4d7eab9..961bd85 100644 --- a/drivers/staging/comedi/drivers/amplc_pci224.c +++ b/drivers/staging/comedi/drivers/amplc_pci224.c @@ -1471,8 +1471,6 @@ static void pci224_detach(struct comedi_device *dev) struct pci224_private *devpriv = dev->private; struct pci_dev *pcidev = comedi_to_pci_dev(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (dev->subdevices) { struct comedi_subdevice *s; diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c index 49200fb..d15702a 100644 --- a/drivers/staging/comedi/drivers/amplc_pci230.c +++ b/drivers/staging/comedi/drivers/amplc_pci230.c @@ -2835,8 +2835,6 @@ static void pci230_detach(struct comedi_device *dev) struct pci_dev *pcidev = comedi_to_pci_dev(dev); comedi_spriv_free(dev, 2); - if (dev->irq) - free_irq(dev->irq, dev); comedi_pci_disable(dev); if (pcidev) pci_dev_put(pcidev); diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c b/drivers/staging/comedi/drivers/cb_pcidas.c index 53dd298..6cd84ab 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas.c +++ b/drivers/staging/comedi/drivers/cb_pcidas.c @@ -1606,8 +1606,6 @@ static void cb_pcidas_detach(struct comedi_device *dev) devpriv->s5933_config + AMCC_OP_REG_INTCSR); } } - if (dev->irq) - free_irq(dev->irq, dev); comedi_spriv_free(dev, 2); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c index c3e5495..b1a4bcc 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas64.c +++ b/drivers/staging/comedi/drivers/cb_pcidas64.c @@ -4121,8 +4121,6 @@ static void detach(struct comedi_device *dev) struct pcidas64_private *devpriv = dev->private; unsigned int i; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (pcidev) { if (devpriv->plx9080_iobase) { diff --git a/drivers/staging/comedi/drivers/cb_pcimdas.c b/drivers/staging/comedi/drivers/cb_pcimdas.c index 29813c9..19a13f4 100644 --- a/drivers/staging/comedi/drivers/cb_pcimdas.c +++ b/drivers/staging/comedi/drivers/cb_pcimdas.c @@ -273,18 +273,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_disable, }; static int cb_pcimdas_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/daqboard2000.c b/drivers/staging/comedi/drivers/daqboard2000.c index c1f14f0..fd8e3f0 100644 --- a/drivers/staging/comedi/drivers/daqboard2000.c +++ b/drivers/staging/comedi/drivers/daqboard2000.c @@ -767,8 +767,6 @@ static void daqboard2000_detach(struct comedi_device *dev) struct daqboard2000_private *devpriv = dev->private; comedi_spriv_free(dev, 2); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->daq) iounmap(devpriv->daq); diff --git a/drivers/staging/comedi/drivers/dt3000.c b/drivers/staging/comedi/drivers/dt3000.c index 7e03929..e6160b8 100644 --- a/drivers/staging/comedi/drivers/dt3000.c +++ b/drivers/staging/comedi/drivers/dt3000.c @@ -811,8 +811,6 @@ static void dt3000_detach(struct comedi_device *dev) { struct dt3k_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->io_addr) iounmap(devpriv->io_addr); diff --git a/drivers/staging/comedi/drivers/gsc_hpdi.c b/drivers/staging/comedi/drivers/gsc_hpdi.c index 0c061df..8fa98a4 100644 --- a/drivers/staging/comedi/drivers/gsc_hpdi.c +++ b/drivers/staging/comedi/drivers/gsc_hpdi.c @@ -558,8 +558,6 @@ static void hpdi_detach(struct comedi_device *dev) struct hpdi_private *devpriv = dev->private; unsigned int i; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->plx9080_iobase) { disable_plx_interrupts(dev); diff --git a/drivers/staging/comedi/drivers/icp_multi.c b/drivers/staging/comedi/drivers/icp_multi.c index 08ab9d6..dacf9c5 100644 --- a/drivers/staging/comedi/drivers/icp_multi.c +++ b/drivers/staging/comedi/drivers/icp_multi.c @@ -589,13 +589,12 @@ static void icp_multi_detach(struct comedi_device *dev) { struct icp_multi_private *devpriv = dev->private; - if (devpriv) + if (devpriv) { if (devpriv->valid) icp_multi_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - if (devpriv && devpriv->io_addr) - iounmap(devpriv->io_addr); + if (devpriv->io_addr) + iounmap(devpriv->io_addr); + } comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c index 641e693..697a1db 100644 --- a/drivers/staging/comedi/drivers/me4000.c +++ b/drivers/staging/comedi/drivers/me4000.c @@ -1680,8 +1680,6 @@ 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); diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c index d10f777..b2b56d6 100644 --- a/drivers/staging/comedi/drivers/ni_6527.c +++ b/drivers/staging/comedi/drivers/ni_6527.c @@ -414,12 +414,10 @@ static void ni6527_detach(struct comedi_device *dev) { struct ni6527_private *devpriv = dev->private; - if (devpriv && devpriv->mite && devpriv->mite->daq_io_addr) - writeb(0x00, - devpriv->mite->daq_io_addr + Master_Interrupt_Control); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv && devpriv->mite) { + if (devpriv->mite->daq_io_addr) + writeb(0x00, devpriv->mite->daq_io_addr + + Master_Interrupt_Control); mite_unsetup(devpriv->mite); mite_free(devpriv->mite); } diff --git a/drivers/staging/comedi/drivers/ni_65xx.c b/drivers/staging/comedi/drivers/ni_65xx.c index 3f71f0f..eacb3fa 100644 --- a/drivers/staging/comedi/drivers/ni_65xx.c +++ b/drivers/staging/comedi/drivers/ni_65xx.c @@ -732,21 +732,15 @@ static void ni_65xx_detach(struct comedi_device *dev) struct ni_65xx_private *devpriv = dev->private; int i; - if (devpriv && devpriv->mite && devpriv->mite->daq_io_addr) { - writeb(0x00, - devpriv->mite->daq_io_addr + - Master_Interrupt_Control); + if (devpriv && devpriv->mite) { + if (devpriv->mite->daq_io_addr) + writeb(0x00, devpriv->mite->daq_io_addr + + Master_Interrupt_Control); + mite_unsetup(devpriv->mite); + mite_free(devpriv->mite); } - if (dev->irq) - free_irq(dev->irq, dev); for (i = 0; i < dev->n_subdevices; ++i) comedi_spriv_free(dev, i); - if (devpriv) { - if (devpriv->mite) { - mite_unsetup(devpriv->mite); - mite_free(devpriv->mite); - } - } comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/ni_660x.c b/drivers/staging/comedi/drivers/ni_660x.c index 5cdda7f..f4a64cc 100644 --- a/drivers/staging/comedi/drivers/ni_660x.c +++ b/drivers/staging/comedi/drivers/ni_660x.c @@ -1298,8 +1298,6 @@ static void ni_660x_detach(struct comedi_device *dev) { struct ni_660x_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->counter_dev) ni_gpct_device_destroy(devpriv->counter_dev); diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c index 96a6837..99f7698 100644 --- a/drivers/staging/comedi/drivers/ni_labpc.c +++ b/drivers/staging/comedi/drivers/ni_labpc.c @@ -1877,11 +1877,8 @@ void labpc_common_detach(struct comedi_device *dev) mite_unsetup(devpriv->mite); mite_free(devpriv->mite); } - if (board->bustype == pci_bustype) { - if (dev->irq) - free_irq(dev->irq, dev); + if (board->bustype == pci_bustype) comedi_pci_disable(dev); - } #endif } EXPORT_SYMBOL_GPL(labpc_common_detach); diff --git a/drivers/staging/comedi/drivers/ni_pcidio.c b/drivers/staging/comedi/drivers/ni_pcidio.c index b5f340c..6073d7b 100644 --- a/drivers/staging/comedi/drivers/ni_pcidio.c +++ b/drivers/staging/comedi/drivers/ni_pcidio.c @@ -1194,8 +1194,6 @@ static void nidio_detach(struct comedi_device *dev) { struct nidio96_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->di_mite_ring) { mite_free_ring(devpriv->di_mite_ring); diff --git a/drivers/staging/comedi/drivers/ni_pcimio.c b/drivers/staging/comedi/drivers/ni_pcimio.c index 634d023..544193d 100644 --- a/drivers/staging/comedi/drivers/ni_pcimio.c +++ b/drivers/staging/comedi/drivers/ni_pcimio.c @@ -1452,8 +1452,6 @@ static void pcimio_detach(struct comedi_device *dev) struct ni_private *devpriv = dev->private; mio_common_detach(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { mite_free_ring(devpriv->ai_mite_ring); mite_free_ring(devpriv->ao_mite_ring); diff --git a/drivers/staging/comedi/drivers/rtd520.c b/drivers/staging/comedi/drivers/rtd520.c index 30a1728..f5ac925 100644 --- a/drivers/staging/comedi/drivers/rtd520.c +++ b/drivers/staging/comedi/drivers/rtd520.c @@ -1438,12 +1438,6 @@ static void rtd_detach(struct comedi_device *dev) /* Shut down any board ops by resetting it */ if (devpriv->las0 && devpriv->lcfg) rtd_reset(dev); - if (dev->irq) { - writel(readl(devpriv->lcfg + PLX_INTRCS_REG) & - ~(ICS_PLIE | ICS_DMA0_E | ICS_DMA1_E), - devpriv->lcfg + PLX_INTRCS_REG); - free_irq(dev->irq, dev); - } if (devpriv->las0) iounmap(devpriv->las0); if (devpriv->las1) diff --git a/drivers/staging/comedi/drivers/s626.c b/drivers/staging/comedi/drivers/s626.c index 0cf4b3d..98a1728 100644 --- a/drivers/staging/comedi/drivers/s626.c +++ b/drivers/staging/comedi/drivers/s626.c @@ -2735,8 +2735,6 @@ static void s626_detach(struct comedi_device *dev) CloseDMAB(dev, &devpriv->ANABuf, DMABUF_SIZE); } - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv->mmio) iounmap(devpriv->mmio); } -- 1.8.1.4 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel