Takashi Iwai 545251
From 87c614175bbf28d3fd076dc2d166bac759e41427 Mon Sep 17 00:00:00 2001
Takashi Iwai 545251
From: Kevin Groeneveld <kgroeneveld@lenbrook.com>
Takashi Iwai 545251
Date: Sat, 18 Mar 2023 18:21:32 -0400
Takashi Iwai 545251
Subject: [PATCH] spi: spi-imx: fix MX51_ECSPI_* macros when cs > 3
Takashi Iwai 545251
Mime-version: 1.0
Takashi Iwai 545251
Content-type: text/plain; charset=UTF-8
Takashi Iwai 545251
Content-transfer-encoding: 8bit
Takashi Iwai 545251
Git-commit: 87c614175bbf28d3fd076dc2d166bac759e41427
Takashi Iwai 545251
Patch-mainline: v6.4-rc1
Takashi Iwai 545251
References: git-fixes
Takashi Iwai 545251
Takashi Iwai 545251
When using gpio based chip select the cs value can go outside the range
Takashi Iwai 545251
0 – 3. The various MX51_ECSPI_* macros did not take this into consideration
Takashi Iwai 545251
resulting in possible corruption of the configuration.
Takashi Iwai 545251
Takashi Iwai 545251
For example for any cs value over 3 the SCLKPHA bits would not be set and
Takashi Iwai 545251
other values in the register possibly corrupted.
Takashi Iwai 545251
Takashi Iwai 545251
One way to fix this is to just mask the cs bits to 2 bits. This still
Takashi Iwai 545251
allows all 4 native chip selects to work as well as gpio chip selects
Takashi Iwai 545251
(which can use any of the 4 chip select configurations).
Takashi Iwai 545251
Takashi Iwai 545251
Signed-off-by: Kevin Groeneveld <kgroeneveld@lenbrook.com>
Takashi Iwai 545251
Link: https://lore.kernel.org/r/20230318222132.3373-1-kgroeneveld@lenbrook.com
Takashi Iwai 545251
Signed-off-by: Mark Brown <broonie@kernel.org>
Takashi Iwai 545251
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 545251
Takashi Iwai 545251
---
Takashi Iwai 545251
 drivers/spi/spi-imx.c | 24 ++++++++++++++++++------
Takashi Iwai 545251
 1 file changed, 18 insertions(+), 6 deletions(-)
Takashi Iwai 545251
Takashi Iwai 545251
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
Takashi Iwai 545251
index 1f2c7ad65ec8..24390c702c60 100644
Takashi Iwai 545251
--- a/drivers/spi/spi-imx.c
Takashi Iwai 545251
+++ b/drivers/spi/spi-imx.c
Takashi Iwai 545251
@@ -252,6 +252,18 @@ static bool spi_imx_can_dma(struct spi_controller *controller, struct spi_device
Takashi Iwai 545251
 	return true;
Takashi Iwai 545251
 }
Takashi Iwai 545251
 
Takashi Iwai 545251
+/*
Takashi Iwai 545251
+ * Note the number of natively supported chip selects for MX51 is 4. Some
Takashi Iwai 545251
+ * devices may have less actual SS pins but the register map supports 4. When
Takashi Iwai 545251
+ * using gpio chip selects the cs values passed into the macros below can go
Takashi Iwai 545251
+ * outside the range 0 - 3. We therefore need to limit the cs value to avoid
Takashi Iwai 545251
+ * corrupting bits outside the allocated locations.
Takashi Iwai 545251
+ *
Takashi Iwai 545251
+ * The simplest way to do this is to just mask the cs bits to 2 bits. This
Takashi Iwai 545251
+ * still allows all 4 native chip selects to work as well as gpio chip selects
Takashi Iwai 545251
+ * (which can use any of the 4 chip select configurations).
Takashi Iwai 545251
+ */
Takashi Iwai 545251
+
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL		0x08
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_ENABLE		(1 <<  0)
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_XCH		(1 <<  2)
Takashi Iwai 545251
@@ -260,16 +272,16 @@ static bool spi_imx_can_dma(struct spi_controller *controller, struct spi_device
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_DRCTL(drctl)	((drctl) << 16)
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_POSTDIV_OFFSET	8
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_PREDIV_OFFSET	12
Takashi Iwai 545251
-#define MX51_ECSPI_CTRL_CS(cs)		((cs) << 18)
Takashi Iwai 545251
+#define MX51_ECSPI_CTRL_CS(cs)		((cs & 3) << 18)
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_BL_OFFSET	20
Takashi Iwai 545251
 #define MX51_ECSPI_CTRL_BL_MASK		(0xfff << 20)
Takashi Iwai 545251
 
Takashi Iwai 545251
 #define MX51_ECSPI_CONFIG	0x0c
Takashi Iwai 545251
-#define MX51_ECSPI_CONFIG_SCLKPHA(cs)	(1 << ((cs) +  0))
Takashi Iwai 545251
-#define MX51_ECSPI_CONFIG_SCLKPOL(cs)	(1 << ((cs) +  4))
Takashi Iwai 545251
-#define MX51_ECSPI_CONFIG_SBBCTRL(cs)	(1 << ((cs) +  8))
Takashi Iwai 545251
-#define MX51_ECSPI_CONFIG_SSBPOL(cs)	(1 << ((cs) + 12))
Takashi Iwai 545251
-#define MX51_ECSPI_CONFIG_SCLKCTL(cs)	(1 << ((cs) + 20))
Takashi Iwai 545251
+#define MX51_ECSPI_CONFIG_SCLKPHA(cs)	(1 << ((cs & 3) +  0))
Takashi Iwai 545251
+#define MX51_ECSPI_CONFIG_SCLKPOL(cs)	(1 << ((cs & 3) +  4))
Takashi Iwai 545251
+#define MX51_ECSPI_CONFIG_SBBCTRL(cs)	(1 << ((cs & 3) +  8))
Takashi Iwai 545251
+#define MX51_ECSPI_CONFIG_SSBPOL(cs)	(1 << ((cs & 3) + 12))
Takashi Iwai 545251
+#define MX51_ECSPI_CONFIG_SCLKCTL(cs)	(1 << ((cs & 3) + 20))
Takashi Iwai 545251
 
Takashi Iwai 545251
 #define MX51_ECSPI_INT		0x10
Takashi Iwai 545251
 #define MX51_ECSPI_INT_TEEN		(1 <<  0)
Takashi Iwai 545251
-- 
Takashi Iwai 545251
2.35.3
Takashi Iwai 545251