MLK-10404-1 spi: spi-imx: use XCH mode even in DMA mode
authorRobin Gong <b38343@freescale.com>
Wed, 11 Mar 2015 06:58:18 +0000 (14:58 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:21:40 +0000 (15:21 -0500)
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

drivers/spi/spi-imx.c

index 772b395..ccb7157 100644 (file)
@@ -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);