|
@@ -104,9 +104,7 @@ struct spi_imx_data {
|
|
|
unsigned int dma_is_inited;
|
|
|
unsigned int dma_finished;
|
|
|
bool usedma;
|
|
|
- u32 rx_wml;
|
|
|
- u32 tx_wml;
|
|
|
- u32 rxt_wml;
|
|
|
+ u32 wml;
|
|
|
struct completion dma_rx_completion;
|
|
|
struct completion dma_tx_completion;
|
|
|
|
|
@@ -201,9 +199,8 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
|
|
|
{
|
|
|
struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
|
|
|
|
|
|
- if (spi_imx->dma_is_inited
|
|
|
- && transfer->len > spi_imx->rx_wml * sizeof(u32)
|
|
|
- && transfer->len > spi_imx->tx_wml * sizeof(u32))
|
|
|
+ if (spi_imx->dma_is_inited &&
|
|
|
+ transfer->len > spi_imx->wml * sizeof(u32))
|
|
|
return true;
|
|
|
return false;
|
|
|
}
|
|
@@ -388,10 +385,9 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
|
|
|
if (spi_imx->dma_is_inited) {
|
|
|
dma = readl(spi_imx->base + MX51_ECSPI_DMA);
|
|
|
|
|
|
- spi_imx->rxt_wml = spi_imx_get_fifosize(spi_imx) / 2;
|
|
|
- rx_wml_cfg = spi_imx->rx_wml << MX51_ECSPI_DMA_RX_WML_OFFSET;
|
|
|
- tx_wml_cfg = spi_imx->tx_wml << MX51_ECSPI_DMA_TX_WML_OFFSET;
|
|
|
- rxt_wml_cfg = spi_imx->rxt_wml << MX51_ECSPI_DMA_RXT_WML_OFFSET;
|
|
|
+ rx_wml_cfg = spi_imx->wml << MX51_ECSPI_DMA_RX_WML_OFFSET;
|
|
|
+ tx_wml_cfg = spi_imx->wml << MX51_ECSPI_DMA_TX_WML_OFFSET;
|
|
|
+ rxt_wml_cfg = spi_imx->wml << MX51_ECSPI_DMA_RXT_WML_OFFSET;
|
|
|
dma = (dma & ~MX51_ECSPI_DMA_TX_WML_MASK
|
|
|
& ~MX51_ECSPI_DMA_RX_WML_MASK
|
|
|
& ~MX51_ECSPI_DMA_RXT_WML_MASK)
|
|
@@ -842,6 +838,8 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
|
|
|
if (of_machine_is_compatible("fsl,imx6dl"))
|
|
|
return 0;
|
|
|
|
|
|
+ spi_imx->wml = spi_imx_get_fifosize(spi_imx) / 2;
|
|
|
+
|
|
|
/* Prepare for TX DMA: */
|
|
|
master->dma_tx = dma_request_slave_channel(dev, "tx");
|
|
|
if (!master->dma_tx) {
|
|
@@ -853,7 +851,7 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
|
|
|
slave_config.direction = DMA_MEM_TO_DEV;
|
|
|
slave_config.dst_addr = res->start + MXC_CSPITXDATA;
|
|
|
slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
|
|
|
- slave_config.dst_maxburst = spi_imx_get_fifosize(spi_imx) / 2;
|
|
|
+ slave_config.dst_maxburst = spi_imx->wml;
|
|
|
ret = dmaengine_slave_config(master->dma_tx, &slave_config);
|
|
|
if (ret) {
|
|
|
dev_err(dev, "error in TX dma configuration.\n");
|
|
@@ -871,7 +869,7 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
|
|
|
slave_config.direction = DMA_DEV_TO_MEM;
|
|
|
slave_config.src_addr = res->start + MXC_CSPIRXDATA;
|
|
|
slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
|
|
|
- slave_config.src_maxburst = spi_imx_get_fifosize(spi_imx) / 2;
|
|
|
+ slave_config.src_maxburst = spi_imx->wml;
|
|
|
ret = dmaengine_slave_config(master->dma_rx, &slave_config);
|
|
|
if (ret) {
|
|
|
dev_err(dev, "error in RX dma configuration.\n");
|
|
@@ -884,8 +882,6 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx,
|
|
|
master->max_dma_len = MAX_SDMA_BD_BYTES;
|
|
|
spi_imx->bitbang.master->flags = SPI_MASTER_MUST_RX |
|
|
|
SPI_MASTER_MUST_TX;
|
|
|
- spi_imx->tx_wml = spi_imx_get_fifosize(spi_imx) / 2;
|
|
|
- spi_imx->rx_wml = spi_imx_get_fifosize(spi_imx) / 2;
|
|
|
spi_imx->dma_is_inited = 1;
|
|
|
|
|
|
return 0;
|
|
@@ -952,7 +948,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
|
|
|
dma = readl(spi_imx->base + MX51_ECSPI_DMA);
|
|
|
dma = dma & (~MX51_ECSPI_DMA_RXT_WML_MASK);
|
|
|
/* Change RX_DMA_LENGTH trigger dma fetch tail data */
|
|
|
- left = transfer->len % spi_imx->rxt_wml;
|
|
|
+ left = transfer->len % spi_imx->wml;
|
|
|
if (left)
|
|
|
writel(dma | (left << MX51_ECSPI_DMA_RXT_WML_OFFSET),
|
|
|
spi_imx->base + MX51_ECSPI_DMA);
|
|
@@ -987,8 +983,9 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
|
|
|
spi_imx->devtype_data->reset(spi_imx);
|
|
|
dmaengine_terminate_all(master->dma_rx);
|
|
|
}
|
|
|
+ dma &= ~MX51_ECSPI_DMA_RXT_WML_MASK;
|
|
|
writel(dma |
|
|
|
- spi_imx->rxt_wml << MX51_ECSPI_DMA_RXT_WML_OFFSET,
|
|
|
+ spi_imx->wml << MX51_ECSPI_DMA_RXT_WML_OFFSET,
|
|
|
spi_imx->base + MX51_ECSPI_DMA);
|
|
|
}
|
|
|
|