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>
This commit is contained in:
parent
2f3b95dbc7
commit
72ebfe86fa
|
@ -81,19 +81,14 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
|
||||||
|
|
||||||
ret = uclass_bind_device(dev);
|
ret = uclass_bind_device(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail_bind;
|
goto fail_uclass_bind;
|
||||||
|
|
||||||
/* if we fail to bind we remove device from successors and free it */
|
/* if we fail to bind we remove device from successors and free it */
|
||||||
if (drv->bind) {
|
if (drv->bind) {
|
||||||
ret = drv->bind(dev);
|
ret = drv->bind(dev);
|
||||||
if (ret) {
|
if (ret)
|
||||||
if (uclass_unbind_device(dev)) {
|
|
||||||
dm_warn("Failed to unbind dev '%s' on error path\n",
|
|
||||||
dev->name);
|
|
||||||
}
|
|
||||||
goto fail_bind;
|
goto fail_bind;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (parent)
|
if (parent)
|
||||||
dm_dbg("Bound device %s to %s\n", dev->name, parent->name);
|
dm_dbg("Bound device %s to %s\n", dev->name, parent->name);
|
||||||
*devp = dev;
|
*devp = dev;
|
||||||
|
@ -101,8 +96,15 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail_bind:
|
fail_bind:
|
||||||
|
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);
|
list_del(&dev->sibling_node);
|
||||||
free(dev);
|
free(dev);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue