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
Signed-off-by: Rob Barnes <robbarnes@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43776
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Raul Rangel <rrangel@chromium.org>
This commit is contained in:
Rob Barnes 2020-07-23 08:25:42 -06:00 committed by Patrick Georgi
parent e7e6c4e1d7
commit a223e65db2
2 changed files with 31 additions and 0 deletions

View File

@ -196,6 +196,33 @@ DEVTREE_CONST struct device *find_dev_path(
return child; 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[],
size_t nested_path_length)
{
DEVTREE_CONST struct device *child;
if (!parent || !nested_path || !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( DEVTREE_CONST struct device *pcidev_path_behind(
const struct bus *parent, pci_devfn_t devfn) const struct bus *parent, pci_devfn_t devfn)
{ {

View File

@ -207,6 +207,10 @@ void run_bios(struct device *dev, unsigned long addr);
DEVTREE_CONST struct device *find_dev_path( DEVTREE_CONST struct device *find_dev_path(
const struct bus *parent, const struct bus *parent,
const struct device_path *path); const struct device_path *path);
DEVTREE_CONST struct device *find_dev_nested_path(
const struct bus *parent,
const struct device_path nested_path[],
size_t nested_path_length);
struct device *alloc_find_dev(struct bus *parent, struct device_path *path); 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_device(u16 vendor, u16 device, struct device *from);
struct device *dev_find_class(unsigned int class, struct device *from); struct device *dev_find_class(unsigned int class, struct device *from);