dm: core: Tidy up error handling in device_bind()
authorSimon Glass <sjg@chromium.org>
Sun, 25 Jan 2015 15:26:59 +0000 (08:26 -0700)
committerSimon Glass <sjg@chromium.org>
Fri, 30 Jan 2015 00:09:54 +0000 (17:09 -0700)
Make the error handling more standard to make it easier to build on top of
it. Also correct a bug in the error path where there is no parent.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
drivers/core/device.c

index 963b16f26f0dc015a7f676891e0d845b42ec6594..eca8edac26a597bd23f25d13c20ac3b1d4624ae4 100644 (file)
@@ -81,18 +81,13 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
 
        ret = uclass_bind_device(dev);
        if (ret)
-               goto fail_bind;
+               goto fail_uclass_bind;
 
        /* if we fail to bind we remove device from successors and free it */
        if (drv->bind) {
                ret = drv->bind(dev);
-               if (ret) {
-                       if (uclass_unbind_device(dev)) {
-                               dm_warn("Failed to unbind dev '%s' on error path\n",
-                                       dev->name);
-                       }
+               if (ret)
                        goto fail_bind;
-               }
        }
        if (parent)
                dm_dbg("Bound device %s to %s\n", dev->name, parent->name);
@@ -101,8 +96,15 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
        return 0;
 
 fail_bind:
-       list_del(&dev->sibling_node);
+       if (uclass_unbind_device(dev)) {
+               dm_warn("Failed to unbind dev '%s' on error path\n",
+                       dev->name);
+       }
+fail_uclass_bind:
+       if (parent)
+               list_del(&dev->sibling_node);
        free(dev);
+
        return ret;
 }