aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/amba-pl011.c
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 /drivers/tty/serial/amba-pl011.c
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>
Diffstat (limited to 'drivers/tty/serial/amba-pl011.c')
-rw-r--r--drivers/tty/serial/amba-pl011.c30
1 files changed, 29 insertions, 1 deletions
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