summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-11-26 13:08:28 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-01-22 07:53:21 +0100
commitdac65f99e8bf1fbe2e15fa96ef901623bb49dc89 (patch)
treeee748a61dd9c8eb8148bc440e8a8df5597637f4e
parent1ebf5ff0c18a44c968533bc47d9f26215ffb779d (diff)
downloadbarebox-dac65f99e8bf1fbe2e15fa96ef901623bb49dc89.tar.gz
barebox-dac65f99e8bf1fbe2e15fa96ef901623bb49dc89.tar.xz
console: Set Linux console parameter automatically
Linux specifies the linux,stdout-path property in the /chosen node in the devicetree. Unfortunately this is ignored in most cases. For cases in which barebox uses this property for its own use we translate this into a Linux boot arg with: - the console name provided by the serial driver - the the instance from the 'serial' alias - the baudrate from the actual baudrate. So with this it's for devicetee enabled boards no longer necessary to manually assign a console= parameter. Should a user not want to use the automatically assigned parameter it should do: global.linux.bootargs.console= in the environment. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--common/console.c29
-rw-r--r--defaultenv-2/base/bin/init1
-rw-r--r--drivers/serial/serial_imx.c1
-rw-r--r--drivers/serial/serial_ns16550.c3
-rw-r--r--include/console.h2
5 files changed, 35 insertions, 1 deletions
diff --git a/common/console.c b/common/console.c
index 329bc72493..aa9e3ce0f5 100644
--- a/common/console.c
+++ b/common/console.c
@@ -31,6 +31,8 @@
#include <kfifo.h>
#include <module.h>
#include <poller.h>
+#include <magicvar.h>
+#include <globalvar.h>
#include <linux/list.h>
#include <linux/stringify.h>
#include <debug_ll.h>
@@ -140,6 +142,26 @@ static void console_init_early(void)
initialized = CONSOLE_INITIALIZED_BUFFER;
}
+static void console_set_stdoutpath(struct console_device *cdev)
+{
+ int id;
+ char *str;
+
+ if (!cdev->linux_console_name)
+ return;
+
+ id = of_alias_get_id(cdev->dev->device_node, "serial");
+ if (id < 0)
+ return;
+
+ str = asprintf("console=%s%d,%dn8", cdev->linux_console_name,
+ id, cdev->baudrate);
+
+ globalvar_add_simple("linux.bootargs.console", str);
+
+ free(str);
+}
+
int console_register(struct console_device *newcdev)
{
struct device_d *dev = &newcdev->class_dev;
@@ -169,8 +191,10 @@ int console_register(struct console_device *newcdev)
activate = 1;
}
- if (newcdev->dev && of_device_is_stdout_path(newcdev->dev))
+ if (newcdev->dev && of_device_is_stdout_path(newcdev->dev)) {
activate = 1;
+ console_set_stdoutpath(newcdev);
+ }
list_add_tail(&newcdev->list, &console_list);
@@ -357,3 +381,6 @@ int ctrlc (void)
}
EXPORT_SYMBOL(ctrlc);
#endif /* ARCH_HAS_CTRC */
+
+BAREBOX_MAGICVAR_NAMED(global_linux_bootargs_console, global.linux.bootargs.console,
+ "console= argument for Linux from the linux,stdout-path property in /chosen node");
diff --git a/defaultenv-2/base/bin/init b/defaultenv-2/base/bin/init
index d7bd0cb140..3a0e93b49d 100644
--- a/defaultenv-2/base/bin/init
+++ b/defaultenv-2/base/bin/init
@@ -8,6 +8,7 @@ global autoboot_timeout
global boot.default
global allow_color
global linux.bootargs.base
+global linux.bootargs.console
#linux.bootargs.dyn.* will be cleared at the beginning of boot
global linux.bootargs.dyn.ip
global linux.bootargs.dyn.root
diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c
index 8468fa0adc..e0bd185c8b 100644
--- a/drivers/serial/serial_imx.c
+++ b/drivers/serial/serial_imx.c
@@ -336,6 +336,7 @@ static int imx_serial_probe(struct device_d *dev)
cdev->getc = imx_serial_getc;
cdev->flush = imx_serial_flush;
cdev->setbrg = imx_serial_setbaudrate;
+ cdev->linux_console_name = "ttymxc";
imx_serial_init_port(cdev);
diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c
index a8487b0ed3..f1da44b7f7 100644
--- a/drivers/serial/serial_ns16550.c
+++ b/drivers/serial/serial_ns16550.c
@@ -57,6 +57,7 @@ static inline struct ns16550_priv *to_ns16550_priv(struct console_device *cdev)
struct ns16550_drvdata {
void (*init_port)(struct console_device *cdev);
+ const char *linux_console_name;
};
/**
@@ -251,6 +252,7 @@ static struct ns16550_drvdata ns16550_drvdata = {
static __maybe_unused struct ns16550_drvdata omap_drvdata = {
.init_port = ns16550_omap_init_port,
+ .linux_console_name = "ttyO",
};
/**
@@ -312,6 +314,7 @@ static int ns16550_probe(struct device_d *dev)
cdev->putc = ns16550_putc;
cdev->getc = ns16550_getc;
cdev->setbrg = ns16550_setbaudrate;
+ cdev->linux_console_name = devtype->linux_console_name;
devtype->init_port(cdev);
diff --git a/include/console.h b/include/console.h
index 550b440376..6da0199aba 100644
--- a/include/console.h
+++ b/include/console.h
@@ -49,6 +49,8 @@ struct console_device {
unsigned char f_active;
unsigned int baudrate;
+
+ const char *linux_console_name;
};
int console_register(struct console_device *cdev);