[U-Boot] [PATCH v3 15/54] dm: core: Add a function to find any device from device tree
Simon Glass
sjg at chromium.org
Tue Jun 23 23:38:37 CEST 2015
In some rare cases it is useful to be able to locate a device given a device
tree node offset. An example is when you have an alias that points to a node
and you want to find the associated device. The device may be SPI, MMC or
something else, but you don't need to know the uclass to find it.
Add a function to do a global search for a device, given its device tree
offset.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
Changes in v3: None
Changes in v2: None
drivers/core/device.c | 25 +++++++++++++++++++++++++
include/dm/device.h | 14 ++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 85fd1fc..43aff54 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -470,6 +470,31 @@ int device_get_child_by_of_offset(struct udevice *parent, int seq,
return device_get_device_tail(dev, ret, devp);
}
+static struct udevice *_device_find_global_by_of_offset(struct udevice *parent,
+ int of_offset)
+{
+ struct udevice *dev, *found;
+
+ if (parent->of_offset == of_offset)
+ return parent;
+
+ list_for_each_entry(dev, &parent->child_head, sibling_node) {
+ found = _device_find_global_by_of_offset(dev, of_offset);
+ if (found)
+ return found;
+ }
+
+ return NULL;
+}
+
+int device_get_global_by_of_offset(int of_offset, struct udevice **devp)
+{
+ struct udevice *dev;
+
+ dev = _device_find_global_by_of_offset(gd->dm_root, of_offset);
+ return device_get_device_tail(dev, dev ? 0 : -ENOENT, devp);
+}
+
int device_find_first_child(struct udevice *parent, struct udevice **devp)
{
if (list_empty(&parent->child_head)) {
diff --git a/include/dm/device.h b/include/dm/device.h
index 18296bb..9a94ee1 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -390,6 +390,20 @@ int device_get_child_by_of_offset(struct udevice *parent, int seq,
struct udevice **devp);
/**
+ * device_get_global_by_of_offset() - Get a device based on FDT offset
+ *
+ * Locates a device by its device tree offset, searching globally throughout
+ * the all driver model devices.
+ *
+ * The device is probed to activate it ready for use.
+ *
+ * @of_offset: Device tree offset to find
+ * @devp: Returns pointer to device if found, otherwise this is set to NULL
+ * @return 0 if OK, -ve on error
+ */
+int device_get_global_by_of_offset(int of_offset, struct udevice **devp);
+
+/**
* device_find_first_child() - Find the first child of a device
*
* @parent: Parent device to search
--
2.4.3.573.g4eafbef
More information about the U-Boot
mailing list