return offset;
 }
 
-#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
-
-#ifdef CONFIG_CONS_INDEX
+/* rename to CONFIG_OF_STDOUT_PATH ? */
+#if defined(OF_STDOUT_PATH)
+static int fdt_fixup_stdout(void *fdt, int chosenoff)
+{
+       return fdt_setprop(fdt, chosenoff, "linux,stdout-path",
+                             OF_STDOUT_PATH, strlen(OF_STDOUT_PATH) + 1);
+}
+#elif defined(CONFIG_OF_STDOUT_VIA_ALIAS) && defined(CONFIG_CONS_INDEX)
 static void fdt_fill_multisername(char *sername, size_t maxlen)
 {
        const char *outname = stdio_devices[stdout]->name;
        if (strcmp(outname + 1, "serial") > 0)
                strncpy(sername, outname + 1, maxlen);
 }
-#endif
 
 static int fdt_fixup_stdout(void *fdt, int chosenoff)
 {
-       int err = 0;
-#ifdef CONFIG_CONS_INDEX
-       int node;
+       int err;
+       int aliasoff;
        char sername[9] = { 0 };
-       const char *path;
+       const void *path;
+       int len;
+       char tmp[256]; /* long enough */
 
        fdt_fill_multisername(sername, sizeof(sername) - 1);
        if (!sername[0])
                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, chosenoff,
-                                       "linux,stdout-path", p, len);
-                               free(p);
-                       }
-               } else {
-                       err = len;
-               }
+       aliasoff = fdt_path_offset(fdt, "/aliases");
+       if (aliasoff < 0) {
+               err = aliasoff;
+               goto error;
        }
-#endif
+
+       path = fdt_getprop(fdt, aliasoff, sername, &len);
+       if (!path) {
+               err = len;
+               goto error;
+       }
+
+       /* fdt_setprop may break "path" so we copy it to tmp buffer */
+       memcpy(tmp, path, len);
+
+       err = fdt_setprop(fdt, chosenoff, "linux,stdout-path", tmp, len);
+error:
        if (err < 0)
                printf("WARNING: could not set linux,stdout-path %s.\n",
-                               fdt_strerror(err));
+                      fdt_strerror(err));
 
        return err;
 }
+#else
+static int fdt_fixup_stdout(void *fdt, int chosenoff)
+{
+       return 0;
+}
 #endif
 
 int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end)
                return nodeoffset;
 
        str = getenv("bootargs");
-       if (str != NULL) {
-               err = fdt_setprop(fdt, nodeoffset,
-                                 "bootargs", str, strlen(str)+1);
-               if (err < 0)
+       if (str) {
+               err = fdt_setprop(fdt, nodeoffset, "bootargs", str,
+                                 strlen(str) + 1);
+               if (err < 0) {
                        printf("WARNING: could not set bootargs %s.\n",
                               fdt_strerror(err));
+                       return 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);
-       if (err < 0)
-               printf("WARNING: could not set linux,stdout-path %s.\n",
-                      fdt_strerror(err));
-#endif
-
-       return err;
+       return fdt_fixup_stdout(fdt, nodeoffset);
 }
 
 void do_fixup_by_path(void *fdt, const char *path, const char *prop,