[PATCH v3 04/15] spi: qup: Add completion timeout
From: Varadarajan Narayanan <hidden>
Date: 2017-06-20 09:20:57
Also in:
linux-arm-msm, linux-spi, lkml
Subsystem:
arm/qualcomm mailing list, spi subsystem, the rest · Maintainers:
Mark Brown, Linus Torvalds
Add i/o completion timeout for DMA and PIO modes. Signed-off-by: Andy Gross <redacted> Signed-off-by: Varadarajan Narayanan <redacted> --- drivers/spi/spi-qup.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c
index 59e799f..d3ccf53 100644
--- a/drivers/spi/spi-qup.c
+++ b/drivers/spi/spi-qup.c@@ -330,7 +330,8 @@ static void spi_qup_dma_terminate(struct spi_master *master, dmaengine_terminate_all(master->dma_rx); } -static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer) +static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer, + unsigned long timeout) { struct spi_qup *qup = spi_master_get_devdata(master); int ret;
@@ -353,10 +354,17 @@ static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer) dma_async_issue_pending(master->dma_tx); } + if (xfer->rx_buf && !wait_for_completion_timeout(&qup->rxc, timeout)) + return -ETIMEDOUT; + + if (xfer->tx_buf && !wait_for_completion_timeout(&qup->txc, timeout)) + return -ETIMEDOUT; + return 0; } -static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer) +static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer, + unsigned long timeout) { struct spi_qup *qup = spi_master_get_devdata(master); int ret;
@@ -375,6 +383,9 @@ static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer) spi_qup_fifo_write(qup, xfer); + if (!wait_for_completion_timeout(&qup->done, timeout)) + return -ETIMEDOUT; + return 0; }
@@ -618,7 +629,6 @@ static int spi_qup_transfer_one(struct spi_master *master, timeout = DIV_ROUND_UP(xfer->len * 8, timeout); timeout = 100 * msecs_to_jiffies(timeout); - spin_lock_irqsave(&controller->lock, flags); controller->xfer = xfer; controller->error = 0;
@@ -629,10 +639,10 @@ static int spi_qup_transfer_one(struct spi_master *master, if (spi_qup_is_dma_xfer(controller->mode)) { reinit_completion(&controller->rxc); reinit_completion(&controller->txc); - ret = spi_qup_do_dma(master, xfer); + ret = spi_qup_do_dma(master, xfer, timeout); } else { reinit_completion(&controller->done); - ret = spi_qup_do_pio(master, xfer); + ret = spi_qup_do_pio(master, xfer, timeout); } if (ret)
--
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html