The old method of supporting auto-attachment of comedi PCI devices via the struct comedi_driver's `attach()` method is no longer supported. The struct comedi_driver needs to support an `auto_attach()` method to do this. Also, there is no need for this driver to support manual attachment of devices, so just replace the `attach()` method with an `auto_attach()` method implemented by `adv_pci1724_auto_attach()`. As only a single PCI device is supported and `adv_pci1724_boards[]` does not contain any useful information, just get rid of it. Get rid of the `struct pci_dev *hw_dev` member of `struct adv_pci1724_private` and use `comedi_to_pci_dev(dev)` to get a pointer to the PCI device from the comedi device. (The comedi core makes that useable before it calls the comedi driver's `auto_attach()` method.) Also rename the `detach()` function to `adv_pci1724_detach()`. It no longer needs to "put" the PCI device as the PCI device's reference count is not incremented by `adv_pci1724_auto_attach()`. Signed-off-by: Ian Abbott <abbotti@xxxxxxxxx> Cc: Frank Mori Hess <fmh6jj@xxxxxxxxx> --- drivers/staging/comedi/drivers/adv_pci1724.c | 109 +++++++-------------------- 1 file changed, 26 insertions(+), 83 deletions(-) diff --git a/drivers/staging/comedi/drivers/adv_pci1724.c b/drivers/staging/comedi/drivers/adv_pci1724.c index 7ba8d5e..e9796f2 100644 --- a/drivers/staging/comedi/drivers/adv_pci1724.c +++ b/drivers/staging/comedi/drivers/adv_pci1724.c @@ -50,8 +50,10 @@ of adjusting the offset and gain calibration until the board outputs in the desired range. Configuration options: - [0] - PCI bus of device (optional) - [1] - PCI slot of device (optional) + None + +Manual configuration of comedi devices is not supported by this driver; +supported PCI devices are configured as comedi devices automatically. */ @@ -118,11 +120,6 @@ enum board_id_contents { BOARD_ID_MASK = 0xf }; -struct adv_pci1724_board { - const char *name; - int device_id; /* pci device id */ -}; - static const struct comedi_lrange ao_ranges_1724 = { 4, { BIP_RANGE(10), @@ -132,13 +129,6 @@ static const struct comedi_lrange ao_ranges_1724 = { 4, } }; -static const struct adv_pci1724_board adv_pci1724_boards[] = { - { - .name = "pci-1724u", - .device_id = 0x1724, - } -}; - static DEFINE_PCI_DEVICE_TABLE(adv_pci1724_pci_table) = { { PCI_DEVICE(PCI_VENDOR_ID_ADVANTECH, 0x1724) }, { 0 } @@ -146,15 +136,8 @@ static DEFINE_PCI_DEVICE_TABLE(adv_pci1724_pci_table) = { MODULE_DEVICE_TABLE(pci, adv_pci1724_pci_table); -static inline struct adv_pci1724_board *board(const struct comedi_device *dev) -{ - return (struct adv_pci1724_board *)dev->board_ptr; -} - /* this structure is for data unique to this hardware driver. */ struct adv_pci1724_private { - - struct pci_dev *hw_dev; resource_size_t main_iobase; unsigned board_id; /* 4 bit number settable via dip switches on board */ int ao_value[NUM_AO_CHANNELS]; @@ -170,13 +153,14 @@ static inline struct adv_pci1724_private *priv(struct comedi_device *dev) return dev->private; } -static int attach(struct comedi_device *dev, struct comedi_devconfig *it); -static void detach(struct comedi_device *dev); +static int adv_pci1724_auto_attach(struct comedi_device *dev, + unsigned long context_unused); +static void adv_pci1724_detach(struct comedi_device *dev); static struct comedi_driver driver_adv_pci1724 = { .driver_name = "adv_pci1724", .module = THIS_MODULE, - .attach = attach, - .detach = detach, + .auto_attach = adv_pci1724_auto_attach, + .detach = adv_pci1724_detach, }; static int ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, @@ -278,17 +262,13 @@ static int setup_subdevices(struct comedi_device *dev) return 0; } -static int attach(struct comedi_device *dev, struct comedi_devconfig *it) +static int adv_pci1724_auto_attach(struct comedi_device *dev, + unsigned long context_unused) { - struct pci_dev *pcidev = NULL; + struct pci_dev *pcidev = comedi_to_pci_dev(dev); int i; int retval; - pr_info("comedi%d: adv_pci1724\n", dev->minor); - - /* - * Allocate the private structure area. - */ dev->private = kzalloc(sizeof(struct adv_pci1724_private), GFP_KERNEL); if (!dev->private) return -ENOMEM; @@ -300,73 +280,36 @@ static int attach(struct comedi_device *dev, struct comedi_devconfig *it) priv(dev)->gain_value[i] = -1; } - /* - * Probe the device to determine what device in the series it is. - */ - for_each_pci_dev(pcidev) { - /* is it not a computer boards card? */ - if (pcidev->vendor != PCI_VENDOR_ID_ADVANTECH) - continue; - /* loop through cards supported by this driver */ - for (i = 0; i < ARRAY_SIZE(adv_pci1724_boards); ++i) { - if (adv_pci1724_boards[i].device_id != pcidev->device) - continue; - /* was a particular bus/slot requested? */ - if (it->options[0] || it->options[1]) { - /* are we on the wrong bus/slot? */ - if (pcidev->bus->number != it->options[0] || - PCI_SLOT(pcidev->devfn) != it->options[1]) { - continue; - } - } - priv(dev)->hw_dev = pcidev; - dev->board_ptr = adv_pci1724_boards + i; - break; - } - if (dev->board_ptr) - break; - } - - if (dev->board_ptr == NULL) { - pr_info("No supported Advantech 1724 card found\n"); - return -EIO; - } - - pr_info("Found %s on bus %i, slot %i\n", board(dev)->name, - pcidev->bus->number, PCI_SLOT(pcidev->devfn)); + dev->board_name = dev->driver->driver_name; - if (comedi_pci_enable(pcidev, driver_adv_pci1724.driver_name)) { - pr_warn(" failed to enable PCI device and request regions\n"); - return -EIO; - } - - /* Initialize dev->board_name */ - dev->board_name = board(dev)->name; + retval = comedi_pci_enable(pcidev, dev->board_name); + if (retval) + return retval; - priv(dev)->main_iobase = - pci_resource_start(pcidev, 2); + priv(dev)->main_iobase = pci_resource_start(pcidev, 2); priv(dev)->board_id = inl(priv(dev)->main_iobase + BOARD_ID_REG) & BOARD_ID_MASK; - pr_info("board id: %d\n", priv(dev)->board_id); retval = setup_subdevices(dev); if (retval < 0) return retval; + dev_info(dev->class_dev, "%s (pci %s) attached, board id: %u\n", + dev->board_name, pci_name(pcidev), priv(dev)->board_id); return 0; } -static void detach(struct comedi_device *dev) +static void adv_pci1724_detach(struct comedi_device *dev) { - pr_info("comedi%d: adv_pci1724: remove\n", dev->minor); + struct pci_dev *pcidev = comedi_to_pci_dev(dev); if (priv(dev)) { - if (priv(dev)->hw_dev) { - if (priv(dev)->main_iobase) - comedi_pci_disable(priv(dev)->hw_dev); - - pci_dev_put(priv(dev)->hw_dev); + if (pcidev) { + if (priv(dev)->main_iobase) { + comedi_pci_disable(pcidev); + dev_info(dev->class_dev, "detached\n"); + } } } } -- 1.8.1.2 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel