diff options
author | Simon Glass <sjg@chromium.org> | 2015-03-25 21:21:57 +0300 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-04-18 20:11:19 +0300 |
commit | c5785673bc6f4b8f2a4974979710a2c5c15eb063 (patch) | |
tree | 664a8e740827abdd48b4b3959155052c2842d35b | |
parent | 206d4d2b4b30889678bb6b064002013a427b1501 (diff) | |
download | u-boot-c5785673bc6f4b8f2a4974979710a2c5c15eb063.tar.xz |
dm: core: Add device children and sibling functions
Add some utility functions to check for children and for the last sibling in
a device's parent.
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
-rw-r--r-- | drivers/core/device.c | 28 | ||||
-rw-r--r-- | include/dm/device.h | 30 |
2 files changed, 58 insertions, 0 deletions
diff --git a/drivers/core/device.c b/drivers/core/device.c index b7ed21c003..ccaa99ca63 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -490,3 +490,31 @@ fdt_addr_t dev_get_addr(struct udevice *dev) return FDT_ADDR_T_NONE; } #endif + +bool device_has_children(struct udevice *dev) +{ + return !list_empty(&dev->child_head); +} + +bool device_has_active_children(struct udevice *dev) +{ + struct udevice *child; + + for (device_find_first_child(dev, &child); + child; + device_find_next_child(&child)) { + if (device_active(child)) + return true; + } + + return false; +} + +bool device_is_last_sibling(struct udevice *dev) +{ + struct udevice *parent = dev->parent; + + if (!parent) + return false; + return list_is_last(&dev->sibling_node, &parent->child_head); +} diff --git a/include/dm/device.h b/include/dm/device.h index ec22885b34..c11342c33b 100644 --- a/include/dm/device.h +++ b/include/dm/device.h @@ -380,4 +380,34 @@ int device_find_next_child(struct udevice **devp); */ fdt_addr_t dev_get_addr(struct udevice *dev); +/** + * device_has_children() - check if a device has any children + * + * @dev: Device to check + * @return true if the device has one or more children + */ +bool device_has_children(struct udevice *dev); + +/** + * device_has_active_children() - check if a device has any active children + * + * @dev: Device to check + * @return true if the device has one or more children and at least one of + * them is active (probed). + */ +bool device_has_active_children(struct udevice *dev); + +/** + * device_is_last_sibling() - check if a device is the last sibling + * + * This function can be useful for display purposes, when special action needs + * to be taken when displaying the last sibling. This can happen when a tree + * view of devices is being displayed. + * + * @dev: Device to check + * @return true if there are no more siblings after this one - i.e. is it + * last in the list. + */ +bool device_is_last_sibling(struct udevice *dev); + #endif |