]> git.karo-electronics.de Git - linux-beck.git/commitdiff
of: Drop ->next pointer from struct device_node
authorGrant Likely <grant.likely@linaro.org>
Fri, 28 Nov 2014 16:03:33 +0000 (16:03 +0000)
committerGrant Likely <grant.likely@linaro.org>
Wed, 3 Dec 2014 23:12:40 +0000 (23:12 +0000)
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>
drivers/of/fdt.c
include/linux/of.h

index 7f6ee31d56506c92f44f60712a062128b0677125..a41f9fdb1aa0032272d76414a2d67dd78e9c5fbc 100644 (file)
@@ -226,12 +226,8 @@ static void * unflatten_dt_node(void *blob,
                prev_pp = &np->properties;
                if (dad != NULL) {
                        np->parent = dad;
-                       /* we temporarily use the next field as `last_child'*/
-                       if (dad->next == NULL)
-                               dad->child = np;
-                       else
-                               dad->next->sibling = np;
-                       dad->next = np;
+                       np->sibling = dad->child;
+                       dad->child = np;
                }
        }
        /* process properties */
@@ -329,6 +325,22 @@ static void * unflatten_dt_node(void *blob,
 
        if (*poffset < 0 && *poffset != -FDT_ERR_NOTFOUND)
                pr_err("unflatten: error %d processing FDT\n", *poffset);
+
+       /*
+        * Reverse the child list. Some drivers assumes node order matches .dts
+        * node order
+        */
+       if (!dryrun && np->child) {
+               struct device_node *child = np->child;
+               np->child = NULL;
+               while (child) {
+                       struct device_node *next = child->sibling;
+                       child->sibling = np->child;
+                       np->child = child;
+                       child = next;
+               }
+       }
+
        if (nodepp)
                *nodepp = np;
 
index 8b021db3e16e007a3483392712b37f6438293e5e..3f0f0ffbd5e54454662ec8a190322f37b6e0c5a0 100644 (file)
@@ -56,7 +56,6 @@ struct device_node {
        struct  device_node *parent;
        struct  device_node *child;
        struct  device_node *sibling;
-       struct  device_node *next;      /* next device of same type */
        struct  kobject kobj;
        unsigned long _flags;
        void    *data;