Browse Source

libfdt: Add a subnodes iterator macro

The fdt_for_each_subnode() iterator macro provided by this patch can be
used to iterate over a device tree node's subnodes. At each iteration a
loop variable will be set to the next subnode.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Thierry Reding 8 years ago committed by David Gibson
parent
commit
902d0f0953
  1. 28
      libfdt/libfdt.h
  2. 8
      tests/subnode_iterate.c

28
libfdt/libfdt.h

@ -168,6 +168,34 @@ int fdt_first_subnode(const void *fdt, int offset); @@ -168,6 +168,34 @@ int fdt_first_subnode(const void *fdt, int offset);
*/
int fdt_next_subnode(const void *fdt, int offset);

/**
* fdt_for_each_subnode - iterate over all subnodes of a parent
*
* @node: child node (int, lvalue)
* @fdt: FDT blob (const void *)
* @parent: parent node (int)
*
* This is actually a wrapper around a for loop and would be used like so:
*
* fdt_for_each_subnode(node, fdt, parent) {
* Use node
* ...
* }
*
* if ((node < 0) && (node != -FDT_ERR_NOT_FOUND)) {
* Error handling
* }
*
* Note that this is implemented as a macro and @node is used as
* iterator in the loop. The parent variable be constant or even a
* literal.
*
*/
#define fdt_for_each_subnode(node, fdt, parent) \
for (node = fdt_first_subnode(fdt, parent); \
node >= 0; \
node = fdt_next_subnode(fdt, node))

/**********************************************************************/
/* General functions */
/**********************************************************************/

8
tests/subnode_iterate.c

@ -48,9 +48,7 @@ static void test_node(void *fdt, int parent_offset) @@ -48,9 +48,7 @@ static void test_node(void *fdt, int parent_offset)
subnodes = cpu_to_fdt32(*prop);

count = 0;
for (offset = fdt_first_subnode(fdt, parent_offset);
offset >= 0;
offset = fdt_next_subnode(fdt, offset))
fdt_for_each_subnode(offset, fdt, parent_offset)
count++;

if (count != subnodes) {
@ -65,9 +63,7 @@ static void check_fdt_next_subnode(void *fdt) @@ -65,9 +63,7 @@ static void check_fdt_next_subnode(void *fdt)
int offset;
int count = 0;

for (offset = fdt_first_subnode(fdt, 0);
offset >= 0;
offset = fdt_next_subnode(fdt, offset)) {
fdt_for_each_subnode(offset, fdt, 0) {
test_node(fdt, offset);
count++;
}

Loading…
Cancel
Save