Rob Barnes has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/43776 )
Change subject: device: Add find_dev_nested_path helper function ......................................................................
device: Add find_dev_nested_path helper function
Add find_dev_nested_path helper function to simplify finding deeply nested devices.
BUG=b:157580724 TEST=Find bluetooth device on dalboz
Change-Id: I48fa5fcad0030fb6dcea97b9fc76e1d3d3f9b28f --- M src/device/device_const.c M src/include/device/device.h 2 files changed, 32 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/76/43776/1
diff --git a/src/device/device_const.c b/src/device/device_const.c index 12d5386..765fcdc 100644 --- a/src/device/device_const.c +++ b/src/device/device_const.c @@ -196,6 +196,34 @@ return child; }
+/** + * Find the device structure given an array of nested device paths, + * + * @param parent The parent bus to start the search on. + * @param nested_path An array of relative paths from the parent bus to + the target device. + * @param nested_path_length Number of path elements in nested_path array. + * @return Pointer to a device structure for the device at nested path + * or 0/NULL if no device is found. + */ +DEVTREE_CONST struct device *find_dev_nested_path( + const struct bus *parent, const struct device_path nested_path[], + unsigned int nested_path_length) +{ + DEVTREE_CONST struct device *child; + + if (!parent || !nested_path_length) + return NULL; + + child = find_dev_path(parent, nested_path); + + /* Terminate recursion at end of nested path or child not found */ + if(nested_path_length == 1 || !child) + return child; + + return find_dev_nested_path(child->link_list, nested_path+1, nested_path_length-1); +} + DEVTREE_CONST struct device *pcidev_path_behind( const struct bus *parent, pci_devfn_t devfn) { diff --git a/src/include/device/device.h b/src/include/device/device.h index 082dcbb..202d3ae 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -202,6 +202,10 @@ DEVTREE_CONST struct device *find_dev_path( const struct bus *parent, const struct device_path *path); +DEVTREE_CONST struct device *find_dev_nested_path( + const struct bus *parent, + const struct device_path nested_path[], + unsigned int nested_path_length); struct device *alloc_find_dev(struct bus *parent, struct device_path *path); struct device *dev_find_device(u16 vendor, u16 device, struct device *from); struct device *dev_find_class(unsigned int class, struct device *from);