diff options
Diffstat (limited to 'scripts/dtc/libfdt/fdt_wip.c')
-rw-r--r-- | scripts/dtc/libfdt/fdt_wip.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/scripts/dtc/libfdt/fdt_wip.c b/scripts/dtc/libfdt/fdt_wip.c index 6025fa1fe8f..a4652c6e787 100644 --- a/scripts/dtc/libfdt/fdt_wip.c +++ b/scripts/dtc/libfdt/fdt_wip.c | |||
@@ -94,14 +94,41 @@ int fdt_nop_property(void *fdt, int nodeoffset, const char *name) | |||
94 | return 0; | 94 | return 0; |
95 | } | 95 | } |
96 | 96 | ||
97 | int _fdt_node_end_offset(void *fdt, int offset) | 97 | int _fdt_node_end_offset(void *fdt, int nodeoffset) |
98 | { | 98 | { |
99 | int depth = 0; | 99 | int level = 0; |
100 | 100 | uint32_t tag; | |
101 | while ((offset >= 0) && (depth >= 0)) | 101 | int offset, nextoffset; |
102 | offset = fdt_next_node(fdt, offset, &depth); | 102 | |
103 | 103 | tag = fdt_next_tag(fdt, nodeoffset, &nextoffset); | |
104 | return offset; | 104 | if (tag != FDT_BEGIN_NODE) |
105 | return -FDT_ERR_BADOFFSET; | ||
106 | do { | ||
107 | offset = nextoffset; | ||
108 | tag = fdt_next_tag(fdt, offset, &nextoffset); | ||
109 | |||
110 | switch (tag) { | ||
111 | case FDT_END: | ||
112 | return offset; | ||
113 | |||
114 | case FDT_BEGIN_NODE: | ||
115 | level++; | ||
116 | break; | ||
117 | |||
118 | case FDT_END_NODE: | ||
119 | level--; | ||
120 | break; | ||
121 | |||
122 | case FDT_PROP: | ||
123 | case FDT_NOP: | ||
124 | break; | ||
125 | |||
126 | default: | ||
127 | return -FDT_ERR_BADSTRUCTURE; | ||
128 | } | ||
129 | } while (level >= 0); | ||
130 | |||
131 | return nextoffset; | ||
105 | } | 132 | } |
106 | 133 | ||
107 | int fdt_nop_node(void *fdt, int nodeoffset) | 134 | int fdt_nop_node(void *fdt, int nodeoffset) |