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;
                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);
 
 #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)
 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;
        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) {
                }
        }
        /* 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);
 
        /* 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));