Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -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
+1 −0
Original line number Original line Diff line number Diff line
@@ -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.


+31 −7
Original line number Original line Diff line number Diff line
@@ -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,