dm: Use driver_info index instead of pointer
[platform/kernel/u-boot.git] / drivers / core / device.c
index e90d701..4b3dcb3 100644 (file)
@@ -249,7 +249,7 @@ int device_bind_ofnode(struct udevice *parent, const struct driver *drv,
 }
 
 int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
-                       struct driver_info *info, struct udevice **devp)
+                       const struct driver_info *info, struct udevice **devp)
 {
        struct driver *drv;
        uint platdata_size = 0;
@@ -269,9 +269,6 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
                                 platdata_size, devp);
        if (ret)
                return ret;
-#if CONFIG_IS_ENABLED(OF_PLATDATA)
-       info->dev = *devp;
-#endif
 
        return ret;
 }
@@ -764,9 +761,25 @@ int device_get_global_by_ofnode(ofnode ofnode, struct udevice **devp)
 int device_get_by_driver_info(const struct driver_info *info,
                              struct udevice **devp)
 {
+       struct driver_info *info_base =
+               ll_entry_start(struct driver_info, driver_info);
+       int idx = info - info_base;
+       struct driver_rt *drt = gd_dm_driver_rt() + idx;
        struct udevice *dev;
 
-       dev = info->dev;
+       dev = drt->dev;
+       *devp = NULL;
+
+       return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
+}
+
+int device_get_by_driver_info_idx(uint idx, struct udevice **devp)
+{
+       struct driver_rt *drt = gd_dm_driver_rt() + idx;
+       struct udevice *dev;
+
+       dev = drt->dev;
+       *devp = NULL;
 
        return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
 }