]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/staging/comedi/drivers/amplc_dio200.c
staging: comedi_pci: make comedi_pci_disable() safe to call
[karo-tx-linux.git] / drivers / staging / comedi / drivers / amplc_dio200.c
index 5f309ba88a1afa0a0ae4130902f76c868bd43f3b..d13a6dddcd09165bd2cdeb6287727d1a2d0b6362 100644 (file)
  * order they appear in the channel list.
  */
 
+#include <linux/pci.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
 
@@ -1104,10 +1105,9 @@ dio200_subdev_intr_init(struct comedi_device *dev, struct comedi_subdevice *s,
        struct dio200_subdev_intr *subpriv;
 
        subpriv = kzalloc(sizeof(*subpriv), GFP_KERNEL);
-       if (!subpriv) {
-               dev_err(dev->class_dev, "error! out of memory!\n");
+       if (!subpriv)
                return -ENOMEM;
-       }
+
        subpriv->ofs = offset;
        subpriv->valid_isns = valid_isns;
        spin_lock_init(&subpriv->spinlock);
@@ -1443,10 +1443,8 @@ dio200_subdev_8254_init(struct comedi_device *dev, struct comedi_subdevice *s,
        unsigned int chan;
 
        subpriv = kzalloc(sizeof(*subpriv), GFP_KERNEL);
-       if (!subpriv) {
-               dev_err(dev->class_dev, "error! out of memory!\n");
+       if (!subpriv)
                return -ENOMEM;
-       }
 
        s->private = subpriv;
        s->type = COMEDI_SUBD_COUNTER;
@@ -1977,8 +1975,7 @@ static int dio200_auto_attach(struct comedi_device *dev,
                devpriv->io.u.iobase = (unsigned long)base;
                devpriv->io.regtype = io_regtype;
        }
-       switch (thisboard->model)
-       {
+       switch (thisboard->model) {
        case pcie215_model:
        case pcie236_model:
        case pcie296_model:
@@ -2032,14 +2029,9 @@ static void dio200_detach(struct comedi_device *dev)
                        release_region(devpriv->io.u.iobase,
                                       thisboard->mainsize);
        } else if (is_pci_board(thisboard)) {
-               struct pci_dev *pcidev = comedi_to_pci_dev(dev);
-               if (pcidev) {
-                       if (devpriv->io.regtype != no_regtype) {
-                               if (devpriv->io.regtype == mmio_regtype)
-                                       iounmap(devpriv->io.u.membase);
-                               comedi_pci_disable(pcidev);
-                       }
-               }
+               if (devpriv->io.regtype == mmio_regtype)
+                       iounmap(devpriv->io.u.membase);
+               comedi_pci_disable(dev);
        }
 }
 
@@ -2073,22 +2065,17 @@ static DEFINE_PCI_DEVICE_TABLE(dio200_pci_table) = {
 MODULE_DEVICE_TABLE(pci, dio200_pci_table);
 
 static int amplc_dio200_pci_probe(struct pci_dev *dev,
-                                                  const struct pci_device_id
-                                                  *ent)
-{
-       return comedi_pci_auto_config(dev, &amplc_dio200_driver);
-}
-
-static void amplc_dio200_pci_remove(struct pci_dev *dev)
+                                 const struct pci_device_id *id)
 {
-       comedi_pci_auto_unconfig(dev);
+       return comedi_pci_auto_config(dev, &amplc_dio200_driver,
+                                     id->driver_data);
 }
 
 static struct pci_driver amplc_dio200_pci_driver = {
        .name = DIO200_DRIVER_NAME,
        .id_table = dio200_pci_table,
        .probe = &amplc_dio200_pci_probe,
-       .remove = &amplc_dio200_pci_remove
+       .remove         = comedi_pci_auto_unconfig,
 };
 module_comedi_pci_driver(amplc_dio200_driver, amplc_dio200_pci_driver);
 #else