diff options
author | Jiada Wang <jiada_wang@mentor.com> | 2017-01-06 07:22:18 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-01-06 13:09:22 -0500 |
commit | 66459c5a50a787c474b734b586328f7111ab6df0 (patch) | |
tree | 88df0f0674456138bfc9842585e371ee8b82fe82 /drivers/spi | |
parent | fafd67940774733fa97f4b09412aea6981b82e0a (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.c | 16 |
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; |