summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorRobin Gong <b38343@freescale.com>2015-03-11 14:58:18 +0800
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit3b92840311705c470bec1353f6be0adb9ba7b0ba (patch)
tree89df52dd2a87c7f9c1a3b278f8c611bb792361ea /drivers/spi
parent2546ce5e4fbfc7ec2fd8a1da1496d185085eaeed (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
Diffstat (limited to 'drivers/spi')
-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 772b395dafa6..ccb7157bb822 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);