serial: sh-sci: Clear RX, error, and break flags during reset
authorGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 24 Jun 2016 14:59:15 +0000 (16:59 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 25 Jun 2016 16:09:53 +0000 (09:09 -0700)
Setting the FIFO reset bits is not sufficient to reset the RX FIFO.
After this the status register's RDF flag bit may still be set, causing
the reception of one stale byte of data.

To fix this, clear all status flag bits related to reception, error, and
break handling, cfr. the initialization flowchart in the datasheet.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sh-sci.c

index d88c84cd88a48b3885674ad474b68c9d318666bf..408f706393debf8206c4a27d6590756edacdf8dc 100644 (file)
@@ -2152,6 +2152,10 @@ static void sci_reset(struct uart_port *port)
        reg = sci_getreg(port, SCFCR);
        if (reg->size)
                serial_port_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
+
+       sci_clear_SCxSR(port,
+                       SCxSR_RDxF_CLEAR(port) & SCxSR_ERROR_CLEAR(port) &
+                       SCxSR_BREAK_CLEAR(port));
 }
 
 static void sci_set_termios(struct uart_port *port, struct ktermios *termios,