diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2012-03-22 15:33:52 +0530 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-04-05 08:40:31 -0700 |
commit | 4ac93630c1c9482b8b99f6c6071754e0721dde7f (patch) | |
tree | 9ffc745a6cc8a1d944c68f59a76e4a7900e64f23 /drivers/spi | |
parent | 4f7cac2afefe67fe4bc86becd5970437f12d7e0c (diff) |
spi: tegra: Use tegra_dma_cancel() to abort request
To terminate request from dma, use the tegra_dma_cancel() inplace of
tegra_dma_dequeue().
The api tegra_dma_dequeue() is getting to be obsolete.
Change-Id: I297e67433a2118377ecb9b028dcf8fa82e09f0e2
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/91752
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Ashwini Ghuge <aghuge@nvidia.com>
Tested-by: Ashwini Ghuge <aghuge@nvidia.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi-tegra.c | 21 | ||||
-rw-r--r-- | drivers/spi/spi_slave_tegra.c | 21 |
2 files changed, 26 insertions, 16 deletions
diff --git a/drivers/spi/spi-tegra.c b/drivers/spi/spi-tegra.c index 6810f611c55c..3f913389dd7c 100644 --- a/drivers/spi/spi-tegra.c +++ b/drivers/spi/spi-tegra.c @@ -263,6 +263,14 @@ static inline void spi_tegra_writel(struct spi_tegra_data *tspi, writel(val, tspi->base + reg); } +static void cancel_dma(struct tegra_dma_channel *dma_chan, + struct tegra_dma_req *req) +{ + tegra_dma_cancel(dma_chan); + if (req->status == -TEGRA_DMA_REQ_ERROR_ABORTED) + req->complete(req); +} + static void spi_tegra_clear_status(struct spi_tegra_data *tspi) { unsigned long val; @@ -566,8 +574,7 @@ static int spi_tegra_start_dma_based_transfer( dev_err(&tspi->pdev->dev, "Error in starting rx dma error = %d\n", ret); if (tspi->cur_direction & DATA_DIR_TX) - tegra_dma_dequeue_req(tspi->tx_dma, - &tspi->tx_dma_req); + cancel_dma(tspi->tx_dma, &tspi->tx_dma_req); return ret; } } @@ -1103,14 +1110,13 @@ static irqreturn_t spi_tegra_isr_thread(int irq, void *context_data) /* Abort dmas if any error */ if (tspi->cur_direction & DATA_DIR_TX) { if (tspi->tx_status) { - tegra_dma_dequeue_req(tspi->tx_dma, &tspi->tx_dma_req); + cancel_dma(tspi->tx_dma, &tspi->tx_dma_req); err += 1; } else { wait_status = wait_for_completion_interruptible_timeout( &tspi->tx_dma_complete, SLINK_DMA_TIMEOUT); if (wait_status <= 0) { - tegra_dma_dequeue_req(tspi->tx_dma, - &tspi->tx_dma_req); + cancel_dma(tspi->tx_dma, &tspi->tx_dma_req); dev_err(&tspi->pdev->dev, "Error in Dma Tx transfer\n"); err += 1; @@ -1120,14 +1126,13 @@ static irqreturn_t spi_tegra_isr_thread(int irq, void *context_data) if (tspi->cur_direction & DATA_DIR_RX) { if (tspi->rx_status) { - tegra_dma_dequeue_req(tspi->rx_dma, &tspi->rx_dma_req); + cancel_dma(tspi->rx_dma, &tspi->rx_dma_req); err += 2; } else { wait_status = wait_for_completion_interruptible_timeout( &tspi->rx_dma_complete, SLINK_DMA_TIMEOUT); if (wait_status <= 0) { - tegra_dma_dequeue_req(tspi->rx_dma, - &tspi->rx_dma_req); + cancel_dma(tspi->rx_dma, &tspi->rx_dma_req); dev_err(&tspi->pdev->dev, "Error in Dma Rx transfer\n"); err += 2; diff --git a/drivers/spi/spi_slave_tegra.c b/drivers/spi/spi_slave_tegra.c index c17a8cb1ac15..7ee53730e736 100644 --- a/drivers/spi/spi_slave_tegra.c +++ b/drivers/spi/spi_slave_tegra.c @@ -260,6 +260,14 @@ static inline void spi_tegra_writel(struct spi_tegra_data *tspi, writel(val, tspi->base + reg); } +static void cancel_dma(struct tegra_dma_channel *dma_chan, + struct tegra_dma_req *req) +{ + tegra_dma_cancel(dma_chan); + if (req->status == -TEGRA_DMA_REQ_ERROR_ABORTED) + req->complete(req); +} + int spi_tegra_register_callback(struct spi_device *spi, callback func, void *client_data) { @@ -541,8 +549,7 @@ static int spi_tegra_start_dma_based_transfer( dev_err(&tspi->pdev->dev, "Error in starting rx dma " " error = %d\n", ret); if (tspi->cur_direction & DATA_DIR_TX) - tegra_dma_dequeue_req(tspi->tx_dma, - &tspi->tx_dma_req); + cancel_dma(tspi->tx_dma, &tspi->tx_dma_req); return ret; } } @@ -974,14 +981,13 @@ static irqreturn_t spi_tegra_isr_thread(int irq, void *context_data) /* Abort dmas if any error */ if (tspi->cur_direction & DATA_DIR_TX) { if (tspi->tx_status) { - tegra_dma_dequeue_req(tspi->tx_dma, &tspi->tx_dma_req); + cancel_dma(tspi->tx_dma, &tspi->tx_dma_req); err += 1; } else { wait_status = wait_for_completion_interruptible_timeout( &tspi->tx_dma_complete, SLINK_DMA_TIMEOUT); if (wait_status <= 0) { - tegra_dma_dequeue_req(tspi->tx_dma, - &tspi->tx_dma_req); + cancel_dma(tspi->tx_dma, &tspi->tx_dma_req); dev_err(&tspi->pdev->dev, "Error in Dma Tx " "transfer\n"); err += 1; @@ -991,14 +997,13 @@ static irqreturn_t spi_tegra_isr_thread(int irq, void *context_data) if (tspi->cur_direction & DATA_DIR_RX) { if (tspi->rx_status) { - tegra_dma_dequeue_req(tspi->rx_dma, &tspi->rx_dma_req); + cancel_dma(tspi->rx_dma, &tspi->rx_dma_req); err += 2; } else { wait_status = wait_for_completion_interruptible_timeout( &tspi->rx_dma_complete, SLINK_DMA_TIMEOUT); if (wait_status <= 0) { - tegra_dma_dequeue_req(tspi->rx_dma, - &tspi->rx_dma_req); + cancel_dma(tspi->rx_dma, &tspi->rx_dma_req); dev_err(&tspi->pdev->dev, "Error in Dma Rx " "transfer\n"); err += 2; |