staging: comedi: refactor comedi_device_attach() a bit
authorIan Abbott <abbotti@mev.co.uk>
Fri, 30 Mar 2012 16:15:00 +0000 (17:15 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Apr 2012 18:21:11 +0000 (11:21 -0700)
Split the post-config part of comedi_device_attach() into new function
comedi_device_postconfig() and rearrange the rest of the function a bit.

The new comedi_device_postconfig() function will be called by some new
bus-type-specific auto-attach functions.

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

index feb33f86023b0514564fcc3dc817243debf92369..cfb6fe94f78267a1324f88cb602fccbef0c2b301 100644 (file)
@@ -106,6 +106,26 @@ void comedi_device_detach(struct comedi_device *dev)
        __comedi_device_detach(dev);
 }
 
+/* do a little post-config cleanup */
+/* called with module refcount incremented, decrements it */
+static int comedi_device_postconfig(struct comedi_device *dev)
+{
+       int ret = postconfig(dev);
+       module_put(dev->driver->module);
+       if (ret < 0) {
+               __comedi_device_detach(dev);
+               return ret;
+       }
+       if (!dev->board_name) {
+               printk(KERN_WARNING "BUG: dev->board_name=<%p>\n",
+                      dev->board_name);
+               dev->board_name = "BUG";
+       }
+       smp_wmb();
+       dev->attached = 1;
+       return 0;
+}
+
 int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 {
        struct comedi_driver *driv;
@@ -121,59 +141,36 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                }
                if (driv->num_names) {
                        dev->board_ptr = comedi_recognize(driv, it->board_name);
-                       if (dev->board_ptr == NULL) {
-                               module_put(driv->module);
-                               continue;
-                       }
-               } else {
-                       if (strcmp(driv->driver_name, it->board_name)) {
-                               module_put(driv->module);
+                       if (dev->board_ptr)
+                               break;
+               } else if (strcmp(driv->driver_name, it->board_name))
+                       break;
+               module_put(driv->module);
+       }
+       if (driv == NULL) {
+               /*  recognize has failed if we get here */
+               /*  report valid board names before returning error */
+               for (driv = comedi_drivers; driv; driv = driv->next) {
+                       if (!try_module_get(driv->module)) {
+                               printk(KERN_INFO
+                                      "comedi: failed to increment module count\n");
                                continue;
                        }
+                       comedi_report_boards(driv);
+                       module_put(driv->module);
                }
-               /* initialize dev->driver here so
-                * comedi_error() can be called from attach */
-               dev->driver = driv;
-               ret = driv->attach(dev, it);
-               if (ret < 0) {
-                       module_put(dev->driver->module);
-                       __comedi_device_detach(dev);
-                       return ret;
-               }
-               goto attached;
+               return -EIO;
        }
-
-       /*  recognize has failed if we get here */
-       /*  report valid board names before returning error */
-       for (driv = comedi_drivers; driv; driv = driv->next) {
-               if (!try_module_get(driv->module)) {
-                       printk(KERN_INFO
-                              "comedi: failed to increment module count\n");
-                       continue;
-               }
-               comedi_report_boards(driv);
-               module_put(driv->module);
-       }
-       return -EIO;
-
-attached:
-       /* do a little post-config cleanup */
-       ret = postconfig(dev);
-       module_put(dev->driver->module);
+       /* initialize dev->driver here so
+        * comedi_error() can be called from attach */
+       dev->driver = driv;
+       ret = driv->attach(dev, it);
        if (ret < 0) {
+               module_put(dev->driver->module);
                __comedi_device_detach(dev);
                return ret;
        }
-
-       if (!dev->board_name) {
-               printk(KERN_WARNING "BUG: dev->board_name=<%p>\n",
-                      dev->board_name);
-               dev->board_name = "BUG";
-       }
-       smp_wmb();
-       dev->attached = 1;
-
-       return 0;
+       return comedi_device_postconfig(dev);
 }
 
 int comedi_driver_register(struct comedi_driver *driver)