aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/fdt.c
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@linaro.org>2014-11-28 11:03:33 -0500
committerGrant Likely <grant.likely@linaro.org>2014-12-03 18:12:40 -0500
commit70161ff336674ecfd20614a9c0c61cb17a6e9e83 (patch)
tree1732d2b00f8242bddabe39a3307a7746fe11e1d0 /drivers/of/fdt.c
parent5267720e7515f0fadf4cdef68dccafc18d48c806 (diff)
of: Drop ->next pointer from struct device_node
The ->next pointer in struct device_node is a hanger-on from when it was used to iterate over the whole tree by a particular device_type property value. Those days are long over, but the fdt unflattening code still uses it to put nodes in the unflattened tree into the same order as node in the flat tree. By reworking the unflattening code to reverse the list after unflattening all the children of a node, the pointer can be dropped which gives a small amount of memory savings. Signed-off-by: Grant Likely <grant.likely@linaro.org> Acked-by: Frank Rowand <frank.rowand@sonymobile.com> Cc: Gaurav Minocha <gaurav.minocha.os@gmail.com>
Diffstat (limited to 'drivers/of/fdt.c')
-rw-r--r--drivers/of/fdt.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 7f6ee31d5650..a41f9fdb1aa0 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -226,12 +226,8 @@ static void * unflatten_dt_node(void *blob,
226 prev_pp = &np->properties; 226 prev_pp = &np->properties;
227 if (dad != NULL) { 227 if (dad != NULL) {
228 np->parent = dad; 228 np->parent = dad;
229 /* we temporarily use the next field as `last_child'*/ 229 np->sibling = dad->child;
230 if (dad->next == NULL) 230 dad->child = np;
231 dad->child = np;
232 else
233 dad->next->sibling = np;
234 dad->next = np;
235 } 231 }
236 } 232 }
237 /* process properties */ 233 /* process properties */
@@ -329,6 +325,22 @@ static void * unflatten_dt_node(void *blob,
329 325
330 if (*poffset < 0 && *poffset != -FDT_ERR_NOTFOUND) 326 if (*poffset < 0 && *poffset != -FDT_ERR_NOTFOUND)
331 pr_err("unflatten: error %d processing FDT\n", *poffset); 327 pr_err("unflatten: error %d processing FDT\n", *poffset);
328
329 /*
330 * Reverse the child list. Some drivers assumes node order matches .dts
331 * node order
332 */
333 if (!dryrun && np->child) {
334 struct device_node *child = np->child;
335 np->child = NULL;
336 while (child) {
337 struct device_node *next = child->sibling;
338 child->sibling = np->child;
339 np->child = child;
340 child = next;
341 }
342 }
343
332 if (nodepp) 344 if (nodepp)
333 *nodepp = np; 345 *nodepp = np;
334 346