Commit 1e291b14c8f1101b9093434489bd4dc0e03f3d0f

Authored by Michael Ellerman
Committed by Paul Mackerras
1 parent ae564c63b8

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>

Showing 2 changed files with 41 additions and 0 deletions Side-by-side Diff

... ... @@ -329,6 +329,41 @@
329 329 EXPORT_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 + */
  343 +struct 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 + }
  359 +out:
  360 + of_node_put(from);
  361 + read_unlock(&devtree_lock);
  362 + return np;
  363 +}
  364 +EXPORT_SYMBOL(of_find_node_with_property);
  365 +
  366 +/**
332 367 * of_match_node - Tell if an device_node has a matching of_match structure
333 368 * @matches: array of of device match structures to search in
334 369 * @node: the of device structure to match against
... ... @@ -57,6 +57,12 @@
57 57 for (child = of_get_next_child(parent, NULL); child != NULL; \
58 58 child = of_get_next_child(parent, child))
59 59  
  60 +extern 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 +
60 66 extern struct property *of_find_property(const struct device_node *np,
61 67 const char *name,
62 68 int *lenp);