aboutsummaryrefslogtreecommitdiff
path: root/drivers/core
diff options
context:
space:
mode:
authorWalter Lozano <walter.lozano@collabora.com>2020-06-25 01:10:11 -0300
committerSimon Glass <sjg@chromium.org>2020-07-09 22:00:29 -0600
commitfed0f891c6821d475710e1f7033253ec4723ee09 (patch)
tree4092eed255409590eac22d1e633f6fa616a1fc05 /drivers/core
parent908d0243ac0bdf2672ec584a52d178100fff3fb2 (diff)
downloadu-boot-fed0f891c6821d475710e1f7033253ec4723ee09.zip
u-boot-fed0f891c6821d475710e1f7033253ec4723ee09.tar.gz
u-boot-fed0f891c6821d475710e1f7033253ec4723ee09.tar.bz2
core: extend struct driver_info to point to device
Currently when creating an U_BOOT_DEVICE entry a struct driver_info is declared, which contains the data needed to instantiate the device. However, the actual device is created at runtime and there is no proper way to get the device based on its struct driver_info. This patch extends struct driver_info adding a pointer to udevice which is populated during the bind process, allowing to generate a set of functions to get the device based on its struct driver_info. Signed-off-by: Walter Lozano <walter.lozano@collabora.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/core')
-rw-r--r--drivers/core/device.c26
-rw-r--r--drivers/core/root.c4
2 files changed, 27 insertions, 3 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 2d6c667..476133f 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -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)) {
diff --git a/drivers/core/root.c b/drivers/core/root.c
index 23a65cd..0de5d7c 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -347,6 +347,10 @@ int dm_init_and_scan(bool pre_reloc_only)
{
int ret;
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+ dm_populate_phandle_data();
+#endif
+
ret = dm_init(IS_ENABLED(CONFIG_OF_LIVE));
if (ret) {
debug("dm_init() failed: %d\n", ret);