aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/dtc/libfdt/fdt_wip.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/dtc/libfdt/fdt_wip.c')
-rw-r--r--scripts/dtc/libfdt/fdt_wip.c41
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
97int _fdt_node_end_offset(void *fdt, int offset) 97int _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
107int fdt_nop_node(void *fdt, int nodeoffset) 134int fdt_nop_node(void *fdt, int nodeoffset)