| 163 | } |
| 164 | |
| 165 | int fdt_next_node(const void *fdt, int offset, int *depth) |
| 166 | { |
| 167 | int nextoffset = 0; |
| 168 | uint32_t tag; |
| 169 | |
| 170 | if (offset >= 0) |
| 171 | if ((nextoffset = fdt_check_node_offset_(fdt, offset)) < 0) |
| 172 | return nextoffset; |
| 173 | |
| 174 | do { |
| 175 | offset = nextoffset; |
| 176 | tag = fdt_next_tag(fdt, offset, &nextoffset); |
| 177 | |
| 178 | switch (tag) { |
| 179 | case FDT_PROP: |
| 180 | case FDT_NOP: |
| 181 | break; |
| 182 | |
| 183 | case FDT_BEGIN_NODE: |
| 184 | if (depth) |
| 185 | (*depth)++; |
| 186 | break; |
| 187 | |
| 188 | case FDT_END_NODE: |
| 189 | if (depth && ((--(*depth)) < 0)) |
| 190 | return nextoffset; |
| 191 | break; |
| 192 | |
| 193 | case FDT_END: |
| 194 | if ((nextoffset >= 0) |
| 195 | || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth)) |
| 196 | return -FDT_ERR_NOTFOUND; |
| 197 | else |
| 198 | return nextoffset; |
| 199 | } |
| 200 | } while (tag != FDT_BEGIN_NODE); |
| 201 | |
| 202 | return offset; |
| 203 | } |
| 204 | |
| 205 | int fdt_first_subnode(const void *fdt, int offset) |
| 206 | { |
no test coverage detected