]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
libfdt: Rework fdt_next_node()
authorDavid Gibson <david@gibson.dropbear.id.au>
Fri, 6 Feb 2009 03:01:56 +0000 (14:01 +1100)
committerGerald Van Baren <vanbaren@cideas.com>
Wed, 1 Apr 2009 23:29:22 +0000 (19:29 -0400)
Currently fdt_next_node() will find the next node in the blob
regardless of whether it is above, below or at the same level in the
tree as the starting node - the depth parameter is updated to indicate
which is the case.  When a depth parameter is supplied, this patch
makes it instead terminate immediately when it finds the END_NODE tag
for a node at depth 0.  In this case it returns the offset immediately
past the END_NODE tag.

This has a couple of advantages.  First, this slightly simplifies
fdt_subnode_offset(), which no longer needs to explicitly check that
fdt_next_node()'s iteration hasn't left the starting node.  Second,
this allows fdt_next_node() to be used to implement
_fdt_node_end_offset() considerably simplifying the latter function.

The other users of fdt_next_node() either don't need to iterate out of
the starting node, or don't pass a depth parameter at all.  Any
callers that really need to iterate out of the starting node, but keep
tracking depth can do so by biasing the initial depth value.

This is a semantic change, but I think it's very unlikely to break any
existing library users.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
libfdt/fdt.c
libfdt/fdt_ro.c
libfdt/fdt_wip.c

index a59a518b0e2e1684d976c7e36e37063e8bce2579..940cee8b126b259b40c5aa34e592bcbb8191b7f0 100644 (file)
@@ -166,8 +166,8 @@ int fdt_next_node(const void *fdt, int offset, int *depth)
                        break;
 
                case FDT_END_NODE:
-                       if (depth)
-                               (*depth)--;
+                       if (depth && ((--(*depth)) < 0))
+                               return nextoffset;
                        break;
 
                case FDT_END:
index fdc9c29d2f1be93bda4de8679ab04f73d9ac4074..d682a40c1451e5aec7484545d7a32be4cf2a3901 100644 (file)
@@ -112,24 +112,20 @@ int fdt_num_mem_rsv(const void *fdt)
 int fdt_subnode_offset_namelen(const void *fdt, int offset,
                               const char *name, int namelen)
 {
-       int depth = 0;
+       int depth;
 
        FDT_CHECK_HEADER(fdt);
 
-       for (depth = 0, offset = fdt_next_node(fdt, offset, &depth);
-            (offset >= 0) && (depth > 0);
-            offset = fdt_next_node(fdt, offset, &depth)) {
-               if (depth < 0)
-                       return -FDT_ERR_NOTFOUND;
-               else if ((depth == 1)
-                        && _fdt_nodename_eq(fdt, offset, name, namelen))
+       for (depth = 0;
+            (offset >= 0) && (depth >= 0);
+            offset = fdt_next_node(fdt, offset, &depth))
+               if ((depth == 1)
+                   && _fdt_nodename_eq(fdt, offset, name, namelen))
                        return offset;
-       }
 
-       if (offset < 0)
-               return offset; /* error */
-       else
+       if (depth < 0)
                return -FDT_ERR_NOTFOUND;
+       return offset; /* error */
 }
 
 int fdt_subnode_offset(const void *fdt, int parentoffset,
index e30c81d91a91033f945b7b5782162622bf93d32e..e373677c504d1d854af0151f535ce508b1eeddfc 100644 (file)
@@ -98,41 +98,14 @@ int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
        return 0;
 }
 
-int _fdt_node_end_offset(void *fdt, int nodeoffset)
+int _fdt_node_end_offset(void *fdt, int offset)
 {
-       int level = 0;
-       uint32_t tag;
-       int offset, nextoffset;
-
-       tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-       if (tag != FDT_BEGIN_NODE)
-               return -FDT_ERR_BADOFFSET;
-       do {
-               offset = nextoffset;
-               tag = fdt_next_tag(fdt, offset, &nextoffset);
-
-               switch (tag) {
-               case FDT_END:
-                       return offset;
-
-               case FDT_BEGIN_NODE:
-                       level++;
-                       break;
-
-               case FDT_END_NODE:
-                       level--;
-                       break;
-
-               case FDT_PROP:
-               case FDT_NOP:
-                       break;
-
-               default:
-                       return -FDT_ERR_BADSTRUCTURE;
-               }
-       } while (level >= 0);
-
-       return nextoffset;
+       int depth = 0;
+
+       while ((offset >= 0) && (depth >= 0))
+               offset = fdt_next_node(fdt, offset, &depth);
+
+       return offset;
 }
 
 int fdt_nop_node(void *fdt, int nodeoffset)