summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2012-03-22 15:33:52 +0530
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-04-05 08:40:31 -0700
commit4ac93630c1c9482b8b99f6c6071754e0721dde7f (patch)
tree9ffc745a6cc8a1d944c68f59a76e4a7900e64f23 /drivers/spi
parent4f7cac2afefe67fe4bc86becd5970437f12d7e0c (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.c21
-rw-r--r--drivers/spi/spi_slave_tegra.c21
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;