[POWERPC] bootwrapper: Make ft_get_parent() return a phandle, and NULL if already...
authorScott Wood <scottwood@freescale.com>
Mon, 12 Mar 2007 20:41:56 +0000 (14:41 -0600)
committerPaul Mackerras <paulus@samba.org>
Fri, 16 Mar 2007 04:49:11 +0000 (15:49 +1100)
Most of ft_get_parent() is factored out into __ft_get_parent(), which
deals only in internal node pointers.  The ft_get_parent() wrapper
handles phandle conversion in both directions (previously,
ft_get_parent() did not convert its return value).

It also now returns NULL as the parent of the toplevel node, rather than
just returning the toplevel node again (which made it rather useless in
loops).

Signed-off-by: Scott Wood <scottwood@freescale.com>
Acked-by: Mark A. Greer <mgreer@mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/boot/flatdevtree.c
arch/powerpc/boot/flatdevtree.h

index 9de267dd1cdc75e943d734b20f07faa5c532fad6..88b178a77e875d27869d02626e181630c0801647 100644 (file)
@@ -728,20 +728,15 @@ void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path)
        return NULL;
 }
 
-void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
+void *__ft_get_parent(struct ft_cxt *cxt, void *node)
 {
-       void *node;
        int d;
        struct ft_atom atom;
        char *p;
 
-       node = ft_node_ph2node(cxt, phandle);
-       if (node == NULL)
-               return NULL;
-
        for (d = 0; cxt->genealogy[d] != NULL; ++d)
                if (cxt->genealogy[d] == node)
-                       return cxt->genealogy[d > 0 ? d - 1 : 0];
+                       return d > 0 ? cxt->genealogy[d - 1] : NULL;
 
        /* have to do it the hard way... */
        p = ft_root_node(cxt);
@@ -753,7 +748,7 @@ void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
                        if (node == atom.data) {
                                /* found it */
                                cxt->genealogy[d + 1] = NULL;
-                               return d > 0 ? cxt->genealogy[d - 1] : node;
+                               return d > 0 ? cxt->genealogy[d - 1] : NULL;
                        }
                        ++d;
                        break;
@@ -765,6 +760,16 @@ void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
        return NULL;
 }
 
+void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
+{
+       void *node = ft_node_ph2node(cxt, phandle);
+       if (node == NULL)
+               return NULL;
+
+       node = __ft_get_parent(cxt, node);
+       return ft_get_phandle(cxt, node);
+}
+
 static const void *__ft_get_prop(struct ft_cxt *cxt, void *node,
                                  const char *propname, unsigned int *len)
 {
index 1f37ca2d34f6f609e3a712fe1a26580047dee089..950042493fb7ff0fc209b057e6a0633ff15af875 100644 (file)
@@ -104,5 +104,6 @@ int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
                void *buf, const unsigned int buflen);
 int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
                const void *buf, const unsigned int buflen);
+void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
 
 #endif /* FLATDEVTREE_H */