diff options
author | Robin Gong <b38343@freescale.com> | 2014-12-13 12:46:31 +0800 |
---|---|---|
committer | Robin Gong <b38343@freescale.com> | 2014-12-19 10:25:18 +0800 |
commit | d0fa9b74641285ef62bad2e8e39ee13467549967 (patch) | |
tree | b70f22d9dcb5a9c26a59ed722ef9dfbaf73b4e17 | |
parent | ef26c0a7706c5c5319d56de28cb3244bf0ab2cdb (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.c | 19 |
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); } |