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