summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gong <b38343@freescale.com>2014-12-13 12:46:31 +0800
committerRobin Gong <b38343@freescale.com>2014-12-19 10:25:18 +0800
commitd0fa9b74641285ef62bad2e8e39ee13467549967 (patch)
treeb70f22d9dcb5a9c26a59ed722ef9dfbaf73b4e17
parentef26c0a7706c5c5319d56de28cb3244bf0ab2cdb (diff)
MLK-9986-1 spi: spi-imx: change dma timeout value with transfer length
Change dma timeout value with the transfer length if the length bigger than 1 MB. Signed-off-by: Robin Gong <b38343@freescale.com> (cherry picked from commit fb12a91a9ce6cd99d4c08483627ea0c94363ee08)
-rw-r--r--drivers/spi/spi-imx.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 3637847b5370..b1f5ccc8e317 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2004-2014 Freescale Semiconductor, Inc. All Rights Reserved.
* Copyright (C) 2008 Juergen Beisert
*
* This program is free software; you can redistribute it and/or
@@ -56,7 +56,10 @@
/* The maximum bytes that a sdma BD can transfer.*/
#define MAX_SDMA_BD_BYTES (1 << 15)
-#define IMX_DMA_TIMEOUT (msecs_to_jiffies(3000))
+/* 3 Sec for 1MB or less than 1MB, else change with the transfer length */
+#define IMX_DEFAULT_DMA_TIMEOUT (msecs_to_jiffies(3000))
+#define IMX_DMA_TIMEOUT(len) ((len < 0x100000) ? IMX_DEFAULT_DMA_TIMEOUT : \
+ len * IMX_DEFAULT_DMA_TIMEOUT / 0x100000)
struct spi_imx_config {
unsigned int speed_hz;
unsigned int bpw;
@@ -940,19 +943,19 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
dma_async_issue_pending(master->dma_rx);
/* Wait SDMA to finish the data transfer.*/
ret = wait_for_completion_timeout(&spi_imx->dma_tx_completion,
- IMX_DMA_TIMEOUT);
+ IMX_DMA_TIMEOUT(transfer->len));
if (!ret) {
- pr_warn("%s %s: I/O Error in DMA TX\n",
+ pr_warn("%s %s: I/O Error in DMA TX:%x\n",
dev_driver_string(&master->dev),
- dev_name(&master->dev));
+ dev_name(&master->dev), transfer->len);
dmaengine_terminate_all(master->dma_tx);
} else {
ret = wait_for_completion_timeout(&spi_imx->dma_rx_completion,
- IMX_DMA_TIMEOUT);
+ IMX_DMA_TIMEOUT(transfer->len));
if (!ret) {
- pr_warn("%s %s: I/O Error in DMA RX\n",
+ pr_warn("%s %s: I/O Error in DMA RX:%x\n",
dev_driver_string(&master->dev),
- dev_name(&master->dev));
+ dev_name(&master->dev), transfer->len);
spi_imx->devtype_data->reset(spi_imx);
dmaengine_terminate_all(master->dma_rx);
}