diff mbox series

[v1,1/5] spi: fsl-spi: Fix CPM/QE mode Litte Endian

Message ID 1b7d3e84b1128f42c1887dd2fb9cdf390f541bc1.1680371809.git.christophe.leroy@csgroup.eu (mailing list archive)
State Accepted
Commit c20c57d9868d7f9fd1b2904c7801b07e128f6322
Headers show
Series [v1,1/5] spi: fsl-spi: Fix CPM/QE mode Litte Endian | expand

Commit Message

Christophe Leroy April 1, 2023, 5:59 p.m. UTC
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")
---
 drivers/spi/spi-fsl-spi.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Mark Brown April 5, 2023, 1:43 p.m. UTC | #1
On Sat, 01 Apr 2023 19:59:46 +0200, Christophe Leroy wrote:
> 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.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next

Thanks!

[1/5] spi: fsl-spi: Fix CPM/QE mode Litte Endian
      commit: c20c57d9868d7f9fd1b2904c7801b07e128f6322
[2/5] spi: fsl-spi: Re-organise transfer bits_per_word adaptation
      commit: 8a5299a1278eadf1e08a598a5345c376206f171e
[3/5] spi: fsl-cpm: Use 16 bit mode for large transfers with even size
      commit: fc96ec826bced75cc6b9c07a4ac44bbf651337ab
[4/5] spi: fsl-spi: Change mspi_apply_cpu_mode_quirks() to void
      commit: 99aebb3c1b418d865461aa0813ef1b55285cbda4
[5/5] spi: fsl-spi: No need to check transfer length versus word size
      commit: 4084c8ca1266ba09554de8df19aac82b6dd2e079

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
diff mbox series

Patch

diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c
index 93152144fd2e..5602f052b2b5 100644
--- a/drivers/spi/spi-fsl-spi.c
+++ b/drivers/spi/spi-fsl-spi.c
@@ -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);