staging: comedi: adl_pci9118: factor out the find PCI device code
authorH Hartley Sweeten <hartleys@visionengravers.com>
Wed, 23 May 2012 23:34:58 +0000 (16:34 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 5 Jun 2012 03:38:08 +0000 (20:38 -0700)
Factor out the code that finds a matching PCI device from attach
function.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Cc: Mori Hess <fmhess@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/adl_pci9118.c

index aa4244e..f2135bf 100644 (file)
@@ -2110,6 +2110,44 @@ static int pci9118_reset(struct comedi_device *dev)
        return 0;
 }
 
+static struct pci_dev *pci9118_find_pci(struct comedi_device *dev,
+                                       struct comedi_devconfig *it)
+{
+       struct pci_dev *pcidev = NULL;
+       int bus = it->options[0];
+       int slot = it->options[1];
+
+       for_each_pci_dev(pcidev) {
+               if (pcidev->vendor != PCI_VENDOR_ID_AMCC)
+                       continue;
+               if (pcidev->device != this_board->device_id)
+                       continue;
+               if (bus || slot) {
+                       /* requested particular bus/slot */
+                       if (pcidev->bus->number != bus ||
+                           PCI_SLOT(pcidev->devfn) != slot)
+                               continue;
+               }
+               /*
+                * Look for device that isn't in use.
+                * Enable PCI device and request regions.
+                */
+               if (comedi_pci_enable(pcidev, "adl_pci9118"))
+                       continue;
+               printk(KERN_ERR ", b:s:f=%d:%d:%d, io=0x%4lx, 0x%4lx",
+                       pcidev->bus->number,
+                       PCI_SLOT(pcidev->devfn),
+                       PCI_FUNC(pcidev->devfn),
+                       (unsigned long)pci_resource_start(pcidev, 2),
+                       (unsigned long)pci_resource_start(pcidev, 0));
+               return pcidev;
+       }
+       printk(KERN_ERR
+               "comedi%d: no supported board found! (req. bus/slot : %d/%d)\n",
+               dev->minor, bus, slot);
+       return NULL;
+}
+
 static int pci9118_attach(struct comedi_device *dev,
                          struct comedi_devconfig *it)
 {
@@ -2117,17 +2155,10 @@ static int pci9118_attach(struct comedi_device *dev,
        int ret, pages, i;
        unsigned short master;
        unsigned int irq;
-       unsigned long iobase_a, iobase_9;
-       struct pci_dev *pcidev;
-       int opt_bus, opt_slot;
-       const char *errstr;
-       unsigned char pci_bus, pci_slot, pci_func;
        u16 u16w;
 
        printk("comedi%d: adl_pci9118: board=%s", dev->minor, this_board->name);
 
-       opt_bus = it->options[0];
-       opt_slot = it->options[1];
        if (it->options[3] & 1)
                master = 0;     /* user don't want use bus master */
        else
@@ -2139,61 +2170,19 @@ static int pci9118_attach(struct comedi_device *dev,
                return -ENOMEM;
        }
 
-       /* Look for matching PCI device */
-       errstr = "not found!";
-       pcidev = NULL;
-       while (NULL != (pcidev = pci_get_device(PCI_VENDOR_ID_AMCC,
-                                               this_board->device_id,
-                                               pcidev))) {
-               /* Found matching vendor/device. */
-               if (opt_bus || opt_slot) {
-                       /* Check bus/slot. */
-                       if (opt_bus != pcidev->bus->number
-                           || opt_slot != PCI_SLOT(pcidev->devfn))
-                               continue;       /* no match */
-               }
-               /*
-                * Look for device that isn't in use.
-                * Enable PCI device and request regions.
-                */
-               if (comedi_pci_enable(pcidev, "adl_pci9118")) {
-                       errstr =
-                           "failed to enable PCI device and request regions!";
-                       continue;
-               }
-               break;
-       }
-
-       if (!pcidev) {
-               if (opt_bus || opt_slot) {
-                       printk(KERN_ERR " - Card at b:s %d:%d %s\n",
-                              opt_bus, opt_slot, errstr);
-               } else {
-                       printk(KERN_ERR " - Card %s\n", errstr);
-               }
+       devpriv->pcidev = pci9118_find_pci(dev, it);
+       if (!devpriv->pcidev)
                return -EIO;
-       }
 
        if (master)
-               pci_set_master(pcidev);
+               pci_set_master(devpriv->pcidev);
 
+       irq = devpriv->pcidev->irq;
+       devpriv->iobase_a = pci_resource_start(devpriv->pcidev, 0);
+       dev->iobase = pci_resource_start(devpriv->pcidev, 2);
 
-       pci_bus = pcidev->bus->number;
-       pci_slot = PCI_SLOT(pcidev->devfn);
-       pci_func = PCI_FUNC(pcidev->devfn);
-       irq = pcidev->irq;
-       iobase_a = pci_resource_start(pcidev, 0);
-       iobase_9 = pci_resource_start(pcidev, 2);
-
-       printk(KERN_ERR ", b:s:f=%d:%d:%d, io=0x%4lx, 0x%4lx", pci_bus,
-                               pci_slot, pci_func, iobase_9, iobase_a);
-
-       dev->iobase = iobase_9;
        dev->board_name = this_board->name;
 
-       devpriv->pcidev = pcidev;
-       devpriv->iobase_a = iobase_a;
-
        pci9118_reset(dev);
 
        if (it->options[3] & 2)