serial: sh-sci: Stop transfers in sci_shutdown()
authorGeert Uytterhoeven <geert+renesas@glider.be>
Sun, 26 Jun 2016 09:20:21 +0000 (11:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 26 Jun 2016 17:57:13 +0000 (10:57 -0700)
Make sure the transmitter and receiver are stopped when shutting down
the port, and related interrupts are disabled.

Without this:
  - New input data may be received into the RX FIFO, possibly
    triggering a new RX DMA completion,
  - Transfers will still be enabled on a subsequent startup of the UART,
    before the UART's FIFOs have been reset, causing reading of stale
    data.

Inspired by a patch in the BSP by Koji Matsuoka
<koji.matsuoka.xm@renesas.com>.

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 432d9acabf7fc5d14f21fca627b94e0ad34dc506..d86eee38aae6eba5953f0d7e4e5b2021bc6ee9f8 100644 (file)
@@ -1989,6 +1989,7 @@ static void sci_shutdown(struct uart_port *port)
 {
        struct sci_port *s = to_sci_port(port);
        unsigned long flags;
+       u16 scr;
 
        dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
 
@@ -1998,6 +1999,9 @@ static void sci_shutdown(struct uart_port *port)
        spin_lock_irqsave(&port->lock, flags);
        sci_stop_rx(port);
        sci_stop_tx(port);
+       /* Stop RX and TX, disable related interrupts, keep clock source */
+       scr = serial_port_in(port, SCSCR);
+       serial_port_out(port, SCSCR, scr & (SCSCR_CKE1 | SCSCR_CKE0));
        spin_unlock_irqrestore(&port->lock, flags);
 
 #ifdef CONFIG_SERIAL_SH_SCI_DMA