staging: comedi: comedi_pci: introduce comedi_pci_detach()
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@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
081b6ee6f1
commit
aac307f9dd
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include "comedidev.h"
|
#include "comedidev.h"
|
||||||
|
|
||||||
|
@ -72,6 +73,29 @@ void comedi_pci_disable(struct comedi_device *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(comedi_pci_disable);
|
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.
|
* comedi_pci_auto_config() - Configure/probe a comedi PCI driver.
|
||||||
* @pcidev: pci_dev struct
|
* @pcidev: pci_dev struct
|
||||||
|
|
|
@ -509,6 +509,7 @@ struct pci_dev *comedi_to_pci_dev(struct comedi_device *);
|
||||||
|
|
||||||
int comedi_pci_enable(struct comedi_device *);
|
int comedi_pci_enable(struct comedi_device *);
|
||||||
void comedi_pci_disable(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 *,
|
int comedi_pci_auto_config(struct pci_dev *, struct comedi_driver *,
|
||||||
unsigned long context);
|
unsigned long context);
|
||||||
|
@ -553,6 +554,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 */
|
#endif /* CONFIG_COMEDI_PCI_DRIVERS */
|
||||||
|
|
||||||
#ifdef CONFIG_COMEDI_PCMCIA_DRIVERS
|
#ifdef CONFIG_COMEDI_PCMCIA_DRIVERS
|
||||||
|
|
|
@ -246,18 +246,11 @@ static int pci_8255_auto_attach(struct comedi_device *dev,
|
||||||
return 0;
|
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 = {
|
static struct comedi_driver pci_8255_driver = {
|
||||||
.driver_name = "8255_pci",
|
.driver_name = "8255_pci",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = pci_8255_auto_attach,
|
.auto_attach = pci_8255_auto_attach,
|
||||||
.detach = pci_8255_detach,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pci_8255_pci_probe(struct pci_dev *dev,
|
static int pci_8255_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -268,13 +268,7 @@ static int addi_auto_attach(struct comedi_device *dev,
|
||||||
|
|
||||||
static void i_ADDI_Detach(struct comedi_device *dev)
|
static void i_ADDI_Detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct addi_private *devpriv = dev->private;
|
if (dev->iobase)
|
||||||
|
i_ADDI_Reset(dev);
|
||||||
if (devpriv) {
|
comedi_pci_detach(dev);
|
||||||
if (dev->iobase)
|
|
||||||
i_ADDI_Reset(dev);
|
|
||||||
if (dev->irq)
|
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
}
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -343,9 +343,7 @@ static void apci1032_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
apci1032_reset(dev);
|
apci1032_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci1032_driver = {
|
static struct comedi_driver apci1032_driver = {
|
||||||
|
|
|
@ -190,7 +190,7 @@ static void apci1516_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
apci1516_reset(dev);
|
apci1516_reset(dev);
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci1516_driver = {
|
static struct comedi_driver apci1516_driver = {
|
||||||
|
|
|
@ -442,9 +442,7 @@ static void apci1564_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
apci1564_reset(dev);
|
apci1564_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci1564_driver = {
|
static struct comedi_driver apci1564_driver = {
|
||||||
|
|
|
@ -159,7 +159,7 @@ static struct comedi_driver apci16xx_driver = {
|
||||||
.driver_name = "addi_apci_16xx",
|
.driver_name = "addi_apci_16xx",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = apci16xx_auto_attach,
|
.auto_attach = apci16xx_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int apci16xx_pci_probe(struct pci_dev *dev,
|
static int apci16xx_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -338,11 +338,9 @@ static void apci2032_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
apci2032_reset(dev);
|
apci2032_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (dev->read_subdev)
|
if (dev->read_subdev)
|
||||||
kfree(dev->read_subdev->private);
|
kfree(dev->read_subdev->private);
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci2032_driver = {
|
static struct comedi_driver apci2032_driver = {
|
||||||
|
|
|
@ -118,7 +118,7 @@ static void apci2200_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
apci2200_reset(dev);
|
apci2200_reset(dev);
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci2200_driver = {
|
static struct comedi_driver apci2200_driver = {
|
||||||
|
|
|
@ -195,11 +195,10 @@ static void apci3120_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct addi_private *devpriv = dev->private;
|
struct addi_private *devpriv = dev->private;
|
||||||
|
|
||||||
|
if (dev->iobase)
|
||||||
|
apci3120_reset(dev);
|
||||||
|
comedi_pci_detach(dev);
|
||||||
if (devpriv) {
|
if (devpriv) {
|
||||||
if (dev->iobase)
|
|
||||||
apci3120_reset(dev);
|
|
||||||
if (dev->irq)
|
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (devpriv->ul_DmaBufferVirtual[0]) {
|
if (devpriv->ul_DmaBufferVirtual[0]) {
|
||||||
free_pages((unsigned long)devpriv->
|
free_pages((unsigned long)devpriv->
|
||||||
ul_DmaBufferVirtual[0],
|
ul_DmaBufferVirtual[0],
|
||||||
|
@ -211,7 +210,6 @@ static void apci3120_detach(struct comedi_device *dev)
|
||||||
devpriv->ui_DmaBufferPages[1]);
|
devpriv->ui_DmaBufferPages[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci3120_driver = {
|
static struct comedi_driver apci3120_driver = {
|
||||||
|
|
|
@ -417,9 +417,7 @@ static void apci3501_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
apci3501_reset(dev);
|
apci3501_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci3501_driver = {
|
static struct comedi_driver apci3501_driver = {
|
||||||
|
|
|
@ -910,17 +910,9 @@ static int apci3xxx_auto_attach(struct comedi_device *dev,
|
||||||
|
|
||||||
static void apci3xxx_detach(struct comedi_device *dev)
|
static void apci3xxx_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct apci3xxx_private *devpriv = dev->private;
|
if (dev->iobase)
|
||||||
|
apci3xxx_reset(dev);
|
||||||
if (devpriv) {
|
comedi_pci_detach(dev);
|
||||||
if (dev->iobase)
|
|
||||||
apci3xxx_reset(dev);
|
|
||||||
if (dev->irq)
|
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (dev->mmio)
|
|
||||||
iounmap(dev->mmio);
|
|
||||||
}
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver apci3xxx_driver = {
|
static struct comedi_driver apci3xxx_driver = {
|
||||||
|
|
|
@ -208,7 +208,7 @@ static struct comedi_driver adl_pci6208_driver = {
|
||||||
.driver_name = "adl_pci6208",
|
.driver_name = "adl_pci6208",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = pci6208_auto_attach,
|
.auto_attach = pci6208_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int adl_pci6208_pci_probe(struct pci_dev *dev,
|
static int adl_pci6208_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -246,7 +246,7 @@ static struct comedi_driver adl_pci7x3x_driver = {
|
||||||
.driver_name = "adl_pci7x3x",
|
.driver_name = "adl_pci7x3x",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = adl_pci7x3x_auto_attach,
|
.auto_attach = adl_pci7x3x_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int adl_pci7x3x_pci_probe(struct pci_dev *dev,
|
static int adl_pci7x3x_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -135,7 +135,7 @@ static struct comedi_driver adl_pci8164_driver = {
|
||||||
.driver_name = "adl_pci8164",
|
.driver_name = "adl_pci8164",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = adl_pci8164_auto_attach,
|
.auto_attach = adl_pci8164_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int adl_pci8164_pci_probe(struct pci_dev *dev,
|
static int adl_pci8164_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -781,9 +781,7 @@ static void pci9111_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
pci9111_reset(dev);
|
pci9111_reset(dev);
|
||||||
if (dev->irq != 0)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver adl_pci9111_driver = {
|
static struct comedi_driver adl_pci9111_driver = {
|
||||||
|
|
|
@ -2033,11 +2033,10 @@ static void pci9118_detach(struct comedi_device *dev)
|
||||||
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
|
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
|
||||||
struct pci9118_private *devpriv = dev->private;
|
struct pci9118_private *devpriv = dev->private;
|
||||||
|
|
||||||
|
if (dev->iobase)
|
||||||
|
pci9118_reset(dev);
|
||||||
|
comedi_pci_detach(dev);
|
||||||
if (devpriv) {
|
if (devpriv) {
|
||||||
if (dev->iobase)
|
|
||||||
pci9118_reset(dev);
|
|
||||||
if (dev->irq)
|
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (devpriv->dmabuf_virt[0])
|
if (devpriv->dmabuf_virt[0])
|
||||||
free_pages((unsigned long)devpriv->dmabuf_virt[0],
|
free_pages((unsigned long)devpriv->dmabuf_virt[0],
|
||||||
devpriv->dmabuf_pages[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],
|
free_pages((unsigned long)devpriv->dmabuf_virt[1],
|
||||||
devpriv->dmabuf_pages[1]);
|
devpriv->dmabuf_pages[1]);
|
||||||
}
|
}
|
||||||
comedi_pci_disable(dev);
|
|
||||||
if (pcidev)
|
if (pcidev)
|
||||||
pci_dev_put(pcidev);
|
pci_dev_put(pcidev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1250,9 +1250,7 @@ static void pci1710_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
pci1710_reset(dev);
|
pci1710_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver adv_pci1710_driver = {
|
static struct comedi_driver adv_pci1710_driver = {
|
||||||
|
|
|
@ -286,7 +286,7 @@ static void pci1723_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
pci1723_reset(dev);
|
pci1723_reset(dev);
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver adv_pci1723_driver = {
|
static struct comedi_driver adv_pci1723_driver = {
|
||||||
|
|
|
@ -372,7 +372,7 @@ static struct comedi_driver adv_pci1724_driver = {
|
||||||
.driver_name = "adv_pci1724",
|
.driver_name = "adv_pci1724",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = adv_pci1724_auto_attach,
|
.auto_attach = adv_pci1724_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int adv_pci1724_pci_probe(struct pci_dev *dev,
|
static int adv_pci1724_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -1170,7 +1170,7 @@ static void pci_dio_detach(struct comedi_device *dev)
|
||||||
if (devpriv->valid)
|
if (devpriv->valid)
|
||||||
pci_dio_reset(dev);
|
pci_dio_reset(dev);
|
||||||
}
|
}
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver adv_pci_dio_driver = {
|
static struct comedi_driver adv_pci_dio_driver = {
|
||||||
|
|
|
@ -387,20 +387,11 @@ static int dio200_pci_auto_attach(struct comedi_device *dev,
|
||||||
return amplc_dio200_common_attach(dev, pci_dev->irq, IRQF_SHARED);
|
return amplc_dio200_common_attach(dev, pci_dev->irq, IRQF_SHARED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dio200_pci_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 dio200_pci_comedi_driver = {
|
static struct comedi_driver dio200_pci_comedi_driver = {
|
||||||
.driver_name = "amplc_dio200_pci",
|
.driver_name = "amplc_dio200_pci",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = dio200_pci_auto_attach,
|
.auto_attach = dio200_pci_auto_attach,
|
||||||
.detach = dio200_pci_detach,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id dio200_pci_table[] = {
|
static const struct pci_device_id dio200_pci_table[] = {
|
||||||
|
|
|
@ -1130,13 +1130,11 @@ static void pci224_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct pci224_private *devpriv = dev->private;
|
struct pci224_private *devpriv = dev->private;
|
||||||
|
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (devpriv) {
|
if (devpriv) {
|
||||||
kfree(devpriv->ao_scan_vals);
|
kfree(devpriv->ao_scan_vals);
|
||||||
kfree(devpriv->ao_scan_order);
|
kfree(devpriv->ao_scan_order);
|
||||||
}
|
}
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver amplc_pci224_driver = {
|
static struct comedi_driver amplc_pci224_driver = {
|
||||||
|
|
|
@ -2830,9 +2830,7 @@ static void pci230_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
|
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
|
||||||
|
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
if (pcidev)
|
if (pcidev)
|
||||||
pci_dev_put(pcidev);
|
pci_dev_put(pcidev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,18 +119,11 @@ static int pci236_auto_attach(struct comedi_device *dev,
|
||||||
IRQF_SHARED);
|
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 = {
|
static struct comedi_driver amplc_pci236_driver = {
|
||||||
.driver_name = "amplc_pci236",
|
.driver_name = "amplc_pci236",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = pci236_auto_attach,
|
.auto_attach = pci236_auto_attach,
|
||||||
.detach = pci236_detach,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id pci236_pci_table[] = {
|
static const struct pci_device_id pci236_pci_table[] = {
|
||||||
|
|
|
@ -86,7 +86,7 @@ static struct comedi_driver amplc_pci263_driver = {
|
||||||
.driver_name = "amplc_pci263",
|
.driver_name = "amplc_pci263",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = pci263_auto_attach,
|
.auto_attach = pci263_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id pci263_pci_table[] = {
|
static const struct pci_device_id pci263_pci_table[] = {
|
||||||
|
|
|
@ -1589,15 +1589,11 @@ static void cb_pcidas_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct cb_pcidas_private *devpriv = dev->private;
|
struct cb_pcidas_private *devpriv = dev->private;
|
||||||
|
|
||||||
if (devpriv) {
|
if (devpriv && devpriv->s5933_config) {
|
||||||
if (devpriv->s5933_config) {
|
outl(INTCSR_INBOX_INTR_STATUS,
|
||||||
outl(INTCSR_INBOX_INTR_STATUS,
|
devpriv->s5933_config + AMCC_OP_REG_INTCSR);
|
||||||
devpriv->s5933_config + AMCC_OP_REG_INTCSR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver cb_pcidas_driver = {
|
static struct comedi_driver cb_pcidas_driver = {
|
||||||
|
|
|
@ -398,7 +398,7 @@ static struct comedi_driver cb_pcidda_driver = {
|
||||||
.driver_name = "cb_pcidda",
|
.driver_name = "cb_pcidda",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = cb_pcidda_auto_attach,
|
.auto_attach = cb_pcidda_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int cb_pcidda_pci_probe(struct pci_dev *dev,
|
static int cb_pcidda_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -236,18 +236,11 @@ static int cb_pcimdas_auto_attach(struct comedi_device *dev,
|
||||||
return 0;
|
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 = {
|
static struct comedi_driver cb_pcimdas_driver = {
|
||||||
.driver_name = "cb_pcimdas",
|
.driver_name = "cb_pcimdas",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = cb_pcimdas_auto_attach,
|
.auto_attach = cb_pcimdas_auto_attach,
|
||||||
.detach = cb_pcimdas_detach,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int cb_pcimdas_pci_probe(struct pci_dev *dev,
|
static int cb_pcimdas_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -176,7 +176,7 @@ static struct comedi_driver cb_pcimdda_driver = {
|
||||||
.driver_name = "cb_pcimdda",
|
.driver_name = "cb_pcimdda",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = cb_pcimdda_auto_attach,
|
.auto_attach = cb_pcimdda_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int cb_pcimdda_pci_probe(struct pci_dev *dev,
|
static int cb_pcimdda_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -97,7 +97,7 @@ static struct comedi_driver contec_pci_dio_driver = {
|
||||||
.driver_name = "contec_pci_dio",
|
.driver_name = "contec_pci_dio",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = contec_auto_attach,
|
.auto_attach = contec_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int contec_pci_dio_pci_probe(struct pci_dev *dev,
|
static int contec_pci_dio_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -727,15 +727,9 @@ static void daqboard2000_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct daqboard2000_private *devpriv = dev->private;
|
struct daqboard2000_private *devpriv = dev->private;
|
||||||
|
|
||||||
if (dev->irq)
|
if (devpriv && devpriv->plx)
|
||||||
free_irq(dev->irq, dev);
|
iounmap(devpriv->plx);
|
||||||
if (devpriv) {
|
comedi_pci_detach(dev);
|
||||||
if (dev->mmio)
|
|
||||||
iounmap(dev->mmio);
|
|
||||||
if (devpriv->plx)
|
|
||||||
iounmap(devpriv->plx);
|
|
||||||
}
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver daqboard2000_driver = {
|
static struct comedi_driver daqboard2000_driver = {
|
||||||
|
|
|
@ -77,7 +77,7 @@ static struct comedi_driver das08_pci_comedi_driver = {
|
||||||
.driver_name = "pci-das08",
|
.driver_name = "pci-das08",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = das08_pci_auto_attach,
|
.auto_attach = das08_pci_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int das08_pci_probe(struct pci_dev *dev,
|
static int das08_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -735,20 +735,11 @@ static int dt3000_auto_attach(struct comedi_device *dev,
|
||||||
return 0;
|
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 = {
|
static struct comedi_driver dt3000_driver = {
|
||||||
.driver_name = "dt3000",
|
.driver_name = "dt3000",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = dt3000_auto_attach,
|
.auto_attach = dt3000_auto_attach,
|
||||||
.detach = dt3000_detach,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int dt3000_pci_probe(struct pci_dev *dev,
|
static int dt3000_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -243,9 +243,9 @@ static void dyna_pci10xx_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct dyna_pci10xx_private *devpriv = dev->private;
|
struct dyna_pci10xx_private *devpriv = dev->private;
|
||||||
|
|
||||||
|
comedi_pci_detach(dev);
|
||||||
if (devpriv)
|
if (devpriv)
|
||||||
mutex_destroy(&devpriv->mutex);
|
mutex_destroy(&devpriv->mutex);
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver dyna_pci10xx_driver = {
|
static struct comedi_driver dyna_pci10xx_driver = {
|
||||||
|
|
|
@ -542,11 +542,7 @@ static void icp_multi_detach(struct comedi_device *dev)
|
||||||
if (devpriv)
|
if (devpriv)
|
||||||
if (devpriv->valid)
|
if (devpriv->valid)
|
||||||
icp_multi_reset(dev);
|
icp_multi_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (dev->mmio)
|
|
||||||
iounmap(dev->mmio);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver icp_multi_driver = {
|
static struct comedi_driver icp_multi_driver = {
|
||||||
|
|
|
@ -212,7 +212,7 @@ static struct comedi_driver ke_counter_driver = {
|
||||||
.driver_name = "ke_counter",
|
.driver_name = "ke_counter",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = ke_counter_auto_attach,
|
.auto_attach = ke_counter_auto_attach,
|
||||||
.detach = comedi_pci_disable,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ke_counter_pci_probe(struct pci_dev *dev,
|
static int ke_counter_pci_probe(struct pci_dev *dev,
|
||||||
|
|
|
@ -1516,11 +1516,9 @@ static int me4000_auto_attach(struct comedi_device *dev,
|
||||||
|
|
||||||
static void me4000_detach(struct comedi_device *dev)
|
static void me4000_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->irq)
|
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (dev->iobase)
|
if (dev->iobase)
|
||||||
me4000_reset(dev);
|
me4000_reset(dev);
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver me4000_driver = {
|
static struct comedi_driver me4000_driver = {
|
||||||
|
|
|
@ -544,14 +544,12 @@ static void me_detach(struct comedi_device *dev)
|
||||||
struct me_private_data *dev_private = dev->private;
|
struct me_private_data *dev_private = dev->private;
|
||||||
|
|
||||||
if (dev_private) {
|
if (dev_private) {
|
||||||
if (dev->mmio) {
|
if (dev->mmio)
|
||||||
me_reset(dev);
|
me_reset(dev);
|
||||||
iounmap(dev->mmio);
|
|
||||||
}
|
|
||||||
if (dev_private->plx_regbase)
|
if (dev_private->plx_regbase)
|
||||||
iounmap(dev_private->plx_regbase);
|
iounmap(dev_private->plx_regbase);
|
||||||
}
|
}
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver me_daq_driver = {
|
static struct comedi_driver me_daq_driver = {
|
||||||
|
|
|
@ -290,14 +290,13 @@ static void mf6x4_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct mf6x4_private *devpriv = dev->private;
|
struct mf6x4_private *devpriv = dev->private;
|
||||||
|
|
||||||
if (devpriv->bar0_mem)
|
if (devpriv) {
|
||||||
iounmap(devpriv->bar0_mem);
|
if (devpriv->bar0_mem)
|
||||||
if (dev->mmio)
|
iounmap(devpriv->bar0_mem);
|
||||||
iounmap(dev->mmio);
|
if (devpriv->bar2_mem)
|
||||||
if (devpriv->bar2_mem)
|
iounmap(devpriv->bar2_mem);
|
||||||
iounmap(devpriv->bar2_mem);
|
}
|
||||||
|
comedi_pci_detach(dev);
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver mf6x4_driver = {
|
static struct comedi_driver mf6x4_driver = {
|
||||||
|
|
|
@ -471,11 +471,7 @@ static void ni6527_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
if (dev->mmio)
|
if (dev->mmio)
|
||||||
ni6527_reset(dev);
|
ni6527_reset(dev);
|
||||||
if (dev->irq)
|
comedi_pci_detach(dev);
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
if (dev->mmio)
|
|
||||||
iounmap(dev->mmio);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver ni6527_driver = {
|
static struct comedi_driver ni6527_driver = {
|
||||||
|
|
|
@ -792,13 +792,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
|
||||||
|
|
||||||
static void ni_65xx_detach(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);
|
writeb(0x00, dev->mmio + NI_65XX_CTRL_REG);
|
||||||
iounmap(dev->mmio);
|
comedi_pci_detach(dev);
|
||||||
}
|
|
||||||
if (dev->irq)
|
|
||||||
free_irq(dev->irq, dev);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver ni_65xx_driver = {
|
static struct comedi_driver ni_65xx_driver = {
|
||||||
|
|
|
@ -256,14 +256,12 @@ static void ni_670x_detach(struct comedi_device *dev)
|
||||||
{
|
{
|
||||||
struct comedi_subdevice *s;
|
struct comedi_subdevice *s;
|
||||||
|
|
||||||
|
comedi_pci_detach(dev);
|
||||||
if (dev->n_subdevices) {
|
if (dev->n_subdevices) {
|
||||||
s = &dev->subdevices[0];
|
s = &dev->subdevices[0];
|
||||||
if (s)
|
if (s)
|
||||||
kfree(s->range_table_list);
|
kfree(s->range_table_list);
|
||||||
}
|
}
|
||||||
if (dev->mmio)
|
|
||||||
iounmap(dev->mmio);
|
|
||||||
comedi_pci_disable(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_driver ni_670x_driver = {
|
static struct comedi_driver ni_670x_driver = {
|
||||||
|
|
|
@ -108,20 +108,11 @@ static int labpc_pci_auto_attach(struct comedi_device *dev,
|
||||||
return labpc_common_attach(dev, pcidev->irq, IRQF_SHARED);
|
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 = {
|
static struct comedi_driver labpc_pci_comedi_driver = {
|
||||||
.driver_name = "labpc_pci",
|
.driver_name = "labpc_pci",
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.auto_attach = labpc_pci_auto_attach,
|
.auto_attach = labpc_pci_auto_attach,
|
||||||
.detach = labpc_pci_detach,
|
.detach = comedi_pci_detach,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct pci_device_id labpc_pci_table[] = {
|
static const struct pci_device_id labpc_pci_table[] = {
|
||||||
|
|
|
@ -640,7 +640,7 @@ static void skel_detach(struct comedi_device *dev)
|
||||||
* If PCI device enabled by _auto_attach() (or _attach()),
|
* If PCI device enabled by _auto_attach() (or _attach()),
|
||||||
* disable it here.
|
* disable it here.
|
||||||
*/
|
*/
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_detach(dev);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* ISA board
|
* ISA board
|
||||||
|
|
Loading…
Reference in New Issue