device: add child traversal helper function

Add a function, dev_bus_each_child(), which walks through all the
children for a given bus of a device. This helper allows one to
walk through all the children of a given device's bus.

BUG=b:111808427,b:111743717
TEST=built

Change-Id: Iedceb0d19c05b7abd5a48f8dc30f85461bef5ec6
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/27636
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Justin TerAvest <teravest@chromium.org>
diff --git a/src/device/device_const.c b/src/device/device_const.c
index ee64bd1..90b6867 100644
--- a/src/device/device_const.c
+++ b/src/device/device_const.c
@@ -216,3 +216,27 @@
 	}
 	return 0;
 }
+
+/**
+ * Given a device and previous match iterate through all the children.
+ *
+ * @param bus parent device's bus holding all the children
+ * @param prev_child previous child already traversed, if NULL start at
+ *        children of parent bus.
+ * @return pointer to child or NULL when no more children
+ */
+DEVTREE_CONST struct device *dev_bus_each_child(const struct bus *parent,
+					DEVTREE_CONST struct device *prev_child)
+{
+	DEVTREE_CONST struct device *dev;
+
+	if (parent == NULL)
+		return NULL;
+
+	if (prev_child == NULL)
+		dev = parent->children;
+	else
+		dev = prev_child->sibling;
+
+	return dev;
+}
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 64add5d..1c8f1db 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -1,4 +1,5 @@
 #ifndef DEVICE_H
+
 #define DEVICE_H
 
 /*
@@ -275,6 +276,8 @@
 DEVTREE_CONST struct device *dev_find_slot_on_smbus(unsigned int bus,
 							unsigned int addr);
 DEVTREE_CONST struct device *dev_find_slot_pnp(u16 port, u16 device);
+DEVTREE_CONST struct device *dev_bus_each_child(const struct bus *parent,
+				DEVTREE_CONST struct device *prev_child);
 
 void scan_smbus(struct device *bus);
 void scan_generic_bus(struct device *bus);