diff options
author | Simon Glass | 2015-01-25 08:26:59 -0700 |
---|---|---|
committer | Simon Glass | 2015-01-29 17:09:54 -0700 |
commit | 72ebfe86fac2ca0a0e1af9fe1eaa3a634e3e17a1 (patch) | |
tree | c3c07cbe4b7a6b266d59ad118751a821b0a7cc05 | |
parent | 2f3b95dbc78ce96b0f9f471e688db66223988419 (diff) |
dm: core: Tidy up error handling in device_bind()
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>
-rw-r--r-- | drivers/core/device.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c index 963b16f26f0..eca8edac26a 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -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; } |