|
@@ -149,9 +149,14 @@ static int fdt_find_or_add_subnode(void *fdt, int parentoffset,
|
|
|
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;
|
|
@@ -163,44 +168,48 @@ static void fdt_fill_multisername(char *sername, size_t maxlen)
|
|
|
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)
|
|
@@ -280,27 +289,17 @@ int fdt_chosen(void *fdt)
|
|
|
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,
|