Index: kernel/genarch/include/ofw/ofw_tree.h
===================================================================
--- kernel/genarch/include/ofw/ofw_tree.h	(revision 6ff1f1e849d8a798e3ed34a6dcdd58b2f25b0055)
+++ kernel/genarch/include/ofw/ofw_tree.h	(revision 26678e5a1f0f0a6dda91a9e89a03aa3ca86e447c)
@@ -129,4 +129,7 @@
 extern ofw_tree_node_t *ofw_tree_lookup(const char *path);
 extern ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node, const char *name);
+extern ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name);
+extern ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *device_type);
+extern ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *device_type);
 
 extern bool ofw_fhc_apply_ranges(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uintptr_t *pa);
Index: kernel/genarch/src/ofw/ofw_tree.c
===================================================================
--- kernel/genarch/src/ofw/ofw_tree.c	(revision 6ff1f1e849d8a798e3ed34a6dcdd58b2f25b0055)
+++ kernel/genarch/src/ofw/ofw_tree.c	(revision 26678e5a1f0f0a6dda91a9e89a03aa3ca86e447c)
@@ -98,5 +98,5 @@
  * @return NULL if there is no such child or pointer to the matching child node.
  */
-static ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name)
+ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name)
 {
 	ofw_tree_node_t *cur;
@@ -125,4 +125,51 @@
 }
 
+/** Lookup first child of given device type.
+ *
+ * @param node Node whose child is being looked up.
+ * @param name Device type of the child being looked up.
+ *
+ * @return NULL if there is no such child or pointer to the matching child node.
+ */
+ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name)
+{
+	ofw_tree_node_t *cur;
+	ofw_tree_property_t *prop;
+	
+	for (cur = node->child; cur; cur = cur->peer) {
+		prop = ofw_tree_getprop(cur, "device_type");
+		if (!prop || !prop->value)
+			continue;
+		if (strcmp(prop->value, name) == 0)
+			return cur;
+	}
+			
+	return NULL;
+}
+
+/** Lookup first peer of given device type.
+ *
+ * @param node Node whose peer is being looked up.
+ * @param name Device type of the child being looked up.
+ *
+ * @return NULL if there is no such child or pointer to the matching child node.
+ */
+ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name)
+{
+	ofw_tree_node_t *cur;
+	ofw_tree_property_t *prop;
+	
+	for (cur = node->peer; cur; cur = cur->peer) {
+		prop = ofw_tree_getprop(cur, "device_type");
+		if (!prop || !prop->value)
+			continue;
+		if (strcmp(prop->value, name) == 0)
+			return cur;
+	}
+			
+	return NULL;
+}
+
+
 /** Lookup OpenFirmware node by its path.
  *
