]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
core: extend struct driver_info to point to device
authorWalter Lozano <walter.lozano@collabora.com>
Thu, 25 Jun 2020 04:10:11 +0000 (01:10 -0300)
committerSimon Glass <sjg@chromium.org>
Fri, 10 Jul 2020 04:00:29 +0000 (22:00 -0600)
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>
drivers/core/device.c
drivers/core/root.c
include/dm/device.h
include/dm/platdata.h

index 2d6c667564be67254f38d01804c2706424232fcd..476133f17248ad5e100356e4225f4c44eb72b812 100644 (file)
@@ -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)) {
index 23a65cd71df786693ed15b838933566df88a86c6..0de5d7c70d61749283a5e2f439525697c6d40905 100644 (file)
@@ -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);
index 2cfe10766ff3e1eb9262b940c3a543b33717d295..f5738a0cee97b1953d638524c1a8061aae930045 100644 (file)
@@ -538,6 +538,21 @@ int device_find_global_by_ofnode(ofnode node, struct udevice **devp);
  */
 int device_get_global_by_ofnode(ofnode node, struct udevice **devp);
 
+/**
+ * device_get_by_driver_info() - Get a device based on driver_info
+ *
+ * Locates a device by its struct driver_info, by using its reference which
+ * is updated during the bind process.
+ *
+ * The device is probed to activate it ready for use.
+ *
+ * @info: Struct driver_info
+ * @devp: Returns pointer to device if found, otherwise this is set to NULL
+ * @return 0 if OK, -ve on error
+ */
+int device_get_by_driver_info(const struct driver_info *info,
+                             struct udevice **devp);
+
 /**
  * device_find_first_child() - Find the first child of a device
  *
index c972fa6936f9441d05c196a1115911eeb4a48302..cab93b071babaa13dbc7293eeb6ba21b4bd39075 100644 (file)
  * @name:      Driver name
  * @platdata:  Driver-specific platform data
  * @platdata_size: Size of platform data structure
+ * @dev:       Device created from this structure data
  */
 struct driver_info {
        const char *name;
        const void *platdata;
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
        uint platdata_size;
+       struct udevice *dev;
 #endif
 };
 
@@ -43,4 +45,16 @@ struct driver_info {
 #define U_BOOT_DEVICES(__name)                                         \
        ll_entry_declare_list(struct driver_info, __name, driver_info)
 
+/* Get a pointer to a given driver */
+#define DM_GET_DEVICE(__name)                                          \
+       ll_entry_get(struct driver_info, __name, driver_info)
+
+/**
+ * dm_populate_phandle_data() - Populates phandle data in platda
+ *
+ * This populates phandle data with an U_BOOT_DEVICE entry get by
+ * DM_GET_DEVICE. The implementation of this function will be done
+ * by dtoc when parsing dtb.
+ */
+void dm_populate_phandle_data(void);
 #endif