summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gong <b38343@freescale.com>2015-03-11 14:58:18 +0800
committerAnson Huang <Anson.Huang@nxp.com>2017-06-09 22:17:58 +0800
commit81d9a821155d96059628a17953af3aa591cddeb3 (patch)
tree4c583fe30461bd5b848a3cecdad76c36e5d9acc0
parentd812a6765585de7d57ba6b3e026c58dca1acaa9b (diff)
MLK-10404-1 spi: spi-imx: use XCH mode even in DMA mode
To workaroud the TKT238285, the safe way is use XCH mode in SDMA script to simulate as PIO mode which never report such issue. Meanwhile, set tx threashold as 0. But this workaroud will bring performance impacted, below performance data is collected by 'dd' with SPI-NOR flash on i.mx6dl sabresd board: mode write data read data --PIO 194KB/s 644KB/s --DMA normal (SMC, tx_thresh=32) 222KB/s 1.4MB/s --DMA(XCH, tx_thresh=0) 210KB/s 1.0MB/s Signed-off-by: Robin Gong <b38343@freescale.com> (cherry picked from commit 01be65fa5617aa192307ca38b6fc6128f3f0c3f7) (cherry picked from commit 646a751a4d1d0e227a762b461d9b8f92605c26b1) (cherry picked from commit b334993950b24ced30fcfc70c126b65bf4cb4cff) Conflicts: drivers/spi/spi-imx.c
-rw-r--r--drivers/spi/spi-imx.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 6f7b4dd32f7e..b026ce1c8294 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -326,10 +326,15 @@ static void mx51_ecspi_intctrl(struct spi_imx_data *spi_imx, int enable)
static void mx51_ecspi_trigger(struct spi_imx_data *spi_imx)
{
- u32 reg;
-
- reg = readl(spi_imx->base + MX51_ECSPI_CTRL);
- reg |= MX51_ECSPI_CTRL_XCH;
+ u32 reg = readl(spi_imx->base + MX51_ECSPI_CTRL);
+ /*
+ * To workaround TKT238285, SDMA script need use XCH instead of SMC
+ * just like PIO mode.
+ */
+ if (!spi_imx->usedma)
+ reg |= MX51_ECSPI_CTRL_XCH;
+ else
+ reg &= ~MX51_ECSPI_CTRL_SMC;
writel(reg, spi_imx->base + MX51_ECSPI_CTRL);
}
@@ -416,7 +421,6 @@ static int mx51_ecspi_config(struct spi_device *spi,
*/
writel(MX51_ECSPI_DMA_RX_WML(spi_imx->wml) |
- MX51_ECSPI_DMA_TX_WML(spi_imx->wml) |
MX51_ECSPI_DMA_RXT_WML(spi_imx->wml) |
MX51_ECSPI_DMA_TEDEN | MX51_ECSPI_DMA_RXDEN |
MX51_ECSPI_DMA_RXTDEN, spi_imx->base + MX51_ECSPI_DMA);
@@ -1029,6 +1033,8 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
transfer_timeout = spi_imx_calculate_timeout(spi_imx, transfer->len);
+ spi_imx->devtype_data->trigger(spi_imx);
+
/* Wait SDMA to finish the data transfer.*/
timeout = wait_for_completion_timeout(&spi_imx->dma_tx_completion,
transfer_timeout);