staging: comedi_pci: make comedi_pci_disable() safe to call

Currently all the comedi PCI drivers need to do some checking in
their (*detach) before calling comedi_pci_disable() in order to
make sure the PCI device has actually be enabled.

Change the parameter passed to comedi_pci_disable() from a struct
pci_dev pointer to a comedi_device pointer and have comedi_pci_disable()
handle all the checking.

For most comedi PCI drivers this also allows removing the local
variable holding the pointer to the pci_dev. For some of the drivers
comedi_pci_disable can now be used directly as the (*detach) function.

The National Instruments drivers that use the mite module currently
enable/disable the PCI device in the mite module. For those drivers
move the call to comedi_pci_disable into the driver and make sure
dev->iobase is set to a non-zero value.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
H Hartley Sweeten 2013-03-13 10:35:51 -07:00 committed by Greg Kroah-Hartman
parent 433121c6ef
commit 7f072f54ae
53 changed files with 82 additions and 276 deletions

View File

@ -57,14 +57,16 @@ EXPORT_SYMBOL_GPL(comedi_pci_enable);
/** /**
* comedi_pci_disable() - Release the regions and disable the PCI device. * comedi_pci_disable() - Release the regions and disable the PCI device.
* @pcidev: pci_dev struct * @dev: comedi_device struct
*
* This must be matched with a previous successful call to comedi_pci_enable().
*/ */
void comedi_pci_disable(struct pci_dev *pcidev) void comedi_pci_disable(struct comedi_device *dev)
{ {
pci_release_regions(pcidev); struct pci_dev *pcidev = comedi_to_pci_dev(dev);
pci_disable_device(pcidev);
if (pcidev && dev->iobase) {
pci_release_regions(pcidev);
pci_disable_device(pcidev);
}
} }
EXPORT_SYMBOL_GPL(comedi_pci_disable); EXPORT_SYMBOL_GPL(comedi_pci_disable);

View File

@ -385,7 +385,7 @@ struct pci_driver;
struct pci_dev *comedi_to_pci_dev(struct comedi_device *); struct pci_dev *comedi_to_pci_dev(struct comedi_device *);
int comedi_pci_enable(struct pci_dev *, const char *); int comedi_pci_enable(struct pci_dev *, const char *);
void comedi_pci_disable(struct pci_dev *); void comedi_pci_disable(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);
@ -426,7 +426,7 @@ static inline int comedi_pci_enable(struct pci_dev *dev, const char *name)
return -ENOSYS; return -ENOSYS;
} }
static inline void comedi_pci_disable(struct pci_dev *dev) static inline void comedi_pci_disable(struct comedi_device *dev)
{ {
} }

View File

@ -247,7 +247,6 @@ static int pci_8255_auto_attach(struct comedi_device *dev,
static void pci_8255_detach(struct comedi_device *dev) static void pci_8255_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
const struct pci_8255_boardinfo *board = comedi_board(dev); const struct pci_8255_boardinfo *board = comedi_board(dev);
struct pci_8255_private *devpriv = dev->private; struct pci_8255_private *devpriv = dev->private;
struct comedi_subdevice *s; struct comedi_subdevice *s;
@ -261,12 +260,9 @@ static void pci_8255_detach(struct comedi_device *dev)
subdev_8255_cleanup(dev, s); subdev_8255_cleanup(dev, s);
} }
} }
if (pcidev) { if (devpriv->mmio_base)
if (devpriv->mmio_base) iounmap(devpriv->mmio_base);
iounmap(devpriv->mmio_base); comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver pci_8255_driver = { static struct comedi_driver pci_8255_driver = {

View File

@ -317,7 +317,6 @@ 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 pci_dev *pcidev = comedi_to_pci_dev(dev);
struct addi_private *devpriv = dev->private; struct addi_private *devpriv = dev->private;
if (devpriv) { if (devpriv) {
@ -328,8 +327,5 @@ static void i_ADDI_Detach(struct comedi_device *dev)
if (devpriv->dw_AiBase) if (devpriv->dw_AiBase)
iounmap(devpriv->dw_AiBase); iounmap(devpriv->dw_AiBase);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }

View File

@ -353,16 +353,11 @@ static int apci1032_auto_attach(struct comedi_device *dev,
static void apci1032_detach(struct comedi_device *dev) static void apci1032_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
apci1032_reset(dev); apci1032_reset(dev);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver apci1032_driver = { static struct comedi_driver apci1032_driver = {

View File

@ -201,14 +201,11 @@ static int apci1516_auto_attach(struct comedi_device *dev,
static void apci1516_detach(struct comedi_device *dev) static void apci1516_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
apci1516_reset(dev); apci1516_reset(dev);
if (dev->subdevices) if (dev->subdevices)
addi_watchdog_cleanup(&dev->subdevices[2]); addi_watchdog_cleanup(&dev->subdevices[2]);
if (dev->iobase) comedi_pci_disable(dev);
comedi_pci_disable(pcidev);
} }
static struct comedi_driver apci1516_driver = { static struct comedi_driver apci1516_driver = {

View File

@ -184,21 +184,11 @@ static int apci16xx_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void apci16xx_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev) {
if (dev->iobase)
comedi_pci_disable(pcidev);
}
}
static struct comedi_driver apci16xx_driver = { 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 = apci16xx_detach, .detach = comedi_pci_disable,
}; };
static int apci16xx_pci_probe(struct pci_dev *dev, static int apci16xx_pci_probe(struct pci_dev *dev,

View File

@ -73,16 +73,11 @@ static int apci1710_auto_attach(struct comedi_device *dev,
static void apci1710_detach(struct comedi_device *dev) static void apci1710_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
i_APCI1710_Reset(dev); i_APCI1710_Reset(dev);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver apci1710_driver = { static struct comedi_driver apci1710_driver = {

View File

@ -350,8 +350,6 @@ static int apci2032_auto_attach(struct comedi_device *dev,
static void apci2032_detach(struct comedi_device *dev) static void apci2032_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
apci2032_reset(dev); apci2032_reset(dev);
if (dev->irq) if (dev->irq)
@ -360,10 +358,7 @@ static void apci2032_detach(struct comedi_device *dev)
kfree(dev->read_subdev->private); kfree(dev->read_subdev->private);
if (dev->subdevices) if (dev->subdevices)
addi_watchdog_cleanup(&dev->subdevices[1]); addi_watchdog_cleanup(&dev->subdevices[1]);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver apci2032_driver = { static struct comedi_driver apci2032_driver = {

View File

@ -130,16 +130,11 @@ static int apci2200_auto_attach(struct comedi_device *dev,
static void apci2200_detach(struct comedi_device *dev) static void apci2200_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
apci2200_reset(dev); apci2200_reset(dev);
if (dev->subdevices) if (dev->subdevices)
addi_watchdog_cleanup(&dev->subdevices[2]); addi_watchdog_cleanup(&dev->subdevices[2]);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver apci2200_driver = { static struct comedi_driver apci2200_driver = {

View File

@ -203,7 +203,6 @@ static int apci3120_auto_attach(struct comedi_device *dev,
static void apci3120_detach(struct comedi_device *dev) static void apci3120_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct addi_private *devpriv = dev->private; struct addi_private *devpriv = dev->private;
if (devpriv) { if (devpriv) {
@ -222,10 +221,7 @@ static void apci3120_detach(struct comedi_device *dev)
devpriv->ui_DmaBufferPages[1]); devpriv->ui_DmaBufferPages[1]);
} }
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver apci3120_driver = { static struct comedi_driver apci3120_driver = {

View File

@ -423,16 +423,11 @@ static int apci3501_auto_attach(struct comedi_device *dev,
static void apci3501_detach(struct comedi_device *dev) static void apci3501_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
apci3501_reset(dev); apci3501_reset(dev);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver apci3501_driver = { static struct comedi_driver apci3501_driver = {

View File

@ -233,21 +233,11 @@ static int pci6208_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void pci6208_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev) {
if (dev->iobase)
comedi_pci_disable(pcidev);
}
}
static struct comedi_driver adl_pci6208_driver = { 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 = pci6208_detach, .detach = comedi_pci_disable,
}; };
static int adl_pci6208_pci_probe(struct pci_dev *dev, static int adl_pci6208_pci_probe(struct pci_dev *dev,

View File

@ -259,21 +259,11 @@ static int adl_pci7x3x_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void adl_pci7x3x_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev) {
if (dev->iobase)
comedi_pci_disable(pcidev);
}
}
static struct comedi_driver adl_pci7x3x_driver = { 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 = adl_pci7x3x_detach, .detach = comedi_pci_disable,
}; };
static int adl_pci7x3x_pci_probe(struct pci_dev *dev, static int adl_pci7x3x_pci_probe(struct pci_dev *dev,

View File

@ -136,21 +136,11 @@ static int adl_pci8164_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void adl_pci8164_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev) {
if (dev->iobase)
comedi_pci_disable(pcidev);
}
}
static struct comedi_driver adl_pci8164_driver = { 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 = adl_pci8164_detach, .detach = comedi_pci_disable,
}; };
static int adl_pci8164_pci_probe(struct pci_dev *dev, static int adl_pci8164_pci_probe(struct pci_dev *dev,

View File

@ -939,16 +939,11 @@ static int pci9111_auto_attach(struct comedi_device *dev,
static void pci9111_detach(struct comedi_device *dev) static void pci9111_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
pci9111_reset(dev); pci9111_reset(dev);
if (dev->irq != 0) if (dev->irq != 0)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver adl_pci9111_driver = { static struct comedi_driver adl_pci9111_driver = {

View File

@ -2202,12 +2202,9 @@ 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]);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase) if (pcidev)
comedi_pci_disable(pcidev);
pci_dev_put(pcidev); pci_dev_put(pcidev);
}
} }
static struct comedi_driver adl_pci9118_driver = { static struct comedi_driver adl_pci9118_driver = {

View File

@ -1372,16 +1372,11 @@ static int pci1710_auto_attach(struct comedi_device *dev,
static void pci1710_detach(struct comedi_device *dev) static void pci1710_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->iobase) if (dev->iobase)
pci1710_reset(dev); pci1710_reset(dev);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver adv_pci1710_driver = { static struct comedi_driver adv_pci1710_driver = {

View File

@ -306,14 +306,9 @@ static int pci1723_auto_attach(struct comedi_device *dev,
static void pci1723_detach(struct comedi_device *dev) static void pci1723_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev); if (dev->iobase)
pci1723_reset(dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase) {
pci1723_reset(dev);
comedi_pci_disable(pcidev);
}
}
} }
static struct comedi_driver adv_pci1723_driver = { static struct comedi_driver adv_pci1723_driver = {

View File

@ -377,21 +377,11 @@ static int adv_pci1724_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void adv_pci1724_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev && dev->iobase) {
comedi_pci_disable(pcidev);
dev_info(dev->class_dev, "detached\n");
}
}
static struct comedi_driver adv_pci1724_driver = { 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 = adv_pci1724_detach, .detach = comedi_pci_disable,
}; };
static int adv_pci1724_pci_probe(struct pci_dev *dev, static int adv_pci1724_pci_probe(struct pci_dev *dev,

View File

@ -1165,7 +1165,6 @@ static int pci_dio_auto_attach(struct comedi_device *dev,
static void pci_dio_detach(struct comedi_device *dev) static void pci_dio_detach(struct comedi_device *dev)
{ {
struct pci_dio_private *devpriv = dev->private; struct pci_dio_private *devpriv = dev->private;
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct comedi_subdevice *s; struct comedi_subdevice *s;
int i; int i;
@ -1181,10 +1180,7 @@ static void pci_dio_detach(struct comedi_device *dev)
s->private = NULL; s->private = NULL;
} }
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver adv_pci_dio_driver = { static struct comedi_driver adv_pci_dio_driver = {

View File

@ -2029,14 +2029,9 @@ static void dio200_detach(struct comedi_device *dev)
release_region(devpriv->io.u.iobase, release_region(devpriv->io.u.iobase,
thisboard->mainsize); thisboard->mainsize);
} else if (is_pci_board(thisboard)) { } else if (is_pci_board(thisboard)) {
struct pci_dev *pcidev = comedi_to_pci_dev(dev); if (devpriv->io.regtype == mmio_regtype)
if (pcidev) { iounmap(devpriv->io.u.membase);
if (devpriv->io.regtype != no_regtype) { comedi_pci_disable(dev);
if (devpriv->io.regtype == mmio_regtype)
iounmap(devpriv->io.u.membase);
comedi_pci_disable(pcidev);
}
}
} }
} }

View File

@ -576,11 +576,9 @@ static void pc236_detach(struct comedi_device *dev)
release_region(dev->iobase, PC236_IO_SIZE); release_region(dev->iobase, PC236_IO_SIZE);
} 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 (pcidev) { comedi_pci_disable(dev);
if (dev->iobase) if (pcidev)
comedi_pci_disable(pcidev);
pci_dev_put(pcidev); pci_dev_put(pcidev);
}
} }
} }

View File

@ -335,11 +335,9 @@ static void pc263_detach(struct comedi_device *dev)
release_region(dev->iobase, PC263_IO_SIZE); release_region(dev->iobase, PC263_IO_SIZE);
} 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 (pcidev) { comedi_pci_disable(dev);
if (dev->iobase) if (pcidev)
comedi_pci_disable(pcidev);
pci_dev_put(pcidev); pci_dev_put(pcidev);
}
} }
} }

View File

@ -1488,11 +1488,9 @@ static void pci224_detach(struct comedi_device *dev)
kfree(devpriv->ao_scan_vals); kfree(devpriv->ao_scan_vals);
kfree(devpriv->ao_scan_order); kfree(devpriv->ao_scan_order);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase) if (pcidev)
comedi_pci_disable(pcidev);
pci_dev_put(pcidev); pci_dev_put(pcidev);
}
} }
static struct comedi_driver amplc_pci224_driver = { static struct comedi_driver amplc_pci224_driver = {

View File

@ -2840,11 +2840,9 @@ static void pci230_detach(struct comedi_device *dev)
subdev_8255_cleanup(dev, &dev->subdevices[2]); subdev_8255_cleanup(dev, &dev->subdevices[2]);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase) if (pcidev)
comedi_pci_disable(pcidev);
pci_dev_put(pcidev); pci_dev_put(pcidev);
}
} }
static struct comedi_driver amplc_pci230_driver = { static struct comedi_driver amplc_pci230_driver = {

View File

@ -1458,6 +1458,7 @@ static int cb_pcidas_auto_attach(struct comedi_device *dev,
ret = comedi_pci_enable(pcidev, dev->board_name); ret = comedi_pci_enable(pcidev, dev->board_name);
if (ret) if (ret)
return ret; return ret;
dev->iobase = 1;
devpriv->s5933_config = pci_resource_start(pcidev, 0); devpriv->s5933_config = pci_resource_start(pcidev, 0);
devpriv->control_status = pci_resource_start(pcidev, 1); devpriv->control_status = pci_resource_start(pcidev, 1);
@ -1599,7 +1600,6 @@ static int cb_pcidas_auto_attach(struct comedi_device *dev,
static void cb_pcidas_detach(struct comedi_device *dev) static void cb_pcidas_detach(struct comedi_device *dev)
{ {
struct cb_pcidas_private *devpriv = dev->private; struct cb_pcidas_private *devpriv = dev->private;
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (devpriv) { if (devpriv) {
if (devpriv->s5933_config) { if (devpriv->s5933_config) {
@ -1611,10 +1611,7 @@ static void cb_pcidas_detach(struct comedi_device *dev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (dev->subdevices) if (dev->subdevices)
subdev_8255_cleanup(dev, &dev->subdevices[2]); subdev_8255_cleanup(dev, &dev->subdevices[2]);
if (pcidev) { comedi_pci_disable(dev);
if (devpriv->s5933_config)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver cb_pcidas_driver = { static struct comedi_driver cb_pcidas_driver = {

View File

@ -4194,10 +4194,7 @@ static void detach(struct comedi_device *dev)
} }
if (dev->subdevices) if (dev->subdevices)
subdev_8255_cleanup(dev, &dev->subdevices[4]); subdev_8255_cleanup(dev, &dev->subdevices[4]);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver cb_pcidas64_driver = { static struct comedi_driver cb_pcidas64_driver = {

View File

@ -399,16 +399,11 @@ static int cb_pcidda_auto_attach(struct comedi_device *dev,
static void cb_pcidda_detach(struct comedi_device *dev) static void cb_pcidda_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->subdevices) { if (dev->subdevices) {
subdev_8255_cleanup(dev, &dev->subdevices[1]); subdev_8255_cleanup(dev, &dev->subdevices[1]);
subdev_8255_cleanup(dev, &dev->subdevices[2]); subdev_8255_cleanup(dev, &dev->subdevices[2]);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver cb_pcidda_driver = { static struct comedi_driver cb_pcidda_driver = {

View File

@ -277,14 +277,9 @@ static int cb_pcimdas_auto_attach(struct comedi_device *dev,
static void cb_pcimdas_detach(struct comedi_device *dev) static void cb_pcimdas_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver cb_pcimdas_driver = { static struct comedi_driver cb_pcimdas_driver = {

View File

@ -201,14 +201,9 @@ static int cb_pcimdda_auto_attach(struct comedi_device *dev,
static void cb_pcimdda_detach(struct comedi_device *dev) static void cb_pcimdda_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->subdevices) if (dev->subdevices)
subdev_8255_cleanup(dev, &dev->subdevices[1]); subdev_8255_cleanup(dev, &dev->subdevices[1]);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver cb_pcimdda_driver = { static struct comedi_driver cb_pcimdda_driver = {

View File

@ -109,21 +109,11 @@ static int contec_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void contec_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev) {
if (dev->iobase)
comedi_pci_disable(pcidev);
}
}
static struct comedi_driver contec_pci_dio_driver = { 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 = contec_detach, .detach = comedi_pci_disable,
}; };
static int contec_pci_dio_pci_probe(struct pci_dev *dev, static int contec_pci_dio_pci_probe(struct pci_dev *dev,

View File

@ -767,7 +767,6 @@ static int daqboard2000_auto_attach(struct comedi_device *dev,
static void daqboard2000_detach(struct comedi_device *dev) static void daqboard2000_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct daqboard2000_private *devpriv = dev->private; struct daqboard2000_private *devpriv = dev->private;
if (dev->subdevices) if (dev->subdevices)
@ -780,11 +779,7 @@ static void daqboard2000_detach(struct comedi_device *dev)
if (devpriv->plx) if (devpriv->plx)
iounmap(devpriv->plx); iounmap(devpriv->plx);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
pci_dev_put(pcidev);
}
} }
static struct comedi_driver daqboard2000_driver = { static struct comedi_driver daqboard2000_driver = {

View File

@ -81,11 +81,8 @@ static int das08_pci_auto_attach(struct comedi_device *dev,
static void das08_pci_detach(struct comedi_device *dev) static void das08_pci_detach(struct comedi_device *dev)
{ {
struct pci_dev *pdev = comedi_to_pci_dev(dev);
das08_common_detach(dev); das08_common_detach(dev);
if (dev->iobase) comedi_pci_disable(dev);
comedi_pci_disable(pdev);
} }
static struct comedi_driver das08_pci_comedi_driver = { static struct comedi_driver das08_pci_comedi_driver = {

View File

@ -814,7 +814,6 @@ static int dt3000_auto_attach(struct comedi_device *dev,
static void dt3000_detach(struct comedi_device *dev) static void dt3000_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct dt3k_private *devpriv = dev->private; struct dt3k_private *devpriv = dev->private;
if (dev->irq) if (dev->irq)
@ -823,10 +822,7 @@ static void dt3000_detach(struct comedi_device *dev)
if (devpriv->io_addr) if (devpriv->io_addr)
iounmap(devpriv->io_addr); iounmap(devpriv->io_addr);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver dt3000_driver = { static struct comedi_driver dt3000_driver = {

View File

@ -254,15 +254,11 @@ static int dyna_pci10xx_auto_attach(struct comedi_device *dev,
static void dyna_pci10xx_detach(struct comedi_device *dev) static void dyna_pci10xx_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct dyna_pci10xx_private *devpriv = dev->private; struct dyna_pci10xx_private *devpriv = dev->private;
if (devpriv) if (devpriv)
mutex_destroy(&devpriv->mutex); mutex_destroy(&devpriv->mutex);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver dyna_pci10xx_driver = { static struct comedi_driver dyna_pci10xx_driver = {

View File

@ -596,9 +596,8 @@ static void hpdi_detach(struct comedi_device *dev)
NUM_DMA_DESCRIPTORS, NUM_DMA_DESCRIPTORS,
devpriv->dma_desc, devpriv->dma_desc,
devpriv->dma_desc_phys_addr); devpriv->dma_desc_phys_addr);
if (dev->iobase)
comedi_pci_disable(pcidev);
} }
comedi_pci_disable(dev);
} }
static int dio_config_block_size(struct comedi_device *dev, unsigned int *data) static int dio_config_block_size(struct comedi_device *dev, unsigned int *data)

View File

@ -594,7 +594,6 @@ static int icp_multi_auto_attach(struct comedi_device *dev,
static void icp_multi_detach(struct comedi_device *dev) static void icp_multi_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct icp_multi_private *devpriv = dev->private; struct icp_multi_private *devpriv = dev->private;
if (devpriv) if (devpriv)
@ -604,10 +603,7 @@ static void icp_multi_detach(struct comedi_device *dev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (devpriv && devpriv->io_addr) if (devpriv && devpriv->io_addr)
iounmap(devpriv->io_addr); iounmap(devpriv->io_addr);
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver icp_multi_driver = { static struct comedi_driver icp_multi_driver = {

View File

@ -816,7 +816,6 @@ static int jr3_pci_auto_attach(struct comedi_device *dev,
static void jr3_pci_detach(struct comedi_device *dev) static void jr3_pci_detach(struct comedi_device *dev)
{ {
int i; int i;
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct jr3_pci_dev_private *devpriv = dev->private; struct jr3_pci_dev_private *devpriv = dev->private;
if (devpriv) { if (devpriv) {
@ -828,9 +827,8 @@ static void jr3_pci_detach(struct comedi_device *dev)
} }
if (devpriv->iobase) if (devpriv->iobase)
iounmap(devpriv->iobase); iounmap(devpriv->iobase);
if (dev->iobase)
comedi_pci_disable(pcidev);
} }
comedi_pci_disable(dev);
} }
static struct comedi_driver jr3_pci_driver = { static struct comedi_driver jr3_pci_driver = {

View File

@ -131,21 +131,11 @@ static int cnt_auto_attach(struct comedi_device *dev,
return 0; return 0;
} }
static void cnt_detach(struct comedi_device *dev)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (pcidev) {
if (dev->iobase)
comedi_pci_disable(pcidev);
}
}
static struct comedi_driver ke_counter_driver = { static struct comedi_driver ke_counter_driver = {
.driver_name = "ke_counter", .driver_name = "ke_counter",
.module = THIS_MODULE, .module = THIS_MODULE,
.auto_attach = cnt_auto_attach, .auto_attach = cnt_auto_attach,
.detach = cnt_detach, .detach = comedi_pci_disable,
}; };
static int ke_counter_pci_probe(struct pci_dev *dev, static int ke_counter_pci_probe(struct pci_dev *dev,

View File

@ -1697,16 +1697,11 @@ 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)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (dev->irq) if (dev->irq)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
if (pcidev) { if (dev->iobase)
if (dev->iobase) { me4000_reset(dev);
me4000_reset(dev); comedi_pci_disable(dev);
comedi_pci_disable(pcidev);
}
}
} }
static struct comedi_driver me4000_driver = { static struct comedi_driver me4000_driver = {

View File

@ -580,7 +580,6 @@ static int me_auto_attach(struct comedi_device *dev,
static void me_detach(struct comedi_device *dev) static void me_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct me_private_data *dev_private = dev->private; struct me_private_data *dev_private = dev->private;
if (dev_private) { if (dev_private) {
@ -591,10 +590,7 @@ static void me_detach(struct comedi_device *dev)
if (dev_private->plx_regbase) if (dev_private->plx_regbase)
iounmap(dev_private->plx_regbase); iounmap(dev_private->plx_regbase);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver me_daq_driver = { static struct comedi_driver me_daq_driver = {

View File

@ -208,10 +208,8 @@ void mite_unsetup(struct mite_struct *mite)
iounmap(mite->daq_io_addr); iounmap(mite->daq_io_addr);
mite->daq_io_addr = NULL; mite->daq_io_addr = NULL;
} }
if (mite->mite_phys_addr) { if (mite->mite_phys_addr)
comedi_pci_disable(mite->pcidev);
mite->mite_phys_addr = 0; mite->mite_phys_addr = 0;
}
} }
EXPORT_SYMBOL(mite_unsetup); EXPORT_SYMBOL(mite_unsetup);

View File

@ -350,6 +350,7 @@ static int ni6527_auto_attach(struct comedi_device *dev,
dev_err(dev->class_dev, "error setting up mite\n"); dev_err(dev->class_dev, "error setting up mite\n");
return ret; return ret;
} }
dev->iobase = 1;
dev_info(dev->class_dev, "board: %s, ID=0x%02x\n", dev->board_name, dev_info(dev->class_dev, "board: %s, ID=0x%02x\n", dev->board_name,
readb(devpriv->mite->daq_io_addr + ID_Register)); readb(devpriv->mite->daq_io_addr + ID_Register));
@ -419,6 +420,7 @@ static void ni6527_detach(struct comedi_device *dev)
mite_unsetup(devpriv->mite); mite_unsetup(devpriv->mite);
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
comedi_pci_disable(dev);
} }
static struct comedi_driver ni6527_driver = { static struct comedi_driver ni6527_driver = {

View File

@ -614,6 +614,7 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
dev_warn(dev->class_dev, "error setting up mite\n"); dev_warn(dev->class_dev, "error setting up mite\n");
return ret; return ret;
} }
dev->iobase = 1;
dev->irq = mite_irq(devpriv->mite); dev->irq = mite_irq(devpriv->mite);
dev_info(dev->class_dev, "board: %s, ID=0x%02x", dev->board_name, dev_info(dev->class_dev, "board: %s, ID=0x%02x", dev->board_name,
@ -748,6 +749,7 @@ static void ni_65xx_detach(struct comedi_device *dev)
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
} }
comedi_pci_disable(dev);
} }
static struct comedi_driver ni_65xx_driver = { static struct comedi_driver ni_65xx_driver = {

View File

@ -1188,6 +1188,7 @@ static int ni_660x_auto_attach(struct comedi_device *dev,
dev_warn(dev->class_dev, "error setting up mite\n"); dev_warn(dev->class_dev, "error setting up mite\n");
return ret; return ret;
} }
dev->iobase = 1;
ret = ni_660x_alloc_mite_rings(dev); ret = ni_660x_alloc_mite_rings(dev);
if (ret < 0) if (ret < 0)
@ -1302,6 +1303,7 @@ static void ni_660x_detach(struct comedi_device *dev)
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
} }
comedi_pci_disable(dev);
} }
static struct comedi_driver ni_660x_driver = { static struct comedi_driver ni_660x_driver = {

View File

@ -222,6 +222,7 @@ static int ni_670x_auto_attach(struct comedi_device *dev,
dev_warn(dev->class_dev, "error setting up mite\n"); dev_warn(dev->class_dev, "error setting up mite\n");
return ret; return ret;
} }
dev->iobase = 1;
ret = comedi_alloc_subdevices(dev, 2); ret = comedi_alloc_subdevices(dev, 2);
if (ret) if (ret)
@ -286,6 +287,7 @@ static void ni_670x_detach(struct comedi_device *dev)
mite_unsetup(devpriv->mite); mite_unsetup(devpriv->mite);
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
comedi_pci_disable(dev);
} }
static struct comedi_driver ni_670x_driver = { static struct comedi_driver ni_670x_driver = {

View File

@ -722,6 +722,7 @@ static int labpc_auto_attach(struct comedi_device *dev,
ret = mite_setup(devpriv->mite); ret = mite_setup(devpriv->mite);
if (ret < 0) if (ret < 0)
return ret; return ret;
dev->iobase = 1;
iobase = (unsigned long)devpriv->mite->daq_io_addr; iobase = (unsigned long)devpriv->mite->daq_io_addr;
irq = mite_irq(devpriv->mite); irq = mite_irq(devpriv->mite);
return labpc_common_attach(dev, iobase, irq, 0); return labpc_common_attach(dev, iobase, irq, 0);
@ -800,6 +801,7 @@ void labpc_common_detach(struct comedi_device *dev)
mite_unsetup(devpriv->mite); mite_unsetup(devpriv->mite);
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
comedi_pci_disable(dev);
#endif #endif
}; };
EXPORT_SYMBOL_GPL(labpc_common_detach); EXPORT_SYMBOL_GPL(labpc_common_detach);

View File

@ -1128,6 +1128,7 @@ static int nidio_auto_attach(struct comedi_device *dev,
dev_warn(dev->class_dev, "error setting up mite\n"); dev_warn(dev->class_dev, "error setting up mite\n");
return ret; return ret;
} }
dev->iobase = 1;
devpriv->di_mite_ring = mite_alloc_ring(devpriv->mite); devpriv->di_mite_ring = mite_alloc_ring(devpriv->mite);
if (devpriv->di_mite_ring == NULL) if (devpriv->di_mite_ring == NULL)
@ -1202,6 +1203,7 @@ static void nidio_detach(struct comedi_device *dev)
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
} }
comedi_pci_disable(dev);
} }
static struct comedi_driver ni_pcidio_driver = { static struct comedi_driver ni_pcidio_driver = {

View File

@ -1470,6 +1470,7 @@ static void pcimio_detach(struct comedi_device *dev)
mite_free(devpriv->mite); mite_free(devpriv->mite);
} }
} }
comedi_pci_disable(dev);
} }
static int pcimio_auto_attach(struct comedi_device *dev, static int pcimio_auto_attach(struct comedi_device *dev,
@ -1513,6 +1514,7 @@ static int pcimio_auto_attach(struct comedi_device *dev,
pr_warn("error setting up mite\n"); pr_warn("error setting up mite\n");
return ret; return ret;
} }
dev->iobase = 1;
devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite); devpriv->ai_mite_ring = mite_alloc_ring(devpriv->mite);
if (devpriv->ai_mite_ring == NULL) if (devpriv->ai_mite_ring == NULL)

View File

@ -1373,7 +1373,6 @@ static int rtd_auto_attach(struct comedi_device *dev,
static void rtd_detach(struct comedi_device *dev) static void rtd_detach(struct comedi_device *dev)
{ {
struct rtdPrivate *devpriv = dev->private; struct rtdPrivate *devpriv = dev->private;
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (devpriv) { if (devpriv) {
/* Shut down any board ops by resetting it */ /* Shut down any board ops by resetting it */
@ -1392,10 +1391,7 @@ static void rtd_detach(struct comedi_device *dev)
if (devpriv->lcfg) if (devpriv->lcfg)
iounmap(devpriv->lcfg); iounmap(devpriv->lcfg);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver rtd520_driver = { static struct comedi_driver rtd520_driver = {

View File

@ -2790,7 +2790,6 @@ static int s626_auto_attach(struct comedi_device *dev,
static void s626_detach(struct comedi_device *dev) static void s626_detach(struct comedi_device *dev)
{ {
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
struct s626_private *devpriv = dev->private; struct s626_private *devpriv = dev->private;
if (devpriv) { if (devpriv) {
@ -2818,10 +2817,7 @@ static void s626_detach(struct comedi_device *dev)
if (devpriv->base_addr) if (devpriv->base_addr)
iounmap(devpriv->base_addr); iounmap(devpriv->base_addr);
} }
if (pcidev) { comedi_pci_disable(dev);
if (dev->iobase)
comedi_pci_disable(pcidev);
}
} }
static struct comedi_driver s626_driver = { static struct comedi_driver s626_driver = {

View File

@ -606,7 +606,6 @@ static void skel_detach(struct comedi_device *dev)
{ {
const struct skel_board *thisboard = comedi_board(dev); const struct skel_board *thisboard = comedi_board(dev);
struct skel_private *devpriv = dev->private; struct skel_private *devpriv = dev->private;
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
if (!thisboard || !devpriv) if (!thisboard || !devpriv)
return; return;
@ -626,8 +625,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.
*/ */
if (pcidev && dev->iobase) comedi_pci_disable(dev);
comedi_pci_disable(pcidev);
} else { } else {
/* /*
* ISA board * ISA board