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>
This commit is contained in:
parent
c539075ba8
commit
902d0f0953
2 changed files with 30 additions and 6 deletions
|
@ -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 */
|
||||
/**********************************************************************/
|
||||
|
|
|
@ -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)
|
|||
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…
Reference in a new issue