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.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index e861157e3459..037abbb852a4 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -217,7 +217,6 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
217 struct spi_transfer *transfer) 217 struct spi_transfer *transfer)
218{ 218{
219 struct spi_imx_data *spi_imx = spi_master_get_devdata(master); 219 struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
220 unsigned int bytes_per_word, i;
221 220
222 if (!master->dma_rx) 221 if (!master->dma_rx)
223 return false; 222 return false;
@@ -225,14 +224,6 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
225 if (spi_imx->slave_mode) 224 if (spi_imx->slave_mode)
226 return false; 225 return false;
227 226
228 bytes_per_word = spi_imx_bytes_per_word(transfer->bits_per_word);
229
230 for (i = spi_imx->devtype_data->fifo_size / 2; i > 0; i--) {
231 if (!(transfer->len % (i * bytes_per_word)))
232 break;
233 }
234
235 spi_imx->wml = i;
236 spi_imx->dynamic_burst = 0; 227 spi_imx->dynamic_burst = 0;
237 228
238 return true; 229 return true;
@@ -594,7 +585,7 @@ static void mx51_setup_wml(struct spi_imx_data *spi_imx)
594 * and enable DMA request. 585 * and enable DMA request.
595 */ 586 */
596 587
597 writel(MX51_ECSPI_DMA_RX_WML(spi_imx->wml) | 588 writel(MX51_ECSPI_DMA_RX_WML(spi_imx->wml - 1) |
598 MX51_ECSPI_DMA_TX_WML(spi_imx->wml) | 589 MX51_ECSPI_DMA_TX_WML(spi_imx->wml) |
599 MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) | 590 MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) |
600 MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN | 591 MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN |
@@ -1287,12 +1278,30 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
1287 unsigned long timeout; 1278 unsigned long timeout;
1288 struct spi_master *master = spi_imx->bitbang.master; 1279 struct spi_master *master = spi_imx->bitbang.master;
1289 struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg; 1280 struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg;
1281 struct scatterlist *last_sg = sg_last(rx->sgl, rx->nents);
1282 unsigned int bytes_per_word, i;
1290 int ret; 1283 int ret;
1291 1284
1285 /* Get the right burst length from the last sg to ensure no tail data */
1286 bytes_per_word = spi_imx_bytes_per_word(transfer->bits_per_word);
1287 for (i = spi_imx->devtype_data->fifo_size / 2; i > 0; i--) {
1288 if (!(sg_dma_len(last_sg) % (i * bytes_per_word)))
1289 break;
1290 }
1291 /* Use 1 as wml in case no available burst length got */
1292 if (i == 0)
1293 i = 1;
1294
1295 spi_imx->wml = i;
1296
1292 ret = spi_imx_dma_configure(master); 1297 ret = spi_imx_dma_configure(master);
1293 if (ret) 1298 if (ret)
1294 return ret; 1299 return ret;
1295 1300
1301 if (!spi_imx->devtype_data->setup_wml) {
1302 dev_err(spi_imx->dev, "No setup_wml()?\n");
1303 return -EINVAL;
1304 }
1296 spi_imx->devtype_data->setup_wml(spi_imx); 1305 spi_imx->devtype_data->setup_wml(spi_imx);
1297 1306
1298 /* 1307 /*