|
@@ -112,6 +112,7 @@ struct omap8250_priv {
|
|
|
struct work_struct qos_work;
|
|
|
struct uart_8250_dma omap8250_dma;
|
|
|
spinlock_t rx_dma_lock;
|
|
|
+ bool rx_dma_broken;
|
|
|
};
|
|
|
|
|
|
static u32 uart_read(struct uart_8250_port *up, u32 reg)
|
|
@@ -761,6 +762,7 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
|
|
|
struct omap8250_priv *priv = p->port.private_data;
|
|
|
struct uart_8250_dma *dma = p->dma;
|
|
|
unsigned long flags;
|
|
|
+ int ret;
|
|
|
|
|
|
spin_lock_irqsave(&priv->rx_dma_lock, flags);
|
|
|
|
|
@@ -769,7 +771,9 @@ static void omap_8250_rx_dma_flush(struct uart_8250_port *p)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- dmaengine_pause(dma->rxchan);
|
|
|
+ ret = dmaengine_pause(dma->rxchan);
|
|
|
+ if (WARN_ON_ONCE(ret))
|
|
|
+ priv->rx_dma_broken = true;
|
|
|
|
|
|
spin_unlock_irqrestore(&priv->rx_dma_lock, flags);
|
|
|
|
|
@@ -813,6 +817,9 @@ static int omap_8250_rx_dma(struct uart_8250_port *p, unsigned int iir)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ if (priv->rx_dma_broken)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
spin_lock_irqsave(&priv->rx_dma_lock, flags);
|
|
|
|
|
|
if (dma->rx_running)
|
|
@@ -1207,6 +1214,11 @@ static int omap8250_probe(struct platform_device *pdev)
|
|
|
|
|
|
if (of_machine_is_compatible("ti,am33xx"))
|
|
|
priv->habit |= OMAP_DMA_TX_KICK;
|
|
|
+ /*
|
|
|
+ * pause is currently not supported atleast on omap-sdma
|
|
|
+ * and edma on most earlier kernels.
|
|
|
+ */
|
|
|
+ priv->rx_dma_broken = true;
|
|
|
}
|
|
|
}
|
|
|
#endif
|