serial-uartlite: add earlycon support
authorRich Felker <dalias@libc.org>
Fri, 8 Jan 2016 20:34:05 +0000 (15:34 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Feb 2016 06:56:43 +0000 (22:56 -0800)
Microblaze currently uses the old earlyprintk system, rather than the
unified earlycon support, to show boot messages on uartlite. Add
earlycon support so that other archs using uartlite can benefit from
it. The new code in uartlite.c is copied almost verbatim from
arch/microblaze/kernel/early_printk.c.

Signed-off-by: Rich Felker <dalias@libc.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/Kconfig
drivers/tty/serial/uartlite.c

index 54b6f2c15f721900289237c600c1ca382ed25914..bdbe1c533c6a1a3485722d53aa7466ba69f24b41 100644 (file)
@@ -610,6 +610,7 @@ config SERIAL_UARTLITE_CONSOLE
        bool "Support for console on Xilinx uartlite serial port"
        depends on SERIAL_UARTLITE=y
        select SERIAL_CORE_CONSOLE
+       select SERIAL_EARLYCON
        help
          Say Y here if you wish to use a Xilinx uartlite as the system
          console (the system console is the device which receives all kernel
index b1c6bd3d483fa87a0372928ebd59cbdf9173d17d..c249aee887d21708e0b03b27fc8a377d356621be 100644 (file)
@@ -519,6 +519,47 @@ static int __init ulite_console_init(void)
 
 console_initcall(ulite_console_init);
 
+static void early_uartlite_putc(struct uart_port *port, int c)
+{
+       /*
+        * Limit how many times we'll spin waiting for TX FIFO status.
+        * This will prevent lockups if the base address is incorrectly
+        * set, or any other issue on the UARTLITE.
+        * This limit is pretty arbitrary, unless we are at about 10 baud
+        * we'll never timeout on a working UART.
+        */
+
+       unsigned retries = 1000000;
+       /* read status bit - 0x8 offset */
+       while (--retries && (readl(port->membase + 8) & (1 << 3)))
+               ;
+
+       /* Only attempt the iowrite if we didn't timeout */
+       /* write to TX_FIFO - 0x4 offset */
+       if (retries)
+               writel(c & 0xff, port->membase + 4);
+}
+
+static void early_uartlite_write(struct console *console,
+                                const char *s, unsigned n)
+{
+       struct earlycon_device *device = console->data;
+       uart_console_write(&device->port, s, n, early_uartlite_putc);
+}
+
+static int __init early_uartlite_setup(struct earlycon_device *device,
+                                      const char *options)
+{
+       if (!device->port.membase)
+               return -ENODEV;
+
+       device->con->write = early_uartlite_write;
+       return 0;
+}
+EARLYCON_DECLARE(uartlite, early_uartlite_setup);
+OF_EARLYCON_DECLARE(uartlite_b, "xlnx,opb-uartlite-1.00.b", early_uartlite_setup);
+OF_EARLYCON_DECLARE(uartlite_a, "xlnx,xps-uartlite-1.00.a", early_uartlite_setup);
+
 #endif /* CONFIG_SERIAL_UARTLITE_CONSOLE */
 
 static struct uart_driver ulite_uart_driver = {
This page took 0.026434 seconds and 5 git commands to generate.