All the legacy comedi drivers now call comedi_legacy_detach() either directly or as part of their (*detach). Move the free_irq() into comedi_legacy_detach() so that the drivers don't have to deal with it. For drivers that then only call comedi_legacy_detach() in their private (*detach), remove the private function and use the helper directly for the (*detach). The amplc_pc236 and ni_labpc drivers are hybrid legacy/PCI drivers. In the detach of a PCI board free_irq() still needs to be handled by the driver. The pcl724 and pcl726 drivers currently have the free_irq() #ifdef'ed out. The comedi_legacy_detach() function sanity checks that the irq has been requested before freeing it so they are safe to convert. For aesthetic reasons, move the #ifdef unused chunk in the pcl816 driver up to the previous #ifdef unused block. The pcmio and pcmuio drivers request multiple irqs and handle the freeing of them. Remove the 'dev->irq = irq[0]' in those drivers so that comedi_legacy_detach() does not attempt to free the irq. Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/staging/comedi/drivers.c | 5 +++++ drivers/staging/comedi/drivers/amplc_pc236.c | 4 ++-- drivers/staging/comedi/drivers/comedi_parport.c | 9 +-------- drivers/staging/comedi/drivers/das16.c | 2 -- drivers/staging/comedi/drivers/das16m1.c | 2 -- drivers/staging/comedi/drivers/das1800.c | 2 -- drivers/staging/comedi/drivers/das6402.c | 9 +-------- drivers/staging/comedi/drivers/das800.c | 10 +--------- drivers/staging/comedi/drivers/dmm32at.c | 9 +-------- drivers/staging/comedi/drivers/dt2811.c | 9 +-------- drivers/staging/comedi/drivers/dt2814.c | 9 +-------- drivers/staging/comedi/drivers/dt282x.c | 2 -- drivers/staging/comedi/drivers/ni_at_a2150.c | 2 -- drivers/staging/comedi/drivers/ni_atmio.c | 2 -- drivers/staging/comedi/drivers/ni_atmio16d.c | 2 -- drivers/staging/comedi/drivers/ni_labpc.c | 7 ++++--- drivers/staging/comedi/drivers/pcl711.c | 9 +-------- drivers/staging/comedi/drivers/pcl724.c | 4 ---- drivers/staging/comedi/drivers/pcl726.c | 11 +---------- drivers/staging/comedi/drivers/pcl812.c | 2 -- drivers/staging/comedi/drivers/pcl816.c | 8 ++------ drivers/staging/comedi/drivers/pcl818.c | 2 -- drivers/staging/comedi/drivers/pcmad.c | 9 +-------- drivers/staging/comedi/drivers/pcmmio.c | 5 ----- drivers/staging/comedi/drivers/pcmuio.c | 3 --- 25 files changed, 22 insertions(+), 116 deletions(-) diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 6fecefe..06d190f 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -37,6 +37,7 @@ #include <linux/cdev.h> #include <linux/dma-mapping.h> #include <linux/io.h> +#include <linux/interrupt.h> #include "comedidev.h" #include "comedi_internal.h" @@ -403,6 +404,10 @@ EXPORT_SYMBOL_GPL(comedi_request_region); */ void comedi_legacy_detach(struct comedi_device *dev) { + if (dev->irq) { + free_irq(dev->irq, dev); + dev->irq = 0; + } if (dev->iobase && dev->iolen) { release_region(dev->iobase, dev->iolen); dev->iobase = 0; diff --git a/drivers/staging/comedi/drivers/amplc_pc236.c b/drivers/staging/comedi/drivers/amplc_pc236.c index cb73c36..115ecd5 100644 --- a/drivers/staging/comedi/drivers/amplc_pc236.c +++ b/drivers/staging/comedi/drivers/amplc_pc236.c @@ -543,13 +543,13 @@ static void pc236_detach(struct comedi_device *dev) return; if (dev->iobase) pc236_intr_disable(dev); - if (dev->irq) - free_irq(dev->irq, dev); comedi_spriv_free(dev, 0); if (is_isa_board(thisboard)) { 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/comedi_parport.c b/drivers/staging/comedi/drivers/comedi_parport.c index 1355e75..3e061cc 100644 --- a/drivers/staging/comedi/drivers/comedi_parport.c +++ b/drivers/staging/comedi/drivers/comedi_parport.c @@ -338,18 +338,11 @@ static int parport_attach(struct comedi_device *dev, return 0; } -static void parport_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static struct comedi_driver parport_driver = { .driver_name = "comedi_parport", .module = THIS_MODULE, .attach = parport_attach, - .detach = parport_detach, + .detach = comedi_legacy_detach, }; module_comedi_driver(parport_driver); diff --git a/drivers/staging/comedi/drivers/das16.c b/drivers/staging/comedi/drivers/das16.c index b2826710..762b5a6 100644 --- a/drivers/staging/comedi/drivers/das16.c +++ b/drivers/staging/comedi/drivers/das16.c @@ -1354,8 +1354,6 @@ static void das16_detach(struct comedi_device *dev) kfree(devpriv->user_ai_range_table); kfree(devpriv->user_ao_range_table); } - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv->extra_iobase) release_region(devpriv->extra_iobase, board->size & 0x3ff); comedi_legacy_detach(dev); diff --git a/drivers/staging/comedi/drivers/das16m1.c b/drivers/staging/comedi/drivers/das16m1.c index d5f26c9..9cb9c3b 100644 --- a/drivers/staging/comedi/drivers/das16m1.c +++ b/drivers/staging/comedi/drivers/das16m1.c @@ -673,8 +673,6 @@ static void das16m1_detach(struct comedi_device *dev) struct das16m1_private_struct *devpriv = dev->private; comedi_spriv_free(dev, 3); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv && devpriv->extra_iobase) release_region(devpriv->extra_iobase, DAS16M1_SIZE2); comedi_legacy_detach(dev); diff --git a/drivers/staging/comedi/drivers/das1800.c b/drivers/staging/comedi/drivers/das1800.c index 4aa2c50..abf7638 100644 --- a/drivers/staging/comedi/drivers/das1800.c +++ b/drivers/staging/comedi/drivers/das1800.c @@ -1668,8 +1668,6 @@ static void das1800_detach(struct comedi_device *dev) { struct das1800_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->dma0) free_dma(devpriv->dma0); diff --git a/drivers/staging/comedi/drivers/das6402.c b/drivers/staging/comedi/drivers/das6402.c index b4c26fb..11424fb 100644 --- a/drivers/staging/comedi/drivers/das6402.c +++ b/drivers/staging/comedi/drivers/das6402.c @@ -324,18 +324,11 @@ static int das6402_attach(struct comedi_device *dev, return 0; } -static void das6402_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static struct comedi_driver das6402_driver = { .driver_name = "das6402", .module = THIS_MODULE, .attach = das6402_attach, - .detach = das6402_detach, + .detach = comedi_legacy_detach, }; module_comedi_driver(das6402_driver) diff --git a/drivers/staging/comedi/drivers/das800.c b/drivers/staging/comedi/drivers/das800.c index 3456d9e..6e37033 100644 --- a/drivers/staging/comedi/drivers/das800.c +++ b/drivers/staging/comedi/drivers/das800.c @@ -230,14 +230,13 @@ struct das800_private { static int das800_attach(struct comedi_device *dev, struct comedi_devconfig *it); -static void das800_detach(struct comedi_device *dev); static int das800_cancel(struct comedi_device *dev, struct comedi_subdevice *s); static struct comedi_driver driver_das800 = { .driver_name = "das800", .module = THIS_MODULE, .attach = das800_attach, - .detach = das800_detach, + .detach = comedi_legacy_detach, .num_names = ARRAY_SIZE(das800_boards), .board_name = &das800_boards[0].name, .offset = sizeof(struct das800_board), @@ -522,13 +521,6 @@ static int das800_attach(struct comedi_device *dev, struct comedi_devconfig *it) return 0; }; -static void das800_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static int das800_cancel(struct comedi_device *dev, struct comedi_subdevice *s) { struct das800_private *devpriv = dev->private; diff --git a/drivers/staging/comedi/drivers/dmm32at.c b/drivers/staging/comedi/drivers/dmm32at.c index 507ca8e..6c85dd2 100644 --- a/drivers/staging/comedi/drivers/dmm32at.c +++ b/drivers/staging/comedi/drivers/dmm32at.c @@ -820,18 +820,11 @@ static int dmm32at_attach(struct comedi_device *dev, } -static void dmm32at_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static struct comedi_driver dmm32at_driver = { .driver_name = "dmm32at", .module = THIS_MODULE, .attach = dmm32at_attach, - .detach = dmm32at_detach, + .detach = comedi_legacy_detach, }; module_comedi_driver(dmm32at_driver); diff --git a/drivers/staging/comedi/drivers/dt2811.c b/drivers/staging/comedi/drivers/dt2811.c index e878059..8757b54 100644 --- a/drivers/staging/comedi/drivers/dt2811.c +++ b/drivers/staging/comedi/drivers/dt2811.c @@ -556,13 +556,6 @@ static int dt2811_attach(struct comedi_device *dev, struct comedi_devconfig *it) return 0; } -static void dt2811_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static const struct dt2811_board boardtypes[] = { { .name = "dt2811-pgh", @@ -581,7 +574,7 @@ static struct comedi_driver dt2811_driver = { .driver_name = "dt2811", .module = THIS_MODULE, .attach = dt2811_attach, - .detach = dt2811_detach, + .detach = comedi_legacy_detach, .board_name = &boardtypes[0].name, .num_names = ARRAY_SIZE(boardtypes), .offset = sizeof(struct dt2811_board), diff --git a/drivers/staging/comedi/drivers/dt2814.c b/drivers/staging/comedi/drivers/dt2814.c index e47822e..7c95b3b 100644 --- a/drivers/staging/comedi/drivers/dt2814.c +++ b/drivers/staging/comedi/drivers/dt2814.c @@ -323,18 +323,11 @@ static int dt2814_attach(struct comedi_device *dev, struct comedi_devconfig *it) return 0; } -static void dt2814_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static struct comedi_driver dt2814_driver = { .driver_name = "dt2814", .module = THIS_MODULE, .attach = dt2814_attach, - .detach = dt2814_detach, + .detach = comedi_legacy_detach, }; module_comedi_driver(dt2814_driver); diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c index 6badbd4..90f2de9 100644 --- a/drivers/staging/comedi/drivers/dt282x.c +++ b/drivers/staging/comedi/drivers/dt282x.c @@ -1271,8 +1271,6 @@ static void dt282x_detach(struct comedi_device *dev) { struct dt282x_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (dev->private) { if (devpriv->dma[0].chan) free_dma(devpriv->dma[0].chan); diff --git a/drivers/staging/comedi/drivers/ni_at_a2150.c b/drivers/staging/comedi/drivers/ni_at_a2150.c index 3079615..2d37516 100644 --- a/drivers/staging/comedi/drivers/ni_at_a2150.c +++ b/drivers/staging/comedi/drivers/ni_at_a2150.c @@ -829,8 +829,6 @@ static void a2150_detach(struct comedi_device *dev) if (dev->iobase) outw(APD_BIT | DPD_BIT, dev->iobase + CONFIG_REG); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->dma) free_dma(devpriv->dma); diff --git a/drivers/staging/comedi/drivers/ni_atmio.c b/drivers/staging/comedi/drivers/ni_atmio.c index d439f6b..4ced7ba 100644 --- a/drivers/staging/comedi/drivers/ni_atmio.c +++ b/drivers/staging/comedi/drivers/ni_atmio.c @@ -499,8 +499,6 @@ static void ni_atmio_detach(struct comedi_device *dev) struct ni_private *devpriv = dev->private; mio_common_detach(dev); - if (dev->irq) - free_irq(dev->irq, dev); comedi_legacy_detach(dev); if (devpriv->isapnp_dev) pnp_device_detach(devpriv->isapnp_dev); diff --git a/drivers/staging/comedi/drivers/ni_atmio16d.c b/drivers/staging/comedi/drivers/ni_atmio16d.c index 1414970..6c97a09 100644 --- a/drivers/staging/comedi/drivers/ni_atmio16d.c +++ b/drivers/staging/comedi/drivers/ni_atmio16d.c @@ -768,8 +768,6 @@ static int atmio16d_attach(struct comedi_device *dev, static void atmio16d_detach(struct comedi_device *dev) { comedi_spriv_free(dev, 3); - if (dev->irq) - free_irq(dev->irq, dev); reset_atmio16d(dev); comedi_legacy_detach(dev); } diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c index 1137281..96a6837 100644 --- a/drivers/staging/comedi/drivers/ni_labpc.c +++ b/drivers/staging/comedi/drivers/ni_labpc.c @@ -1870,8 +1870,6 @@ void labpc_common_detach(struct comedi_device *dev) if (devpriv->dma_chan) free_dma(devpriv->dma_chan); #endif - if (dev->irq) - free_irq(dev->irq, dev); if (board->bustype == isa_bustype) comedi_legacy_detach(dev); #ifdef CONFIG_COMEDI_PCI_DRIVERS @@ -1879,8 +1877,11 @@ void labpc_common_detach(struct comedi_device *dev) mite_unsetup(devpriv->mite); mite_free(devpriv->mite); } - if (board->bustype == pci_bustype) + if (board->bustype == pci_bustype) { + if (dev->irq) + free_irq(dev->irq, dev); comedi_pci_disable(dev); + } #endif } EXPORT_SYMBOL_GPL(labpc_common_detach); diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c index 92fb486..8be2a4c 100644 --- a/drivers/staging/comedi/drivers/pcl711.c +++ b/drivers/staging/comedi/drivers/pcl711.c @@ -550,13 +550,6 @@ static int pcl711_attach(struct comedi_device *dev, struct comedi_devconfig *it) return 0; } -static void pcl711_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static const struct pcl711_board boardtypes[] = { { "pcl711", 0, 0, 0, 5, 8, 1, 0, &range_bipolar5 }, { "pcl711b", 1, 0, 0, 5, 8, 1, 7, &range_pcl711b_ai }, @@ -568,7 +561,7 @@ static struct comedi_driver pcl711_driver = { .driver_name = "pcl711", .module = THIS_MODULE, .attach = pcl711_attach, - .detach = pcl711_detach, + .detach = comedi_legacy_detach, .board_name = &boardtypes[0].name, .num_names = ARRAY_SIZE(boardtypes), .offset = sizeof(struct pcl711_board), diff --git a/drivers/staging/comedi/drivers/pcl724.c b/drivers/staging/comedi/drivers/pcl724.c index 3a3e4f5..4f033d8 100644 --- a/drivers/staging/comedi/drivers/pcl724.c +++ b/drivers/staging/comedi/drivers/pcl724.c @@ -173,10 +173,6 @@ static void pcl724_detach(struct comedi_device *dev) for (i = 0; i < dev->n_subdevices; i++) comedi_spriv_free(dev, i); -#ifdef PCL724_IRQ - if (dev->irq) - free_irq(dev->irq, dev); -#endif comedi_legacy_detach(dev); } diff --git a/drivers/staging/comedi/drivers/pcl726.c b/drivers/staging/comedi/drivers/pcl726.c index 5d0c4fe..4aa9943 100644 --- a/drivers/staging/comedi/drivers/pcl726.c +++ b/drivers/staging/comedi/drivers/pcl726.c @@ -335,20 +335,11 @@ static int pcl726_attach(struct comedi_device *dev, struct comedi_devconfig *it) return 0; } -static void pcl726_detach(struct comedi_device *dev) -{ -#ifdef ACL6126_IRQ - if (dev->irq) - free_irq(dev->irq, dev); -#endif - comedi_legacy_detach(dev); -} - static struct comedi_driver pcl726_driver = { .driver_name = "pcl726", .module = THIS_MODULE, .attach = pcl726_attach, - .detach = pcl726_detach, + .detach = comedi_legacy_detach, .board_name = &boardtypes[0].name, .num_names = ARRAY_SIZE(boardtypes), .offset = sizeof(struct pcl726_board), diff --git a/drivers/staging/comedi/drivers/pcl812.c b/drivers/staging/comedi/drivers/pcl812.c index 50961c4..cd02786 100644 --- a/drivers/staging/comedi/drivers/pcl812.c +++ b/drivers/staging/comedi/drivers/pcl812.c @@ -1438,8 +1438,6 @@ static void pcl812_detach(struct comedi_device *dev) if (devpriv->dma) free_dma(devpriv->dma); } - if (dev->irq) - free_irq(dev->irq, dev); comedi_legacy_detach(dev); } diff --git a/drivers/staging/comedi/drivers/pcl816.c b/drivers/staging/comedi/drivers/pcl816.c index 4ea6fec..10e0960 100644 --- a/drivers/staging/comedi/drivers/pcl816.c +++ b/drivers/staging/comedi/drivers/pcl816.c @@ -1214,14 +1214,10 @@ static void pcl816_detach(struct comedi_device *dev) release_region(devpriv->rtc_iobase, devpriv->rtc_iosize); } + if (devpriv->dma_rtc) + RTC_lock--; #endif } - if (dev->irq) - free_irq(dev->irq, dev); -#ifdef unused - if (devpriv->dma_rtc) - RTC_lock--; -#endif comedi_legacy_detach(dev); } diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index cd76da6..142449d 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -1898,8 +1898,6 @@ static void pcl818_detach(struct comedi_device *dev) RTC_lock--; #endif } - if (dev->irq) - free_irq(dev->irq, dev); comedi_legacy_detach(dev); } diff --git a/drivers/staging/comedi/drivers/pcmad.c b/drivers/staging/comedi/drivers/pcmad.c index 0bb9e8e..b7c932e 100644 --- a/drivers/staging/comedi/drivers/pcmad.c +++ b/drivers/staging/comedi/drivers/pcmad.c @@ -133,13 +133,6 @@ static int pcmad_attach(struct comedi_device *dev, struct comedi_devconfig *it) return 0; } -static void pcmad_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_legacy_detach(dev); -} - static const struct pcmad_board_struct pcmad_boards[] = { { .name = "pcmad12", @@ -153,7 +146,7 @@ static struct comedi_driver pcmad_driver = { .driver_name = "pcmad", .module = THIS_MODULE, .attach = pcmad_attach, - .detach = pcmad_detach, + .detach = comedi_legacy_detach, .board_name = &pcmad_boards[0].name, .num_names = ARRAY_SIZE(pcmad_boards), .offset = sizeof(pcmad_boards[0]), diff --git a/drivers/staging/comedi/drivers/pcmmio.c b/drivers/staging/comedi/drivers/pcmmio.c index d06e181..5a236cd 100644 --- a/drivers/staging/comedi/drivers/pcmmio.c +++ b/drivers/staging/comedi/drivers/pcmmio.c @@ -1193,11 +1193,6 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it) devpriv->asics[asic].irq = irq[asic]; } - dev->irq = irq[0]; /* - * grr.. wish comedi dev struct supported - * multiple irqs.. - */ - return 1; } diff --git a/drivers/staging/comedi/drivers/pcmuio.c b/drivers/staging/comedi/drivers/pcmuio.c index 7d5682f..0c98e26 100644 --- a/drivers/staging/comedi/drivers/pcmuio.c +++ b/drivers/staging/comedi/drivers/pcmuio.c @@ -917,9 +917,6 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it) devpriv->asics[asic].irq = irq[asic]; } - dev->irq = irq[0]; /* grr.. wish comedi dev struct supported multiple - irqs.. */ - if (irq[0]) { dev_dbg(dev->class_dev, "irq: %u\n", irq[0]); if (irq[1] && board->num_asics == 2) -- 1.8.1.4 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel