summaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorJiada Wang <jiada_wang@mentor.com>2017-01-06 07:22:18 -0500
committerMark Brown <broonie@kernel.org>2017-01-06 13:09:22 -0500
commit66459c5a50a787c474b734b586328f7111ab6df0 (patch)
tree88df0f0674456138bfc9842585e371ee8b82fe82 /drivers/spi
parentfafd67940774733fa97f4b09412aea6981b82e0a (diff)
spi: imx: adjust watermark level according to transfer length
Previously DMA watermark level is configured to fifosize/2, DMA mode can be used only when transfer length can be divided by 'watermark level * bpw', which makes DMA mode not pratical. This patch adjusts watermark level to largest number (no bigger than fifosize/2) which can divide 'tranfer length / bpw' for each transfer. Signed-off-by: Jiada Wang <jiada_wang@mentor.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/spi-imx.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 32ced64a5bb9..9a7c62f471dc 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -211,7 +211,7 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
211 struct spi_transfer *transfer) 211 struct spi_transfer *transfer)
212{ 212{
213 struct spi_imx_data *spi_imx = spi_master_get_devdata(master); 213 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
214 unsigned int bpw; 214 unsigned int bpw, i;
215 215
216 if (!master->dma_rx) 216 if (!master->dma_rx)
217 return false; 217 return false;
@@ -228,12 +228,16 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
228 if (bpw != 1 && bpw != 2 && bpw != 4) 228 if (bpw != 1 && bpw != 2 && bpw != 4)
229 return false; 229 return false;
230 230
231 if (transfer->len < spi_imx->wml * bpw) 231 for (i = spi_imx_get_fifosize(spi_imx) / 2; i > 0; i--) {
232 return false; 232 if (!(transfer->len % (i * bpw)))
233 break;
234 }
233 235
234 if (transfer->len % (spi_imx->wml * bpw)) 236 if (i == 0)
235 return false; 237 return false;
236 238
239 spi_imx->wml = i;
240
237 return true; 241 return true;
238} 242}
239 243
@@ -837,10 +841,6 @@ static int spi_imx_dma_configure(struct spi_master *master,
837 struct dma_slave_config rx = {}, tx = {}; 841 struct dma_slave_config rx = {}, tx = {};
838 struct spi_imx_data *spi_imx = spi_master_get_devdata(master); 842 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
839 843
840 if (bytes_per_word == spi_imx->bytes_per_word)
841 /* Same as last time */
842 return 0;
843
844 switch (bytes_per_word) { 844 switch (bytes_per_word) {
845 case 4: 845 case 4:
846 buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES; 846 buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;