summaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/imx.c
diff options
context:
space:
mode:
authorDirk Behme2014-12-09 10:11:27 +0100
committerGreg Kroah-Hartman2015-01-09 23:23:07 +0100
commit82e86ae941194e6b6278ff67aad257b018e0684f (patch)
tree9a9b4b80400cb3de2f8d58750f78f93a566068f0 /drivers/tty/serial/imx.c
parentserial: imx: unmap sg in case of dmaengine_prep_slave_sg() failure (diff)
downloadkernel-qcow2-linux-82e86ae941194e6b6278ff67aad257b018e0684f.tar.gz
kernel-qcow2-linux-82e86ae941194e6b6278ff67aad257b018e0684f.tar.xz
kernel-qcow2-linux-82e86ae941194e6b6278ff67aad257b018e0684f.zip
serial: imx: unmap scatter gather list in imx_flush_buffer
First, reformat the code to exit immediately. This allows us to add more code in more readable format. In case the TX DMA was still running, remove and disable it's resources. Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/imx.c')
-rw-r--r--drivers/tty/serial/imx.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index b4cf24c64a15..952730ab9067 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1250,10 +1250,17 @@ static void imx_shutdown(struct uart_port *port)
static void imx_flush_buffer(struct uart_port *port)
{
struct imx_port *sport = (struct imx_port *)port;
+ struct scatterlist *sgl = &sport->tx_sgl[0];
- if (sport->dma_is_enabled) {
- sport->tx_bytes = 0;
- dmaengine_terminate_all(sport->dma_chan_tx);
+ if (!sport->dma_chan_tx)
+ return;
+
+ sport->tx_bytes = 0;
+ dmaengine_terminate_all(sport->dma_chan_tx);
+ if (sport->dma_is_txing) {
+ dma_unmap_sg(sport->port.dev, sgl, sport->dma_tx_nents,
+ DMA_TO_DEVICE);
+ sport->dma_is_txing = false;
}
}