dm: core: Allocate platform data when binding a device
authorSimon Glass <sjg@chromium.org>
Sun, 25 Jan 2015 15:27:00 +0000 (08:27 -0700)
committerSimon Glass <sjg@chromium.org>
Fri, 30 Jan 2015 00:09:54 +0000 (17:09 -0700)
When using allocated platform data, allocate it when we bind the device.
This makes it possible to fill in this information before the device is
probed.

This fits with the platform data model (when not using device tree),
since platform data exists at bind-time.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
drivers/core/device-remove.c
drivers/core/device.c
test/dm/test-fdt.c

index 8fc6b7108427add4a2f8f3a1047eee7e5e440073..2c8257752b6bff035c07207fc0a4e884f05dba27 100644 (file)
@@ -88,6 +88,10 @@ int device_unbind(struct udevice *dev)
        if (ret)
                return ret;
 
+       if (dev->flags & DM_FLAG_ALLOC_PDATA) {
+               free(dev->platdata);
+               dev->platdata = NULL;
+       }
        ret = uclass_unbind_device(dev);
        if (ret)
                return ret;
@@ -111,10 +115,6 @@ void device_free(struct udevice *dev)
                free(dev->priv);
                dev->priv = NULL;
        }
-       if (dev->flags & DM_FLAG_ALLOC_PDATA) {
-               free(dev->platdata);
-               dev->platdata = NULL;
-       }
        size = dev->uclass->uc_drv->per_device_auto_alloc_size;
        if (size) {
                free(dev->uclass_priv);
index eca8edac26a597bd23f25d13c20ac3b1d4624ae4..366cffed89dc83693c3e3a07939fde4d5d318199 100644 (file)
@@ -72,8 +72,14 @@ int device_bind(struct udevice *parent, struct driver *drv, const char *name,
 #else
        dev->req_seq = -1;
 #endif
-       if (!dev->platdata && drv->platdata_auto_alloc_size)
+       if (!dev->platdata && drv->platdata_auto_alloc_size) {
                dev->flags |= DM_FLAG_ALLOC_PDATA;
+               dev->platdata = calloc(1, drv->platdata_auto_alloc_size);
+               if (!dev->platdata) {
+                       ret = -ENOMEM;
+                       goto fail_alloc1;
+               }
+       }
 
        /* put dev into parent's successor list */
        if (parent)
@@ -103,6 +109,11 @@ fail_bind:
 fail_uclass_bind:
        if (parent)
                list_del(&dev->sibling_node);
+       if (dev->flags & DM_FLAG_ALLOC_PDATA) {
+               free(dev->platdata);
+               dev->platdata = NULL;
+       }
+fail_alloc1:
        free(dev);
 
        return ret;
@@ -139,7 +150,7 @@ int device_probe_child(struct udevice *dev, void *parent_priv)
        drv = dev->driver;
        assert(drv);
 
-       /* Allocate private data and platdata if requested */
+       /* Allocate private data if requested */
        if (drv->priv_auto_alloc_size) {
                dev->priv = calloc(1, drv->priv_auto_alloc_size);
                if (!dev->priv) {
@@ -148,13 +159,6 @@ int device_probe_child(struct udevice *dev, void *parent_priv)
                }
        }
        /* Allocate private data if requested */
-       if (dev->flags & DM_FLAG_ALLOC_PDATA) {
-               dev->platdata = calloc(1, drv->platdata_auto_alloc_size);
-               if (!dev->platdata) {
-                       ret = -ENOMEM;
-                       goto fail;
-               }
-       }
        size = dev->uclass->uc_drv->per_device_auto_alloc_size;
        if (size) {
                dev->uclass_priv = calloc(1, size);
index cd2c38995e936246a5b8643f04c91b218d454ff0..dc4ebf9adaf90e4aecc0848c3af9f873d5d8e911 100644 (file)
@@ -143,12 +143,12 @@ static int dm_test_fdt(struct dm_test_state *dms)
        /* These are num_devices compatible root-level device tree nodes */
        ut_asserteq(num_devices, list_count_items(&uc->dev_head));
 
-       /* Each should have no platdata / priv */
+       /* Each should have platform data but no private data */
        for (i = 0; i < num_devices; i++) {
                ret = uclass_find_device(UCLASS_TEST_FDT, i, &dev);
                ut_assert(!ret);
                ut_assert(!dev_get_priv(dev));
-               ut_assert(!dev->platdata);
+               ut_assert(dev->platdata);
        }
 
        ut_assertok(dm_check_devices(dms, num_devices));