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 <[email protected]>
Cc: Frank Mori Hess <[email protected]>
---
 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
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to