dm: core: Call uclass post_bind() after the driver's bind() method
authorSimon Glass <sjg@chromium.org>
Tue, 5 Jan 2016 16:30:59 +0000 (09:30 -0700)
committerSimon Glass <sjg@chromium.org>
Thu, 21 Jan 2016 02:06:22 +0000 (19:06 -0700)
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>
drivers/core/device.c
drivers/core/uclass.c

index 818d03fac15de55a331ed07c4bb6d8a8d31e25df..1e5584a7ce30a9c5c4b2189fce5c5d6563988930 100644 (file)
@@ -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)) {
index 36bcf197aa6fb19411d3a83ba4a29f1108c87fb5..e1acefe7279e443075681a585e41d9c2cc7a7b61 100644 (file)
@@ -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: