diff --git a/[refs] b/[refs] index 1709c27188c6..4457802e89c1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4539c24fe4f92c09ee668ef959d3e8180df619b9 +refs/heads/master: 5f873bae704cf8b7cbd64b5720912266286c9146 diff --git a/trunk/drivers/tty/serial/8250.c b/trunk/drivers/tty/serial/8250.c index a5e290de8c93..b40f7b90c81d 100644 --- a/trunk/drivers/tty/serial/8250.c +++ b/trunk/drivers/tty/serial/8250.c @@ -1433,6 +1433,27 @@ static void serial8250_enable_ms(struct uart_port *port) serial_out(up, UART_IER, up->ier); } +/* + * Clear the Tegra rx fifo after a break + * + * FIXME: This needs to become a port specific callback once we have a + * framework for this + */ +static void clear_rx_fifo(struct uart_8250_port *up) +{ + unsigned int status, tmout = 10000; + do { + status = serial_in(up, UART_LSR); + if (status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) + status = serial_in(up, UART_RX); + else + break; + if (--tmout == 0) + break; + udelay(1); + } while (1); +} + static void receive_chars(struct uart_8250_port *up, unsigned int *status) { @@ -1467,6 +1488,13 @@ receive_chars(struct uart_8250_port *up, unsigned int *status) if (lsr & UART_LSR_BI) { lsr &= ~(UART_LSR_FE | UART_LSR_PE); up->port.icount.brk++; + /* + * If tegra port then clear the rx fifo to + * accept another break/character. + */ + if (up->port.type == PORT_TEGRA) + clear_rx_fifo(up); + /* * We do the SysRQ and SAK checking * here because otherwise the break diff --git a/trunk/include/linux/serial_reg.h b/trunk/include/linux/serial_reg.h index 5f66e8499fb9..c75bda37c18e 100644 --- a/trunk/include/linux/serial_reg.h +++ b/trunk/include/linux/serial_reg.h @@ -119,6 +119,7 @@ #define UART_MCR_DTR 0x01 /* DTR complement */ #define UART_LSR 5 /* In: Line Status Register */ +#define UART_LSR_FIFOE 0x80 /* Fifo error */ #define UART_LSR_TEMT 0x40 /* Transmitter empty */ #define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */ #define UART_LSR_BI 0x10 /* Break interrupt indicator */