Commit ec84aa0a authored by Martin Blumenstingl's avatar Martin Blumenstingl Committed by Greg Kroah-Hartman

tty: serial: lantiq: implement earlycon support

This allows enabling earlycon for devices with a Lantiq serial console
by splitting lqasc_serial_port_write() from lqasc_console_write() and
re-using the new function for earlycon's write callback.

The kernel-parameter name matches the driver name ("lantiq"), similar
to how other drivers implement this.
Signed-off-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2aaa9573
...@@ -966,6 +966,12 @@ ...@@ -966,6 +966,12 @@
serial port must already be setup and configured. serial port must already be setup and configured.
Options are not yet supported. Options are not yet supported.
lantiq,<addr>
Start an early, polled-mode console on a lantiq serial
(lqasc) port at the specified address. The serial port
must already be setup and configured. Options are not
yet supported.
lpuart,<addr> lpuart,<addr>
lpuart32,<addr> lpuart32,<addr>
Use early console provided by Freescale LP UART driver Use early console provided by Freescale LP UART driver
......
...@@ -1161,6 +1161,7 @@ config SERIAL_LANTIQ ...@@ -1161,6 +1161,7 @@ config SERIAL_LANTIQ
depends on LANTIQ depends on LANTIQ
select SERIAL_CORE select SERIAL_CORE
select SERIAL_CORE_CONSOLE select SERIAL_CORE_CONSOLE
select SERIAL_EARLYCON
help help
Support for console and UART on Lantiq SoCs. Support for console and UART on Lantiq SoCs.
......
...@@ -590,13 +590,20 @@ lqasc_console_putchar(struct uart_port *port, int ch) ...@@ -590,13 +590,20 @@ lqasc_console_putchar(struct uart_port *port, int ch)
ltq_w8(ch, port->membase + LTQ_ASC_TBUF); ltq_w8(ch, port->membase + LTQ_ASC_TBUF);
} }
static void lqasc_serial_port_write(struct uart_port *port, const char *s,
u_int count)
{
unsigned long flags;
spin_lock_irqsave(&ltq_asc_lock, flags);
uart_console_write(port, s, count, lqasc_console_putchar);
spin_unlock_irqrestore(&ltq_asc_lock, flags);
}
static void static void
lqasc_console_write(struct console *co, const char *s, u_int count) lqasc_console_write(struct console *co, const char *s, u_int count)
{ {
struct ltq_uart_port *ltq_port; struct ltq_uart_port *ltq_port;
struct uart_port *port;
unsigned long flags;
if (co->index >= MAXPORTS) if (co->index >= MAXPORTS)
return; return;
...@@ -605,11 +612,7 @@ lqasc_console_write(struct console *co, const char *s, u_int count) ...@@ -605,11 +612,7 @@ lqasc_console_write(struct console *co, const char *s, u_int count)
if (!ltq_port) if (!ltq_port)
return; return;
port = &ltq_port->port; lqasc_serial_port_write(&ltq_port->port, s, count);
spin_lock_irqsave(&ltq_asc_lock, flags);
uart_console_write(port, s, count, lqasc_console_putchar);
spin_unlock_irqrestore(&ltq_asc_lock, flags);
} }
static int __init static int __init
...@@ -659,6 +662,27 @@ lqasc_console_init(void) ...@@ -659,6 +662,27 @@ lqasc_console_init(void)
} }
console_initcall(lqasc_console_init); console_initcall(lqasc_console_init);
static void lqasc_serial_early_console_write(struct console *co,
const char *s,
u_int count)
{
struct earlycon_device *dev = co->data;
lqasc_serial_port_write(&dev->port, s, count);
}
static int __init
lqasc_serial_early_console_setup(struct earlycon_device *device,
const char *opt)
{
if (!device->port.membase)
return -ENODEV;
device->con->write = lqasc_serial_early_console_write;
return 0;
}
OF_EARLYCON_DECLARE(lantiq, DRVNAME, lqasc_serial_early_console_setup);
static struct uart_driver lqasc_reg = { static struct uart_driver lqasc_reg = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.driver_name = DRVNAME, .driver_name = DRVNAME,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment