aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r--drivers/spi/spi-imx.c25
1 files changed, 7 insertions, 18 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index d98c33cb64f9..c688efa95e29 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -204,8 +204,8 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
204{ 204{
205 struct spi_imx_data *spi_imx = spi_master_get_devdata(master); 205 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
206 206
207 if (spi_imx->dma_is_inited && 207 if (spi_imx->dma_is_inited && transfer->len >= spi_imx->wml &&
208 transfer->len > spi_imx->wml * sizeof(u32)) 208 (transfer->len % spi_imx->wml) == 0)
209 return true; 209 return true;
210 return false; 210 return false;
211} 211}
@@ -919,8 +919,6 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
919 struct dma_async_tx_descriptor *desc_tx = NULL, *desc_rx = NULL; 919 struct dma_async_tx_descriptor *desc_tx = NULL, *desc_rx = NULL;
920 int ret; 920 int ret;
921 unsigned long timeout; 921 unsigned long timeout;
922 u32 dma;
923 int left;
924 struct spi_master *master = spi_imx->bitbang.master; 922 struct spi_master *master = spi_imx->bitbang.master;
925 struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg; 923 struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg;
926 924
@@ -929,7 +927,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
929 tx->sgl, tx->nents, DMA_MEM_TO_DEV, 927 tx->sgl, tx->nents, DMA_MEM_TO_DEV,
930 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 928 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
931 if (!desc_tx) 929 if (!desc_tx)
932 goto no_dma; 930 goto tx_nodma;
933 931
934 desc_tx->callback = spi_imx_dma_tx_callback; 932 desc_tx->callback = spi_imx_dma_tx_callback;
935 desc_tx->callback_param = (void *)spi_imx; 933 desc_tx->callback_param = (void *)spi_imx;
@@ -941,7 +939,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
941 rx->sgl, rx->nents, DMA_DEV_TO_MEM, 939 rx->sgl, rx->nents, DMA_DEV_TO_MEM,
942 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 940 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
943 if (!desc_rx) 941 if (!desc_rx)
944 goto no_dma; 942 goto rx_nodma;
945 943
946 desc_rx->callback = spi_imx_dma_rx_callback; 944 desc_rx->callback = spi_imx_dma_rx_callback;
947 desc_rx->callback_param = (void *)spi_imx; 945 desc_rx->callback_param = (void *)spi_imx;
@@ -954,13 +952,6 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
954 /* Trigger the cspi module. */ 952 /* Trigger the cspi module. */
955 spi_imx->dma_finished = 0; 953 spi_imx->dma_finished = 0;
956 954
957 dma = readl(spi_imx->base + MX51_ECSPI_DMA);
958 dma = dma & (~MX51_ECSPI_DMA_RXT_WML_MASK);
959 /* Change RX_DMA_LENGTH trigger dma fetch tail data */
960 left = transfer->len % spi_imx->wml;
961 if (left)
962 writel(dma | (left << MX51_ECSPI_DMA_RXT_WML_OFFSET),
963 spi_imx->base + MX51_ECSPI_DMA);
964 /* 955 /*
965 * Set these order to avoid potential RX overflow. The overflow may 956 * Set these order to avoid potential RX overflow. The overflow may
966 * happen if we enable SPI HW before starting RX DMA due to rescheduling 957 * happen if we enable SPI HW before starting RX DMA due to rescheduling
@@ -992,10 +983,6 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
992 spi_imx->devtype_data->reset(spi_imx); 983 spi_imx->devtype_data->reset(spi_imx);
993 dmaengine_terminate_all(master->dma_rx); 984 dmaengine_terminate_all(master->dma_rx);
994 } 985 }
995 dma &= ~MX51_ECSPI_DMA_RXT_WML_MASK;
996 writel(dma |
997 spi_imx->wml << MX51_ECSPI_DMA_RXT_WML_OFFSET,
998 spi_imx->base + MX51_ECSPI_DMA);
999 } 986 }
1000 987
1001 spi_imx->dma_finished = 1; 988 spi_imx->dma_finished = 1;
@@ -1008,7 +995,9 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
1008 995
1009 return ret; 996 return ret;
1010 997
1011no_dma: 998rx_nodma:
999 dmaengine_terminate_all(master->dma_tx);
1000tx_nodma:
1012 pr_warn_once("%s %s: DMA not available, falling back to PIO\n", 1001 pr_warn_once("%s %s: DMA not available, falling back to PIO\n",
1013 dev_driver_string(&master->dev), 1002 dev_driver_string(&master->dev),
1014 dev_name(&master->dev)); 1003 dev_name(&master->dev));