diff options
author | Varadarajan Narayanan <varada@codeaurora.org> | 2017-07-28 02:52:50 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-08-08 07:15:10 -0400 |
commit | 5f13fd60b1e709b9387877b0b65d605df9fff1d6 (patch) | |
tree | 8b769520a109ba21e088a7c62282771a202750ff | |
parent | 32ecab999f80370e5853cb907aa053ec4d64f86f (diff) |
spi: qup: Add completion timeout
Add i/o completion timeout for DMA and PIO modes.
Signed-off-by: Andy Gross <andy.gross@linaro.org>
Signed-off-by: Varadarajan Narayanan <varada@codeaurora.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/spi/spi-qup.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index abe799bbc67f..fdd34c3ce426 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c | |||
@@ -331,8 +331,10 @@ static void spi_qup_dma_terminate(struct spi_master *master, | |||
331 | dmaengine_terminate_all(master->dma_rx); | 331 | dmaengine_terminate_all(master->dma_rx); |
332 | } | 332 | } |
333 | 333 | ||
334 | static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer) | 334 | static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer, |
335 | unsigned long timeout) | ||
335 | { | 336 | { |
337 | struct spi_qup *qup = spi_master_get_devdata(master); | ||
336 | dma_async_tx_callback rx_done = NULL, tx_done = NULL; | 338 | dma_async_tx_callback rx_done = NULL, tx_done = NULL; |
337 | int ret; | 339 | int ret; |
338 | 340 | ||
@@ -357,10 +359,14 @@ static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer) | |||
357 | dma_async_issue_pending(master->dma_tx); | 359 | dma_async_issue_pending(master->dma_tx); |
358 | } | 360 | } |
359 | 361 | ||
362 | if (!wait_for_completion_timeout(&qup->done, timeout)) | ||
363 | return -ETIMEDOUT; | ||
364 | |||
360 | return 0; | 365 | return 0; |
361 | } | 366 | } |
362 | 367 | ||
363 | static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer) | 368 | static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer, |
369 | unsigned long timeout) | ||
364 | { | 370 | { |
365 | struct spi_qup *qup = spi_master_get_devdata(master); | 371 | struct spi_qup *qup = spi_master_get_devdata(master); |
366 | int ret; | 372 | int ret; |
@@ -379,6 +385,9 @@ static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer) | |||
379 | 385 | ||
380 | spi_qup_fifo_write(qup, xfer); | 386 | spi_qup_fifo_write(qup, xfer); |
381 | 387 | ||
388 | if (!wait_for_completion_timeout(&qup->done, timeout)) | ||
389 | return -ETIMEDOUT; | ||
390 | |||
382 | return 0; | 391 | return 0; |
383 | } | 392 | } |
384 | 393 | ||
@@ -632,9 +641,9 @@ static int spi_qup_transfer_one(struct spi_master *master, | |||
632 | spin_unlock_irqrestore(&controller->lock, flags); | 641 | spin_unlock_irqrestore(&controller->lock, flags); |
633 | 642 | ||
634 | if (spi_qup_is_dma_xfer(controller->mode)) | 643 | if (spi_qup_is_dma_xfer(controller->mode)) |
635 | ret = spi_qup_do_dma(master, xfer); | 644 | ret = spi_qup_do_dma(master, xfer, timeout); |
636 | else | 645 | else |
637 | ret = spi_qup_do_pio(master, xfer); | 646 | ret = spi_qup_do_pio(master, xfer, timeout); |
638 | 647 | ||
639 | if (ret) | 648 | if (ret) |
640 | goto exit; | 649 | goto exit; |