|
@@ -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
|