tty/serial: 8250_early: Add support for PXA UARTs
authorRob Herring <robh@kernel.org>
Tue, 27 Jan 2015 04:50:09 +0000 (22:50 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 Feb 2015 18:11:28 +0000 (10:11 -0800)
The PXA variant of the 8250 UART adds a UART enable bit which must not
be cleared. Make the earlycon support maintain this bit if it is set.
This implies some initialization of the UART, but we cannot
unconditionally set the bit as some other variants require this bit to
be clear for other functions.

Signed-off-by: Rob Herring <robh@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: linux-serial@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_early.c

index ce2a8abd1f549c8cd5e5e6451395a052e473acdd..c31a22b4f84524a0226343cab01532da884d1bac 100644 (file)
@@ -93,10 +93,10 @@ static void __init early_serial8250_write(struct console *console,
        struct uart_port *port = &early_device->port;
        unsigned int ier;
 
-       /* Save the IER and disable interrupts */
+       /* Save the IER and disable interrupts preserving the UUE bit */
        ier = serial8250_early_in(port, UART_IER);
        if (ier)
-               serial8250_early_out(port, UART_IER, 0);
+               serial8250_early_out(port, UART_IER, ier & UART_IER_UUE);
 
        uart_console_write(port, s, count, serial_putc);
 
@@ -127,9 +127,11 @@ static void __init init_port(struct earlycon_device *device)
        struct uart_port *port = &device->port;
        unsigned int divisor;
        unsigned char c;
+       unsigned int ier;
 
        serial8250_early_out(port, UART_LCR, 0x3);      /* 8n1 */
-       serial8250_early_out(port, UART_IER, 0);        /* no interrupt */
+       ier = serial8250_early_in(port, UART_IER);
+       serial8250_early_out(port, UART_IER, ier & UART_IER_UUE); /* no interrupt */
        serial8250_early_out(port, UART_FCR, 0);        /* no fifo */
        serial8250_early_out(port, UART_MCR, 0x3);      /* DTR + RTS */