dm: core: Add a function to find any device from device tree

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@chromium.org>
This commit is contained in:
Simon Glass 2015-06-23 15:38:37 -06:00
parent 3039811e65
commit 2693047acd
2 changed files with 39 additions and 0 deletions

View File

@ -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)) {

View File

@ -389,6 +389,20 @@ int device_find_child_by_of_offset(struct udevice *parent, int of_offset,
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
*