Commit 987a2dfe authored by Robin Gong's avatar Robin Gong Committed by Mark Brown

spi: imx: move wml setting to later than setup_transfer

Current dynamic burst length is based on the whole transfer length,
that's ok if there is only one sg, but is not right in case multi sgs
in one transfer,because the tail data should be based on the last sg
length instead of the whole transfer length. Move wml setting for DMA
to the later place, thus, the next patch could get the right last sg
length for wml setting. This patch is a preparation one, no any
function change involved.
Signed-off-by: default avatarRobin Gong <yibin.gong@nxp.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 9c212009
...@@ -63,6 +63,7 @@ struct spi_imx_devtype_data { ...@@ -63,6 +63,7 @@ struct spi_imx_devtype_data {
void (*trigger)(struct spi_imx_data *); void (*trigger)(struct spi_imx_data *);
int (*rx_available)(struct spi_imx_data *); int (*rx_available)(struct spi_imx_data *);
void (*reset)(struct spi_imx_data *); void (*reset)(struct spi_imx_data *);
void (*setup_wml)(struct spi_imx_data *);
void (*disable)(struct spi_imx_data *); void (*disable)(struct spi_imx_data *);
bool has_dmamode; bool has_dmamode;
bool has_slavemode; bool has_slavemode;
...@@ -583,6 +584,11 @@ static int mx51_ecspi_config(struct spi_device *spi) ...@@ -583,6 +584,11 @@ static int mx51_ecspi_config(struct spi_device *spi)
else /* SCLK is _very_ slow */ else /* SCLK is _very_ slow */
usleep_range(delay, delay + 10); usleep_range(delay, delay + 10);
return 0;
}
static void mx51_setup_wml(struct spi_imx_data *spi_imx)
{
/* /*
* Configure the DMA register: setup the watermark * Configure the DMA register: setup the watermark
* and enable DMA request. * and enable DMA request.
...@@ -593,8 +599,6 @@ static int mx51_ecspi_config(struct spi_device *spi) ...@@ -593,8 +599,6 @@ static int mx51_ecspi_config(struct spi_device *spi)
MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) | MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) |
MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN | MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN |
MX51_ECSPI_DMA_RXTDEN, spi_imx->base + MX51_ECSPI_DMA); MX51_ECSPI_DMA_RXTDEN, spi_imx->base + MX51_ECSPI_DMA);
return 0;
} }
static int mx51_ecspi_rx_available(struct spi_imx_data *spi_imx) static int mx51_ecspi_rx_available(struct spi_imx_data *spi_imx)
...@@ -931,6 +935,7 @@ static struct spi_imx_devtype_data imx51_ecspi_devtype_data = { ...@@ -931,6 +935,7 @@ static struct spi_imx_devtype_data imx51_ecspi_devtype_data = {
.trigger = mx51_ecspi_trigger, .trigger = mx51_ecspi_trigger,
.rx_available = mx51_ecspi_rx_available, .rx_available = mx51_ecspi_rx_available,
.reset = mx51_ecspi_reset, .reset = mx51_ecspi_reset,
.setup_wml = mx51_setup_wml,
.fifo_size = 64, .fifo_size = 64,
.has_dmamode = true, .has_dmamode = true,
.dynamic_burst = true, .dynamic_burst = true,
...@@ -1138,7 +1143,6 @@ static int spi_imx_setupxfer(struct spi_device *spi, ...@@ -1138,7 +1143,6 @@ static int spi_imx_setupxfer(struct spi_device *spi,
struct spi_transfer *t) struct spi_transfer *t)
{ {
struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
int ret;
if (!t) if (!t)
return 0; return 0;
...@@ -1179,12 +1183,6 @@ static int spi_imx_setupxfer(struct spi_device *spi, ...@@ -1179,12 +1183,6 @@ static int spi_imx_setupxfer(struct spi_device *spi,
else else
spi_imx->usedma = 0; spi_imx->usedma = 0;
if (spi_imx->usedma) {
ret = spi_imx_dma_configure(spi->master);
if (ret)
return ret;
}
if (is_imx53_ecspi(spi_imx) && spi_imx->slave_mode) { if (is_imx53_ecspi(spi_imx) && spi_imx->slave_mode) {
spi_imx->rx = mx53_ecspi_rx_slave; spi_imx->rx = mx53_ecspi_rx_slave;
spi_imx->tx = mx53_ecspi_tx_slave; spi_imx->tx = mx53_ecspi_tx_slave;
...@@ -1289,6 +1287,13 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, ...@@ -1289,6 +1287,13 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
unsigned long timeout; unsigned long timeout;
struct spi_master *master = spi_imx->bitbang.master; struct spi_master *master = spi_imx->bitbang.master;
struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg; struct sg_table *tx = &transfer->tx_sg, *rx = &transfer->rx_sg;
int ret;
ret = spi_imx_dma_configure(master);
if (ret)
return ret;
spi_imx->devtype_data->setup_wml(spi_imx);
/* /*
* The TX DMA setup starts the transfer, so make sure RX is configured * The TX DMA setup starts the transfer, so make sure RX is configured
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment