From: Tudor Ambarus <tudor.amba...@microchip.com>

commit cac8c821059639b015586abf61623c62cc549a13 upstream.

Following error was seen when mounting a 16MByte ubifs:
UBIFS error (ubi0:0 pid 1893): check_lpt_type.constprop.6: invalid type (15) in 
LPT node type

QSPI_IFR.TFRTYP was not set correctly. When data transfer is enabled
and one wants to access the serial memory through AHB in order to:
 - read in the serial memory, but not a memory data, for example
   a JEDEC-ID, QSPI_IFR.TFRTYP must be written to '0' (both sama5d2
   and sam9x60).
 - read in the serial memory, and particularly a memory data,
   TFRTYP must be written to '1' (both sama5d2 and sam9x60).
 - write in the serial memory, but not a memory data, for example
   writing the configuration or the QSPI_SR, TFRTYP must be written
   to '2' for sama5d2 and to '0' for sam9x60.
 - write in the serial memory in particular to program a memory data,
   TFRTYP must be written to '3' for sama5d2 and to '1' for sam9x60.

Fix the setting of the QSPI_IFR.TFRTYP field.

Fixes: 2d30ac5ed633 ("mtd: spi-nor: atmel-quadspi: Use spi-mem interface for 
atmel-quadspi driver")
Cc: <sta...@vger.kernel.org> # v5.0+
Reported-by: Tom Burkart <t...@aussec.com>
Signed-off-by: Tudor Ambarus <tudor.amba...@microchip.com>
Link: 
https://lore.kernel.org/r/20201207135959.154124-2-tudor.amba...@microchip.com
Signed-off-by: Mark Brown <broo...@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/spi/atmel-quadspi.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

--- a/drivers/spi/atmel-quadspi.c
+++ b/drivers/spi/atmel-quadspi.c
@@ -284,10 +284,14 @@ static int atmel_qspi_set_cfg(struct atm
        if (dummy_cycles)
                ifr |= QSPI_IFR_NBDUM(dummy_cycles);
 
-       /* Set data enable */
-       if (op->data.nbytes)
+       /* Set data enable and data transfer type. */
+       if (op->data.nbytes) {
                ifr |= QSPI_IFR_DATAEN;
 
+               if (op->addr.nbytes)
+                       ifr |= QSPI_IFR_TFRTYP_MEM;
+       }
+
        /*
         * If the QSPI controller is set in regular SPI mode, set it in
         * Serial Memory Mode (SMM).
@@ -312,7 +316,7 @@ static int atmel_qspi_set_cfg(struct atm
                        writel_relaxed(icr, aq->regs + QSPI_WICR);
                writel_relaxed(ifr, aq->regs + QSPI_IFR);
        } else {
-               if (op->data.dir == SPI_MEM_DATA_OUT)
+               if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
                        ifr |= QSPI_IFR_SAMA5D2_WRITE_TRSFR;
 
                /* Set QSPI Instruction Frame registers */


Reply via email to