aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Herring <robh@kernel.org>2014-04-18 18:19:57 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-04-24 19:32:27 -0400
commit0d3c673e7881e691991b2a4745bd4f149603baa2 (patch)
tree3eb552f130c5ac8654552791e6cb4faf8bc39c98
parentd2fd6810a823bcde1ee232668f5689837aafa772 (diff)
tty/serial: pl011: add generic earlycon support
Add earlycon support for the pl011 serial port. This allows enabling the pl011 for console when early_params are processed. This is based on the arm64 earlyprintk support and is intended to replace it. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Russell King <linux@arm.linux.org.uk> Cc: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/kernel-parameters.txt7
-rw-r--r--drivers/tty/serial/Kconfig1
-rw-r--r--drivers/tty/serial/amba-pl011.c30
3 files changed, 37 insertions, 1 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 43842177b771..2609ead7ff55 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -883,6 +883,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
883 which are not unmapped. 883 which are not unmapped.
884 884
885 earlycon= [KNL] Output early console device and options. 885 earlycon= [KNL] Output early console device and options.
886
886 uart[8250],io,<addr>[,options] 887 uart[8250],io,<addr>[,options]
887 uart[8250],mmio,<addr>[,options] 888 uart[8250],mmio,<addr>[,options]
888 uart[8250],mmio32,<addr>[,options] 889 uart[8250],mmio32,<addr>[,options]
@@ -892,6 +893,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
892 (mmio) or 32-bit (mmio32). 893 (mmio) or 32-bit (mmio32).
893 The options are the same as for ttyS, above. 894 The options are the same as for ttyS, above.
894 895
896 pl011,<addr>
897 Start an early, polled-mode console on a pl011 serial
898 port at the specified address. The pl011 serial port
899 must already be setup and configured. Options are not
900 yet supported.
901
895 earlyprintk= [X86,SH,BLACKFIN,ARM] 902 earlyprintk= [X86,SH,BLACKFIN,ARM]
896 earlyprintk=vga 903 earlyprintk=vga
897 earlyprintk=efi 904 earlyprintk=efi
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 9fb6028ad900..4290d05875b1 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -60,6 +60,7 @@ config SERIAL_AMBA_PL011_CONSOLE
60 bool "Support for console on AMBA serial port" 60 bool "Support for console on AMBA serial port"
61 depends on SERIAL_AMBA_PL011=y 61 depends on SERIAL_AMBA_PL011=y
62 select SERIAL_CORE_CONSOLE 62 select SERIAL_CORE_CONSOLE
63 select SERIAL_EARLYCON
63 ---help--- 64 ---help---
64 Say Y here if you wish to use an AMBA PrimeCell UART as the system 65 Say Y here if you wish to use an AMBA PrimeCell UART as the system
65 console (the system console is the device which receives all kernel 66 console (the system console is the device which receives all kernel
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index dacf0a09ab24..ee3d80346780 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -303,7 +303,7 @@ static void pl011_dma_probe_initcall(struct device *dev, struct uart_amba_port *
303 303
304 /* Optionally make use of an RX channel as well */ 304 /* Optionally make use of an RX channel as well */
305 chan = dma_request_slave_channel(dev, "rx"); 305 chan = dma_request_slave_channel(dev, "rx");
306 306
307 if (!chan && plat->dma_rx_param) { 307 if (!chan && plat->dma_rx_param) {
308 chan = dma_request_channel(mask, plat->dma_filter, plat->dma_rx_param); 308 chan = dma_request_channel(mask, plat->dma_filter, plat->dma_rx_param);
309 309
@@ -2045,6 +2045,34 @@ static struct console amba_console = {
2045}; 2045};
2046 2046
2047#define AMBA_CONSOLE (&amba_console) 2047#define AMBA_CONSOLE (&amba_console)
2048
2049static void pl011_putc(struct uart_port *port, int c)
2050{
2051 while (readl(port->membase + UART01x_FR) & UART01x_FR_TXFF)
2052 ;
2053 writeb(c, port->membase + UART01x_DR);
2054 while (readl(port->membase + UART01x_FR) & UART01x_FR_BUSY)
2055 ;
2056}
2057
2058static void pl011_early_write(struct console *con, const char *s, unsigned n)
2059{
2060 struct earlycon_device *dev = con->data;
2061
2062 uart_console_write(&dev->port, s, n, pl011_putc);
2063}
2064
2065static int __init pl011_early_console_setup(struct earlycon_device *device,
2066 const char *opt)
2067{
2068 if (!device->port.membase)
2069 return -ENODEV;
2070
2071 device->con->write = pl011_early_write;
2072 return 0;
2073}
2074EARLYCON_DECLARE(pl011, pl011_early_console_setup);
2075
2048#else 2076#else
2049#define AMBA_CONSOLE NULL 2077#define AMBA_CONSOLE NULL
2050#endif 2078#endif