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

staging: comedi: rtd520: factor out the "find pci device" code



Factor the "find pci device" code out of the attach function.

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9e81c876
Loading
Loading
Loading
Loading
+40 −34
Original line number Diff line number Diff line
@@ -1605,12 +1605,47 @@ static int rtd_dio_insn_config(struct comedi_device *dev,
	return 1;
}

static struct pci_dev *rtd_find_pci(struct comedi_device *dev,
				    struct comedi_devconfig *it)
{
	struct pci_dev *pcidev;

	for (pcidev = pci_get_device(PCI_VENDOR_ID_RTD, PCI_ANY_ID, NULL);
	     pcidev != NULL;
	     pcidev = pci_get_device(PCI_VENDOR_ID_RTD, PCI_ANY_ID, pcidev)) {
		int i;

		if (it->options[0] || it->options[1]) {
			if (pcidev->bus->number != it->options[0]
			    || PCI_SLOT(pcidev->devfn) != it->options[1]) {
				continue;
			}
		}
		for (i = 0; i < ARRAY_SIZE(rtd520Boards); ++i) {
			if (pcidev->device == rtd520Boards[i].device_id) {
				dev->board_ptr = &rtd520Boards[i];
				break;
			}
		}
		if (dev->board_ptr)
			return pcidev;	/* found one */
	}
	if (!pcidev) {
		if (it->options[0] && it->options[1]) {
			printk(KERN_INFO "No RTD card at bus=%d slot=%d.\n",
			       it->options[0], it->options[1]);
		} else {
			printk(KERN_INFO "No RTD card found.\n");
		}
	}
	return NULL;
}

static int rtd_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{				/* board name and options flags */
	const struct rtdBoard *thisboard;
	struct rtdPrivate *devpriv;
	struct comedi_subdevice *s;
	struct pci_dev *pcidev;
	int ret;
	resource_size_t physLas0;	/* configuration */
	resource_size_t physLas1;	/* data area */
@@ -1635,43 +1670,14 @@ static int rtd_attach(struct comedi_device *dev, struct comedi_devconfig *it)
		return -ENOMEM;
	devpriv = dev->private;

	/*
	 * Probe the device to determine what device in the series it is.
	 */
	for (pcidev = pci_get_device(PCI_VENDOR_ID_RTD, PCI_ANY_ID, NULL);
	     pcidev != NULL;
	     pcidev = pci_get_device(PCI_VENDOR_ID_RTD, PCI_ANY_ID, pcidev)) {
		int i;

		if (it->options[0] || it->options[1]) {
			if (pcidev->bus->number != it->options[0]
			    || PCI_SLOT(pcidev->devfn) != it->options[1]) {
				continue;
			}
		}
		for (i = 0; i < ARRAY_SIZE(rtd520Boards); ++i) {
			if (pcidev->device == rtd520Boards[i].device_id) {
				dev->board_ptr = &rtd520Boards[i];
				break;
			}
		}
		if (dev->board_ptr)
			break;	/* found one */
	}
	if (!pcidev) {
		if (it->options[0] && it->options[1]) {
			printk(KERN_INFO "No RTD card at bus=%d slot=%d.\n",
			       it->options[0], it->options[1]);
		} else {
			printk(KERN_INFO "No RTD card found.\n");
		}
	devpriv->pci_dev = rtd_find_pci(dev, it);
	if (!devpriv->pci_dev)
		return -EIO;
	}
	devpriv->pci_dev = pcidev;
	thisboard = comedi_board(dev);

	dev->board_name = thisboard->name;

	ret = comedi_pci_enable(pcidev, DRV_NAME);
	ret = comedi_pci_enable(devpriv->pci_dev, DRV_NAME);
	if (ret < 0) {
		printk(KERN_INFO "Failed to enable PCI device and request regions.\n");
		return ret;