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: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Martin Blumenstingl 2016-12-11 21:42:23 +01:00 committed by Greg Kroah-Hartman
parent 2aaa957361
commit ec84aa0a92
3 changed files with 38 additions and 7 deletions

View File

@ -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

View File

@ -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.

View File

@ -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)
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)
} }
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,