rockchip: use dummy byte only enable OF_PLATDATA
[oweals/u-boot.git] / drivers / core / root.c
index 13c2713e615391e7ce2fb4194718d6b83f2fdabb..33dc9c0b2db5acd8b2a7c1bd4be1b762eab70e48 100644 (file)
@@ -122,6 +122,20 @@ void fix_uclass(void)
                        entry->ops += gd->reloc_off;
        }
 }
+
+void fix_devices(void)
+{
+       struct driver_info *dev =
+               ll_entry_start(struct driver_info, driver_info);
+       const int n_ents = ll_entry_count(struct driver_info, driver_info);
+       struct driver_info *entry;
+
+       for (entry = dev; entry != dev + n_ents; entry++) {
+               if (entry->platdata)
+                       entry->platdata += gd->reloc_off;
+       }
+}
+
 #endif
 
 int dm_init(void)
@@ -137,6 +151,7 @@ int dm_init(void)
 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
        fix_drivers();
        fix_uclass();
+       fix_devices();
 #endif
 
        ret = device_bind_by_name(NULL, false, &root_info, &DM_ROOT_NON_CONST);
@@ -173,7 +188,7 @@ int dm_scan_platdata(bool pre_reloc_only)
        return ret;
 }
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 int dm_scan_fdt_node(struct udevice *parent, const void *blob, int offset,
                     bool pre_reloc_only)
 {
@@ -203,6 +218,15 @@ int dm_scan_fdt_node(struct udevice *parent, const void *blob, int offset,
        return ret;
 }
 
+int dm_scan_fdt_dev(struct udevice *dev)
+{
+       if (dev->of_offset == -1)
+               return 0;
+
+       return dm_scan_fdt_node(dev, gd->fdt_blob, dev->of_offset,
+                               gd->flags & GD_FLG_RELOC ? false : true);
+}
+
 int dm_scan_fdt(const void *blob, bool pre_reloc_only)
 {
        return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
@@ -229,7 +253,7 @@ int dm_init_and_scan(bool pre_reloc_only)
                return ret;
        }
 
-       if (CONFIG_IS_ENABLED(OF_CONTROL)) {
+       if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
                ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
                if (ret) {
                        debug("dm_scan_fdt() failed: %d\n", ret);