Added fdt_fixup_stdout that uses aliases to set linux,stdout-path
authorKumar Gala <galak@kernel.crashing.org>
Mon, 26 Nov 2007 23:06:15 +0000 (17:06 -0600)
committerGerald Van Baren <vanbaren@cideas.com>
Sat, 8 Dec 2007 01:51:25 +0000 (20:51 -0500)
We use a combination of the serialN alias and CONFIG_CONS_INDEX to
determine which serial alias we should set linux,stdout-path to.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
common/fdt_support.c

index 808ec70..d05d656 100644 (file)
@@ -28,6 +28,7 @@
 #include <fdt.h>
 #include <libfdt.h>
 #include <fdt_support.h>
+#include <exports.h>
 
 /*
  * Global data (for the gd->bd)
@@ -67,6 +68,43 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
        return fdt_setprop(fdt, nodeoff, prop, val, len);
 }
 
+#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
+static int fdt_fixup_stdout(void *fdt, int choosenoff)
+{
+       int err = 0;
+#ifdef CONFIG_CONS_INDEX
+       int node;
+       char sername[9] = { 0 };
+       const char *path;
+
+       sprintf(sername, "serial%d", CONFIG_CONS_INDEX - 1);
+
+       err = node = fdt_path_offset(fdt, "/aliases");
+       if (node >= 0) {
+               int len;
+               path = fdt_getprop(fdt, node, sername, &len);
+               if (path) {
+                       char *p = malloc(len);
+                       err = -FDT_ERR_NOSPACE;
+                       if (p) {
+                               memcpy(p, path, len);
+                               err = fdt_setprop(fdt, choosenoff,
+                                       "linux,stdout-path", p, len);
+                               free(p);
+                       }
+               } else {
+                       err = len;
+               }
+       }
+#endif
+       if (err < 0)
+               printf("WARNING: could not set linux,stdout-path %s.\n",
+                               fdt_strerror(err));
+
+       return err;
+}
+#endif
+
 int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
 {
        int   nodeoffset;
@@ -157,6 +195,11 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
                        printf("WARNING: could not set linux,initrd-end %s.\n",
                                fdt_strerror(err));
        }
+
+#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
+       err = fdt_fixup_stdout(fdt, nodeoffset);
+#endif
+
 #ifdef OF_STDOUT_PATH
        err = fdt_setprop(fdt, nodeoffset,
                "linux,stdout-path", OF_STDOUT_PATH, strlen(OF_STDOUT_PATH)+1);