summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2016-01-05 16:30:59 (GMT)
committerSimon Glass <sjg@chromium.org>2016-01-21 02:06:22 (GMT)
commit20af3c0a0034b885cd269cb7abdc2d933d82a723 (patch)
tree336a18d741ee1b2486c1e34837fffe157ce8ed7f /drivers
parent72b335e91d41ff5dfecdea57d3397f368bb488f5 (diff)
downloadu-boot-20af3c0a0034b885cd269cb7abdc2d933d82a723.tar.xz
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: Simon Glass <sjg@chromium.org> Reviewed-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/core/device.c7
-rw-r--r--drivers/core/uclass.c5
2 files changed, 7 insertions, 5 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 818d03f..1e5584a 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -135,6 +135,11 @@ int device_bind(struct udevice *parent, const struct driver *drv,
if (ret)
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)
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,
return 0;
+fail_uclass_post_bind:
+ /* There is no child unbind() method, so no clean-up required */
fail_child_post_bind:
if (CONFIG_IS_ENABLED(DM_DEVICE_REMOVE)) {
if (drv->unbind && drv->unbind(dev)) {
diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c
index 36bcf19..e1acefe 100644
--- a/drivers/core/uclass.c
+++ b/drivers/core/uclass.c
@@ -430,11 +430,6 @@ int uclass_bind_device(struct udevice *dev)
goto err;
}
}
- if (uc->uc_drv->post_bind) {
- ret = uc->uc_drv->post_bind(dev);
- if (ret)
- goto err;
- }
return 0;
err: