serial: imx: terminate the RX DMA when the UART is suspending
authorHuang Shijie <shijie8@gmail.com>
Fri, 19 Sep 2014 07:33:12 +0000 (15:33 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Sep 2014 01:26:38 +0000 (21:26 -0400)
When the uart port is suspending, the RX data is useless.
So in this case, we can terminate the RX DMA right now.

Signed-off-by: Huang Shijie <b32955@freescale.com>
Signed-off-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/imx.c

index c7683d747c18e12440c83ddd2fbead9e3d523a10..db749f768ac42bea092281b107e009d3d5e557f3 100644 (file)
@@ -436,12 +436,14 @@ static void imx_stop_rx(struct uart_port *port)
        struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
 
-       /*
-        * We are maybe in the SMP context, so if the DMA TX thread is running
-        * on other cpu, we have to wait for it to finish.
-        */
-       if (sport->dma_is_enabled && sport->dma_is_rxing)
-               return;
+       if (sport->dma_is_enabled && sport->dma_is_rxing) {
+               if (sport->port.suspended) {
+                       dmaengine_terminate_all(sport->dma_chan_rx);
+                       sport->dma_is_rxing = 0;
+               } else {
+                       return;
+               }
+       }
 
        temp = readl(sport->port.membase + UCR2);
        writel(temp & ~UCR2_RXEN, sport->port.membase + UCR2);