aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass2015-01-25 08:26:59 -0700
committerSimon Glass2015-01-29 17:09:54 -0700
commit72ebfe86fac2ca0a0e1af9fe1eaa3a634e3e17a1 (patch)
treec3c07cbe4b7a6b266d59ad118751a821b0a7cc05
parent2f3b95dbc78ce96b0f9f471e688db66223988419 (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.c18
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;
}