diff options
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 29 |
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 | /* |