提交 0413fe04 编写于 作者: M Michal Simek 提交者: Greg Kroah-Hartman

serial: uartps: Use dynamic array for console port

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: NMichal Simek <michal.simek@xilinx.com>
Reviewed-by: NAlan Cox <alan@linux.intel.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 0f38c5e3
...@@ -1206,6 +1206,10 @@ OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup); ...@@ -1206,6 +1206,10 @@ OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p8", cdns_early_console_setup);
OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup); OF_EARLYCON_DECLARE(cdns, "cdns,uart-r1p12", cdns_early_console_setup);
OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup); OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
/* Static pointer to console port */
static struct uart_port *console_port;
/** /**
* cdns_uart_console_write - perform write operation * cdns_uart_console_write - perform write operation
* @co: Console handle * @co: Console handle
...@@ -1215,7 +1219,7 @@ OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup); ...@@ -1215,7 +1219,7 @@ OF_EARLYCON_DECLARE(cdns, "xlnx,zynqmp-uart", cdns_early_console_setup);
static void cdns_uart_console_write(struct console *co, const char *s, static void cdns_uart_console_write(struct console *co, const char *s,
unsigned int count) unsigned int count)
{ {
struct uart_port *port = &cdns_uart_port[co->index]; struct uart_port *port = console_port;
unsigned long flags; unsigned long flags;
unsigned int imr, ctrl; unsigned int imr, ctrl;
int locked = 1; int locked = 1;
...@@ -1261,15 +1265,13 @@ static void cdns_uart_console_write(struct console *co, const char *s, ...@@ -1261,15 +1265,13 @@ static void cdns_uart_console_write(struct console *co, const char *s,
*/ */
static int __init cdns_uart_console_setup(struct console *co, char *options) static int __init cdns_uart_console_setup(struct console *co, char *options)
{ {
struct uart_port *port = &cdns_uart_port[co->index]; struct uart_port *port = console_port;
int baud = 9600; int baud = 9600;
int bits = 8; int bits = 8;
int parity = 'n'; int parity = 'n';
int flow = 'n'; int flow = 'n';
if (co->index < 0 || co->index >= CDNS_UART_NR_PORTS)
return -EINVAL;
if (!port->membase) { if (!port->membase) {
pr_debug("console on " CDNS_UART_TTY_NAME "%i not present\n", pr_debug("console on " CDNS_UART_TTY_NAME "%i not present\n",
co->index); co->index);
...@@ -1563,6 +1565,17 @@ static int cdns_uart_probe(struct platform_device *pdev) ...@@ -1563,6 +1565,17 @@ static int cdns_uart_probe(struct platform_device *pdev)
pm_runtime_set_active(&pdev->dev); pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
#ifdef CONFIG_SERIAL_XILINX_PS_UART_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 (cdns_uart_uart_driver.cons->index == -1)
console_port = port;
#endif
rc = uart_add_one_port(&cdns_uart_uart_driver, port); rc = uart_add_one_port(&cdns_uart_uart_driver, port);
if (rc) { if (rc) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
...@@ -1570,6 +1583,12 @@ static int cdns_uart_probe(struct platform_device *pdev) ...@@ -1570,6 +1583,12 @@ static int cdns_uart_probe(struct platform_device *pdev)
goto err_out_pm_disable; goto err_out_pm_disable;
} }
#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE
/* This is not port which is used for console that's why clean it up */
if (cdns_uart_uart_driver.cons->index == -1)
console_port = NULL;
#endif
return 0; return 0;
err_out_pm_disable: err_out_pm_disable:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册