Skip to content

Commit 93c88de

Browse files
committed
spi: spi-imx: complete DMA transfers on target mode
Init RX channel before RX in target mode. When SPI is used in target_mode and DMA transfer are used, completing the PIO/ISR transfer won't work. DMA transfers have to be completed by own completion with channel termination. Signed-off-by: Andrej Valek <[email protected]>
1 parent be78e49 commit 93c88de

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

drivers/spi/spi-imx.c

Lines changed: 16 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,18 @@ 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+
dmaengine_terminate_sync(controller->dma_rx);
1842+
1843+
if (!completion_done(&spi_imx->dma_tx_completion))
1844+
complete(&spi_imx->dma_tx_completion);
1845+
dmaengine_terminate_sync(controller->dma_tx);
1846+
} else {
1847+
complete(&spi_imx->xfer_done);
1848+
}
18381849

18391850
return 0;
18401851
}

0 commit comments

Comments
 (0)