serial: sh-sci: Avoid FIFO clear for MCE toggle.
authorPaul Mundt <lethal@linux-sh.org>
Fri, 2 Dec 2011 10:02:06 +0000 (19:02 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Fri, 2 Dec 2011 10:02:06 +0000 (19:02 +0900)
When toggling the MCE support we don't want to concern ourselves with the
FIFO state, so ensure that the clearing bits are masked out when updating
the MCE state.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
drivers/tty/serial/sh-sci.c

index fd60d72eac89fef064454766216f07259cac0f47..761a800cb4831973450ea30263807ebbdb87d0b8 100644 (file)
@@ -1771,18 +1771,25 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
 
        sci_init_pins(port, termios->c_cflag);
 
-       if (s->cfg->capabilities & SCIx_HAVE_RTSCTS) {
-               reg = sci_getreg(port, SCFCR);
-               if (reg->size) {
-                       unsigned short ctrl;
+       reg = sci_getreg(port, SCFCR);
+       if (reg->size) {
+               unsigned short ctrl = sci_in(port, SCFCR);
 
-                       ctrl = sci_in(port, SCFCR);
+               if (s->cfg->capabilities & SCIx_HAVE_RTSCTS) {
                        if (termios->c_cflag & CRTSCTS)
                                ctrl |= SCFCR_MCE;
                        else
                                ctrl &= ~SCFCR_MCE;
-                       sci_out(port, SCFCR, ctrl);
                }
+
+               /*
+                * As we've done a sci_reset() above, ensure we don't
+                * interfere with the FIFOs while toggling MCE. As the
+                * reset values could still be set, simply mask them out.
+                */
+               ctrl &= ~(SCFCR_RFRST | SCFCR_TFRST);
+
+               sci_out(port, SCFCR, ctrl);
        }
 
        sci_out(port, SCSCR, s->cfg->scscr);