|
@@ -252,6 +252,7 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
|
|
|
{
|
|
|
struct driver *drv;
|
|
|
uint platdata_size = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
drv = lists_driver_lookup_name(info->name);
|
|
|
if (!drv)
|
|
@@ -262,9 +263,16 @@ int device_bind_by_name(struct udevice *parent, bool pre_reloc_only,
|
|
|
#if CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
|
platdata_size = info->platdata_size;
|
|
|
#endif
|
|
|
- return device_bind_common(parent, drv, info->name,
|
|
|
- (void *)info->platdata, 0, ofnode_null(), platdata_size,
|
|
|
- devp);
|
|
|
+ ret = device_bind_common(parent, drv, info->name,
|
|
|
+ (void *)info->platdata, 0, ofnode_null(),
|
|
|
+ platdata_size, devp);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
|
+ info->dev = *devp;
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void *alloc_priv(int size, uint flags)
|
|
@@ -729,6 +737,18 @@ int device_get_global_by_ofnode(ofnode ofnode, struct udevice **devp)
|
|
|
return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
|
|
|
}
|
|
|
|
|
|
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
|
+int device_get_by_driver_info(const struct driver_info *info,
|
|
|
+ struct udevice **devp)
|
|
|
+{
|
|
|
+ struct udevice *dev;
|
|
|
+
|
|
|
+ dev = info->dev;
|
|
|
+
|
|
|
+ return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
int device_find_first_child(const struct udevice *parent, struct udevice **devp)
|
|
|
{
|
|
|
if (list_empty(&parent->child_head)) {
|