Skip to content

Commit c71ea1a

Browse files
committed
spi: spi-imx: complete DMA transfers on target mode
Even if the spi_target_abort was called, the DMA transfers have been pending Signed-off-by: Andrej Valek <[email protected]>
1 parent be78e49 commit c71ea1a

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

drivers/spi/spi-imx.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1580,19 +1580,19 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
15801580

15811581
spi_imx->devtype_data->trigger(spi_imx);
15821582

1583-
if (wait_for_completion_interruptible(&spi_imx->dma_tx_completion) ||
1583+
if (wait_for_completion_interruptible(&spi_imx->dma_rx_completion) ||
15841584
spi_imx->target_aborted) {
15851585
dev_dbg(spi_imx->dev,
1586-
"I/O Error in DMA TX interrupted\n");
1586+
"I/O Error in DMA RX interrupted\n");
15871587
dmaengine_terminate_all(controller->dma_tx);
15881588
dmaengine_terminate_all(controller->dma_rx);
15891589
return -EINTR;
15901590
}
15911591

1592-
if (wait_for_completion_interruptible(&spi_imx->dma_rx_completion) ||
1592+
if (wait_for_completion_interruptible(&spi_imx->dma_tx_completion) ||
15931593
spi_imx->target_aborted) {
15941594
dev_dbg(spi_imx->dev,
1595-
"I/O Error in DMA RX interrupted\n");
1595+
"I/O Error in DMA TX interrupted\n");
15961596
dmaengine_terminate_all(controller->dma_tx);
15971597
dmaengine_terminate_all(controller->dma_rx);
15981598
return -EINTR;
@@ -1834,7 +1834,26 @@ static int spi_imx_target_abort(struct spi_controller *controller)
18341834
struct spi_imx_data *spi_imx = spi_controller_get_devdata(controller);
18351835

18361836
spi_imx->target_aborted = true;
1837-
complete(&spi_imx->xfer_done);
1837+
1838+
if (spi_imx->target_mode && spi_imx->usedma) {
1839+
if (!completion_done(&spi_imx->dma_rx_completion))
1840+
complete(&spi_imx->dma_rx_completion);
1841+
1842+
if (controller->dma_rx) {
1843+
dmaengine_terminate_all(controller->dma_rx);
1844+
dmaengine_synchronize(controller->dma_rx);
1845+
}
1846+
1847+
if (!completion_done(&spi_imx->dma_tx_completion))
1848+
complete(&spi_imx->dma_tx_completion);
1849+
1850+
if (controller->dma_tx) {
1851+
dmaengine_terminate_all(controller->dma_tx);
1852+
dmaengine_synchronize(controller->dma_tx);
1853+
}
1854+
} else {
1855+
complete(&spi_imx->xfer_done);
1856+
}
18381857

18391858
return 0;
18401859
}

0 commit comments

Comments
 (0)