serial: cadence: Add generic earlycon support
authorMichal Simek <michal.simek@xilinx.com>
Wed, 10 Sep 2014 10:43:02 +0000 (12:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Sep 2014 01:32:37 +0000 (21:32 -0400)
Add earlycon support for the cadence serial port.
This is based on recent patches:
"tty/serial: pl011: add generic earlycon support"
(sha1: 0d3c673e7881e691991b2a4745bd4f149603baa2)
"tty/serial: add arm/arm64 semihosting earlycon"
(sha1: d50d7269ebcb438afa346cdffce0f4e2a1b9e831)

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/kernel-parameters.txt
drivers/tty/serial/Kconfig
drivers/tty/serial/xilinx_uartps.c

index 10d51c2..adc1cd7 100644 (file)
@@ -921,6 +921,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 
        earlycon=       [KNL] Output early console device and options.
 
+               cdns,<addr>
+                       Start an early, polled-mode console on a cadence serial
+                       port at the specified address. The cadence serial port
+                       must already be setup and configured. Options are not
+                       yet supported.
+
                uart[8250],io,<addr>[,options]
                uart[8250],mmio,<addr>[,options]
                uart[8250],mmio32,<addr>[,options]
index 81f6ee7..02a896f 100644 (file)
@@ -1429,6 +1429,7 @@ config SERIAL_XILINX_PS_UART_CONSOLE
        bool "Cadence UART console support"
        depends on SERIAL_XILINX_PS_UART=y
        select SERIAL_CORE_CONSOLE
+       select SERIAL_EARLYCON
        help
          Enable a Cadence UART port to be the system console.
 
index 7f8027f..200c1af 100644 (file)
@@ -1051,6 +1051,25 @@ static void cdns_uart_console_putchar(struct uart_port *port, int ch)
        cdns_uart_writel(ch, CDNS_UART_FIFO_OFFSET);
 }
 
+static void cdns_early_write(struct console *con, const char *s, unsigned n)
+{
+       struct earlycon_device *dev = con->data;
+
+       uart_console_write(&dev->port, s, n, cdns_uart_console_putchar);
+}
+
+static int __init cdns_early_console_setup(struct earlycon_device *device,
+                                          const char *opt)
+{
+       if (!device->port.membase)
+               return -ENODEV;
+
+       device->con->write = cdns_early_write;
+
+       return 0;
+}
+EARLYCON_DECLARE(cdns, cdns_early_console_setup);
+
 /**
  * cdns_uart_console_write - perform write operation
  * @co: Console handle