From: Shubhrajyoti Datta <shubhrajyoti.datta@xxxxxxxxxx> Driver console functions are using pointer to static array with fixed size. There can be only one serial console at the time which is found by register_console(). register_console() is filling cons->index to port->line value. Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xxxxxxxxxx> --- drivers/tty/serial/uartlite.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/uartlite.c b/drivers/tty/serial/uartlite.c index f8538e2..5b5c8c4 100644 --- a/drivers/tty/serial/uartlite.c +++ b/drivers/tty/serial/uartlite.c @@ -55,6 +55,9 @@ #define ULITE_CONTROL_RST_RX 0x02 #define ULITE_CONTROL_IE 0x10 +/* Static pointer to console port */ +static struct uart_port *console_port; + struct uartlite_data { const struct uartlite_reg_ops *reg_ops; struct clk *clk; @@ -472,7 +475,7 @@ static void ulite_console_putchar(struct uart_port *port, int ch) static void ulite_console_write(struct console *co, const char *s, unsigned int count) { - struct uart_port *port = &ulite_ports[co->index]; + struct uart_port *port = console_port; unsigned long flags; unsigned int ier; int locked = 1; @@ -506,10 +509,8 @@ static int ulite_console_setup(struct console *co, char *options) int parity = 'n'; int flow = 'n'; - if (co->index < 0 || co->index >= ULITE_NR_UARTS) - return -EINVAL; - port = &ulite_ports[co->index]; + port = console_port; /* Has the device been initialized yet? */ if (!port->mapbase) { @@ -652,6 +653,17 @@ static int ulite_assign(struct device *dev, int id, u32 base, int irq, dev_set_drvdata(dev, port); +#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE + /* + * If console hasn't been found yet try to assign this port + * because it is required to be assigned for console setup function. + * If register_console() don't assign value, then console_port pointer + * is cleanup. + */ + if (ulite_uart_driver.cons->index == -1) + console_port = port; +#endif + /* Register the port */ rc = uart_add_one_port(&ulite_uart_driver, port); if (rc) { @@ -661,6 +673,12 @@ static int ulite_assign(struct device *dev, int id, u32 base, int irq, return rc; } +#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE + /* This is not port which is used for console that's why clean it up */ + if (ulite_uart_driver.cons->index == -1) + console_port = NULL; +#endif + return 0; } -- 2.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html