spi: stm32_qspi: rework mode management
authorChristophe Kerello <christophe.kerello@st.com>
Mon, 9 Jul 2018 13:32:38 +0000 (15:32 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 23 Jul 2018 18:33:21 +0000 (14:33 -0400)
This patch solves quad read issue with Macronix/Micron spi nor.

Signed-off-by: Christophe Kerello <christophe.kerello@st.com>
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
drivers/spi/stm32_qspi.c

index 81b84625ba5bda7af94dead1ab68694acb2c439f..3b92254a5ce16adb668ced4e3038a2b5102dd643 100644 (file)
@@ -229,21 +229,21 @@ static unsigned int _stm32_qspi_gen_ccr(struct stm32_qspi_priv *priv, u8 fmode)
 
        imode = STM32_QSPI_CCR_IMODE_ONE_LINE;
        admode = STM32_QSPI_CCR_ADMODE_ONE_LINE;
-
-       if (mode & SPI_RX_QUAD) {
-               dmode = STM32_QSPI_CCR_DMODE_FOUR_LINE;
-               if (mode & SPI_TX_QUAD) {
-                       imode = STM32_QSPI_CCR_IMODE_FOUR_LINE;
-                       admode = STM32_QSPI_CCR_ADMODE_FOUR_LINE;
-               }
-       } else if (mode & SPI_RX_DUAL) {
-               dmode = STM32_QSPI_CCR_DMODE_TWO_LINE;
-               if (mode & SPI_TX_DUAL) {
-                       imode = STM32_QSPI_CCR_IMODE_TWO_LINE;
-                       admode = STM32_QSPI_CCR_ADMODE_TWO_LINE;
+       dmode = STM32_QSPI_CCR_DMODE_ONE_LINE;
+
+       if ((priv->command & CMD_HAS_ADR) && (priv->command & CMD_HAS_DATA)) {
+               if (fmode == STM32_QSPI_CCR_IND_WRITE) {
+                       if (mode & SPI_TX_QUAD)
+                               dmode = STM32_QSPI_CCR_DMODE_FOUR_LINE;
+                       else if (mode & SPI_TX_DUAL)
+                               dmode = STM32_QSPI_CCR_DMODE_TWO_LINE;
+               } else if ((fmode == STM32_QSPI_CCR_MEM_MAP) ||
+                        (fmode == STM32_QSPI_CCR_IND_READ)) {
+                       if (mode & SPI_RX_QUAD)
+                               dmode = STM32_QSPI_CCR_DMODE_FOUR_LINE;
+                       else if (mode & SPI_RX_DUAL)
+                               dmode = STM32_QSPI_CCR_DMODE_TWO_LINE;
                }
-       } else {
-               dmode = STM32_QSPI_CCR_DMODE_ONE_LINE;
        }
 
        if (priv->command & CMD_HAS_DATA)