Skip to content
Snippets Groups Projects
Commit 20af3c0a authored by Simon Glass's avatar Simon Glass
Browse files

dm: core: Call uclass post_bind() after the driver's bind() method


At present the uclass's post_bind() method is called before the driver's
bind() method. This means that the uclass cannot use any of the information
set up by the driver. Move it later in the sequence to permit this.

This is an ordering change which is always fairly major in nature. The main
impact is that devices which have children will not see them appear in their
bind() method. From what I can see, existing drivers do not look at their
children in the bind() method, so this should be safe.

Conceptually this change seems to result in a 'more correct' ordering, since
the uclass (which is broader than the device) gets the last word.

Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Reviewed-by: default avatarTom Rini <trini@konsulko.com>
parent 72b335e9
No related branches found
No related tags found
No related merge requests found
...@@ -135,6 +135,11 @@ int device_bind(struct udevice *parent, const struct driver *drv, ...@@ -135,6 +135,11 @@ int device_bind(struct udevice *parent, const struct driver *drv,
if (ret) if (ret)
goto fail_child_post_bind; goto fail_child_post_bind;
} }
if (uc->uc_drv->post_bind) {
ret = uc->uc_drv->post_bind(dev);
if (ret)
goto fail_uclass_post_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);
...@@ -145,6 +150,8 @@ int device_bind(struct udevice *parent, const struct driver *drv, ...@@ -145,6 +150,8 @@ int device_bind(struct udevice *parent, const struct driver *drv,
return 0; return 0;
fail_uclass_post_bind:
/* There is no child unbind() method, so no clean-up required */
fail_child_post_bind: fail_child_post_bind:
if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) { if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
if (drv->unbind && drv->unbind(dev)) { if (drv->unbind && drv->unbind(dev)) {
......
...@@ -430,11 +430,6 @@ int uclass_bind_device(struct udevice *dev) ...@@ -430,11 +430,6 @@ int uclass_bind_device(struct udevice *dev)
goto err; goto err;
} }
} }
if (uc->uc_drv->post_bind) {
ret = uc->uc_drv->post_bind(dev);
if (ret)
goto err;
}
return 0; return 0;
err: err:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment