aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2008-11-12 13:54:42 -0500
committerPaul Mackerras <paulus@samba.org>2008-11-19 00:05:00 -0500
commit1e291b14c8f1101b9093434489bd4dc0e03f3d0f (patch)
treeea602cce082e847d693b021d83f1314e9494c9a9
parentae564c63b8311fa73c21e456e00dba1f4b1ff6bc (diff)
of: Add helpers for finding device nodes which have a given property
This commit adds a routine for finding a device node which has a certain property. The contents of the property are not taken into account, merely the presence or absence of the property. Based on that routine, we add a for_each_ macro for iterating over all nodes that have a certain property. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--drivers/of/base.c35
-rw-r--r--include/linux/of.h6
2 files changed, 41 insertions, 0 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 7c79e94a35ea..4f884a358a7b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -329,6 +329,41 @@ struct device_node *of_find_compatible_node(struct device_node *from,
329EXPORT_SYMBOL(of_find_compatible_node); 329EXPORT_SYMBOL(of_find_compatible_node);
330 330
331/** 331/**
332 * of_find_node_with_property - Find a node which has a property with
333 * the given name.
334 * @from: The node to start searching from or NULL, the node
335 * you pass will not be searched, only the next one
336 * will; typically, you pass what the previous call
337 * returned. of_node_put() will be called on it
338 * @prop_name: The name of the property to look for.
339 *
340 * Returns a node pointer with refcount incremented, use
341 * of_node_put() on it when done.
342 */
343struct device_node *of_find_node_with_property(struct device_node *from,
344 const char *prop_name)
345{
346 struct device_node *np;
347 struct property *pp;
348
349 read_lock(&devtree_lock);
350 np = from ? from->allnext : allnodes;
351 for (; np; np = np->allnext) {
352 for (pp = np->properties; pp != 0; pp = pp->next) {
353 if (of_prop_cmp(pp->name, prop_name) == 0) {
354 of_node_get(np);
355 goto out;
356 }
357 }
358 }
359out:
360 of_node_put(from);
361 read_unlock(&devtree_lock);
362 return np;
363}
364EXPORT_SYMBOL(of_find_node_with_property);
365
366/**
332 * of_match_node - Tell if an device_node has a matching of_match structure 367 * of_match_node - Tell if an device_node has a matching of_match structure
333 * @matches: array of of device match structures to search in 368 * @matches: array of of device match structures to search in
334 * @node: the of device structure to match against 369 * @node: the of device structure to match against
diff --git a/include/linux/of.h b/include/linux/of.h
index e2488f5e7cb2..6a7efa242f5e 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -57,6 +57,12 @@ extern struct device_node *of_get_next_child(const struct device_node *node,
57 for (child = of_get_next_child(parent, NULL); child != NULL; \ 57 for (child = of_get_next_child(parent, NULL); child != NULL; \
58 child = of_get_next_child(parent, child)) 58 child = of_get_next_child(parent, child))
59 59
60extern struct device_node *of_find_node_with_property(
61 struct device_node *from, const char *prop_name);
62#define for_each_node_with_property(dn, prop_name) \
63 for (dn = of_find_node_with_property(NULL, prop_name); dn; \
64 dn = of_find_node_with_property(dn, prop_name))
65
60extern struct property *of_find_property(const struct device_node *np, 66extern struct property *of_find_property(const struct device_node *np,
61 const char *name, 67 const char *name,
62 int *lenp); 68 int *lenp);