spi: fsl-spi: Fix CPM/QE mode Litte Endian
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Sat, 1 Apr 2023 17:59:46 +0000 (19:59 +0200)
committerMark Brown <broonie@kernel.org>
Wed, 5 Apr 2023 11:33:32 +0000 (12:33 +0100)
CPM has the same problem as QE so for CPM also use the fix added
by commit 0398fb70940e ("spi/spi_mpc8xxx: Fix QE mode Litte Endian"):

  CPM mode uses Little Endian so words > 8 bits are byte swapped.
  Workaround this by always enforcing wordsize 8 for 16 and 32 bits
  words. Unfortunately this will not work for LSB transfers
  where wordsize is > 8 bits so disable these for now.

Also limit the workaround to 16 and 32 bits words because it can
only work for multiples of 8-bits.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Joakim Tjernlund <Joakim.Tjernlund@infinera.com>
Fixes: 0398fb70940e ("spi/spi_mpc8xxx: Fix QE mode Litte Endian")
Link: https://lore.kernel.org/r/1b7d3e84b1128f42c1887dd2fb9cdf390f541bc1.1680371809.git.christophe.leroy@csgroup.eu
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-spi.c

index 702756c25aa75193de788bcf427354384542ca2d..4651f65c90467fda651a16f31e59b70844224adc 100644 (file)
@@ -181,8 +181,8 @@ static int mspi_apply_qe_mode_quirks(struct spi_mpc8xxx_cs *cs,
                                struct spi_device *spi,
                                int bits_per_word)
 {
-       /* QE uses Little Endian for words > 8
-        * so transform all words > 8 into 8 bits
+       /* CPM/QE uses Little Endian for words > 8
+        * so transform 16 and 32 bits words into 8 bits
         * Unfortnatly that doesn't work for LSB so
         * reject these for now */
        /* Note: 32 bits word, LSB works iff
@@ -190,9 +190,11 @@ static int mspi_apply_qe_mode_quirks(struct spi_mpc8xxx_cs *cs,
        if (spi->mode & SPI_LSB_FIRST &&
            bits_per_word > 8)
                return -EINVAL;
-       if (bits_per_word > 8)
+       if (bits_per_word <= 8)
+               return bits_per_word;
+       if (bits_per_word == 16 || bits_per_word == 32)
                return 8; /* pretend its 8 bits */
-       return bits_per_word;
+       return -EINVAL;
 }
 
 static int fsl_spi_setup_transfer(struct spi_device *spi,
@@ -222,7 +224,7 @@ static int fsl_spi_setup_transfer(struct spi_device *spi,
                bits_per_word = mspi_apply_cpu_mode_quirks(cs, spi,
                                                           mpc8xxx_spi,
                                                           bits_per_word);
-       else if (mpc8xxx_spi->flags & SPI_QE)
+       else
                bits_per_word = mspi_apply_qe_mode_quirks(cs, spi,
                                                          bits_per_word);