Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d1fe3f7 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: drivers: free_irq() in comedi_legacy_detach()



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: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a32c6d00
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@
#include <linux/cdev.h>
#include <linux/cdev.h>
#include <linux/dma-mapping.h>
#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/io.h>
#include <linux/interrupt.h>


#include "comedidev.h"
#include "comedidev.h"
#include "comedi_internal.h"
#include "comedi_internal.h"
@@ -403,6 +404,10 @@ EXPORT_SYMBOL_GPL(comedi_request_region);
 */
 */
void comedi_legacy_detach(struct comedi_device *dev)
void comedi_legacy_detach(struct comedi_device *dev)
{
{
	if (dev->irq) {
		free_irq(dev->irq, dev);
		dev->irq = 0;
	}
	if (dev->iobase && dev->iolen) {
	if (dev->iobase && dev->iolen) {
		release_region(dev->iobase, dev->iolen);
		release_region(dev->iobase, dev->iolen);
		dev->iobase = 0;
		dev->iobase = 0;
+2 −2
Original line number Original line Diff line number Diff line
@@ -543,13 +543,13 @@ static void pc236_detach(struct comedi_device *dev)
		return;
		return;
	if (dev->iobase)
	if (dev->iobase)
		pc236_intr_disable(dev);
		pc236_intr_disable(dev);
	if (dev->irq)
		free_irq(dev->irq, dev);
	comedi_spriv_free(dev, 0);
	comedi_spriv_free(dev, 0);
	if (is_isa_board(thisboard)) {
	if (is_isa_board(thisboard)) {
		comedi_legacy_detach(dev);
		comedi_legacy_detach(dev);
	} else if (is_pci_board(thisboard)) {
	} else if (is_pci_board(thisboard)) {
		struct pci_dev *pcidev = comedi_to_pci_dev(dev);
		struct pci_dev *pcidev = comedi_to_pci_dev(dev);
		if (dev->irq)
			free_irq(dev->irq, dev);
		comedi_pci_disable(dev);
		comedi_pci_disable(dev);
		if (pcidev)
		if (pcidev)
			pci_dev_put(pcidev);
			pci_dev_put(pcidev);
+1 −8
Original line number Original line Diff line number Diff line
@@ -338,18 +338,11 @@ static int parport_attach(struct comedi_device *dev,
	return 0;
	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 = {
static struct comedi_driver parport_driver = {
	.driver_name	= "comedi_parport",
	.driver_name	= "comedi_parport",
	.module		= THIS_MODULE,
	.module		= THIS_MODULE,
	.attach		= parport_attach,
	.attach		= parport_attach,
	.detach		= parport_detach,
	.detach		= comedi_legacy_detach,
};
};
module_comedi_driver(parport_driver);
module_comedi_driver(parport_driver);


+0 −2
Original line number Original line Diff line number Diff line
@@ -1354,8 +1354,6 @@ static void das16_detach(struct comedi_device *dev)
		kfree(devpriv->user_ai_range_table);
		kfree(devpriv->user_ai_range_table);
		kfree(devpriv->user_ao_range_table);
		kfree(devpriv->user_ao_range_table);
	}
	}
	if (dev->irq)
		free_irq(dev->irq, dev);
	if (devpriv->extra_iobase)
	if (devpriv->extra_iobase)
		release_region(devpriv->extra_iobase, board->size & 0x3ff);
		release_region(devpriv->extra_iobase, board->size & 0x3ff);
	comedi_legacy_detach(dev);
	comedi_legacy_detach(dev);
+0 −2
Original line number Original line Diff line number Diff line
@@ -673,8 +673,6 @@ static void das16m1_detach(struct comedi_device *dev)
	struct das16m1_private_struct *devpriv = dev->private;
	struct das16m1_private_struct *devpriv = dev->private;


	comedi_spriv_free(dev, 3);
	comedi_spriv_free(dev, 3);
	if (dev->irq)
		free_irq(dev->irq, dev);
	if (devpriv && devpriv->extra_iobase)
	if (devpriv && devpriv->extra_iobase)
		release_region(devpriv->extra_iobase, DAS16M1_SIZE2);
		release_region(devpriv->extra_iobase, DAS16M1_SIZE2);
	comedi_legacy_detach(dev);
	comedi_legacy_detach(dev);
Loading