staging: comedi: make attach handler optional
authorIan Abbott <abbotti@mev.co.uk>
Wed, 15 Aug 2012 14:02:45 +0000 (15:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Aug 2012 22:30:56 +0000 (15:30 -0700)
Some low-level Comedi drivers no longer support manual configuration of
devices with the COMEDI_DEVCONFIG ioctl (used by the comedi_config
program).  For those drivers, the 'attach_pci' or 'attach_usb' handler
will be set in the struct comedi_driver to configure devices
automatically (via comedi_pci_auto_config() or
comedi_usb_auto_config()).  Their 'attach' handlers are redundant but
the the comedi core module currently requires it to be set.

Make the 'attach' handler optional and issue a warning if something
wants to call it.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers.c

index c0fdb00783edbf8583e1e0e0a7f5ab32dbf56dda..c8adc5e009c8909cbfaced6486bde0762b8fde6b 100644 (file)
@@ -186,6 +186,14 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                }
                return -EIO;
        }
+       if (driv->attach == NULL) {
+               /* driver does not support manual configuration */
+               dev_warn(dev->class_dev,
+                        "driver '%s' does not support attach using comedi_config\n",
+                        driv->driver_name);
+               module_put(driv->module);
+               return -ENOSYS;
+       }
        /* initialize dev->driver here so
         * comedi_error() can be called from attach */
        dev->driver = driv;
@@ -885,13 +893,18 @@ static int comedi_auto_config_wrapper(struct comedi_device *dev, void *context)
                dev->board_ptr = comedi_recognize(driv, it->board_name);
                if (dev->board_ptr == NULL) {
                        printk(KERN_WARNING
-                              "comedi: auto config failed to find board entry"
-                              " '%s' for driver '%s'\n", it->board_name,
-                              driv->driver_name);
+                              "comedi: auto config failed to find board entry '%s' for driver '%s'\n",
+                              it->board_name, driv->driver_name);
                        comedi_report_boards(driv);
                        return -EINVAL;
                }
        }
+       if (!driv->attach) {
+               printk(KERN_WARNING
+                      "comedi: BUG! driver '%s' using old-style auto config but has no attach handler\n",
+                      driv->driver_name);
+               return -EINVAL;
+       }
        return driv->attach(dev, it);
 }