Skip to contentSkip to conversation

memory: renesas-rpc-if: Add support for R-Car Gen4

PATCH Applied Geert Uytterhoeven 3 participants 6 messages Oct 12, 2022 – Oct 18, 2022 Memory controller drivers

lore
Share & tools
lore
#0 lore raw

cover memory: renesas-rpc-if: Add support for R-Car Gen4

Hi all,

This patch series adds support for the SPI Multi I/O Bus Controller (RPC-IF) in R-Car Gen4 SoCs, which is very similar to the variant found in R-Car Gen3 SoCs:
- The first patch fixes a missed initialization issue, which is at least seen with the current firmware stack on R-Car V4H,
- The second patch adds the actual support, and takes care of the increased size of the STRTIM field.

This has been tested on the White Hawk development board with R-Car V4H. Thanks for your comments!

Cong Dang (1):
memory: renesas-rpc-if: Clear HS bit during hardware initialization

Geert Uytterhoeven (1):
memory: renesas-rpc-if: Add support for R-Car Gen4

 drivers/memory/renesas-rpc-if.c | 22 +++++++++++++++-------
 include/memory/renesas-rpc-if.h |  1 +
 2 files changed, 16 insertions(+), 7 deletions(-)
Signature · 12 lines
2.25.1

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds
#1 lore raw

PATCH 1/2 memory: renesas-rpc-if: Clear HS bit during hardware initialization

From: Cong Dang <[email protected]>

According to the datasheet, HS bit should be specified to 1 when using DMA transfer. As DMA transfer is not supported, it should be cleared to 0.

Previously, the driver relied on the HS bit being cleared by prior firmware but this is not always the case.

Fix this by ensuring the bit is cleared during hardware initialization.

Fixes ca7d8b980b67f133 ("memory: add Renesas RPC-IF driver")
---
 drivers/memory/renesas-rpc-if.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/memory/renesas-rpc-if.c +3 -0
index 4316988d791a527f..61c288d403750b14 100644
@@ -317,6 +317,9 @@ int rpcif_hw_init(struct rpcif *rpc, bool hyperflash)
 	regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_PHYMEM_MASK,
 			   RPCIF_PHYCNT_PHYMEM(hyperflash ? 3 : 0));
 
+	/* DMA Transfer is not supported */
+	regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_HS, 0);
+
 	if (rpc->type == RPCIF_RCAR_GEN3)
 		regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
 				   RPCIF_PHYCNT_STRTIM(7), RPCIF_PHYCNT_STRTIM(7));
Signature · 1 line
2.25.1
Reviewed-by on v1 1/2
#2 lore raw

Re: [PATCH 1/2] memory: renesas-rpc-if: Clear HS bit during hardware initialization

Quoted 9 lines · Geert Uytterhoeven

From: Cong Dang <[email protected]>

According to the datasheet, HS bit should be specified to 1 when using DMA transfer. As DMA transfer is not supported, it should be cleared to 0.

Previously, the driver relied on the HS bit being cleared by prior firmware but this is not always the case.

Quoted 6 lines

Fix this by ensuring the bit is cleared during hardware initialization.

Fixes ca7d8b980b67f133 ("memory: add Renesas RPC-IF driver")
#3 lore raw

PATCH 2/2 memory: renesas-rpc-if: Add support for R-Car Gen4

In reply to Geert Uytterhoeven

The SPI Multi I/O Bus Controller (RPC-IF) on R-Car Gen4 SoCs is very similar to the RPC-IF on R-Car Gen3 SoCs. It does support four instead of three bits of strobe timing adjustment (STRTIM), and thus requires a new mask and new settings.

Inspired by a patch in the BSP by Cong Dang.

---
 drivers/memory/renesas-rpc-if.c | 19 ++++++++++++-------
 include/memory/renesas-rpc-if.h |  1 +
 2 files changed, 13 insertions(+), 7 deletions(-)
drivers/memory/renesas-rpc-if.c +12 -7
index 61c288d403750b14..09cd4318a83d84d3 100644
@@ -136,7 +136,8 @@
 #define RPCIF_PHYCNT_DDRCAL	BIT(19)
 #define RPCIF_PHYCNT_HS		BIT(18)
 #define RPCIF_PHYCNT_CKSEL(v)	(((v) & 0x3) << 16) /* valid only for RZ/G2L */
-#define RPCIF_PHYCNT_STRTIM(v)	(((v) & 0x7) << 15) /* valid for R-Car and RZ/G2{E,H,M,N} */
+#define RPCIF_PHYCNT_STRTIM(v)	(((v) & 0x7) << 15 | ((v) & 0x8) << 24) /* valid for R-Car and RZ/G2{E,H,M,N} */
+
 #define RPCIF_PHYCNT_WBUF2	BIT(4)
 #define RPCIF_PHYCNT_WBUF	BIT(2)
 #define RPCIF_PHYCNT_PHYMEM(v)	(((v) & 0x3) << 0)
@@ -323,6 +324,9 @@ int rpcif_hw_init(struct rpcif *rpc, bool hyperflash)
 	if (rpc->type == RPCIF_RCAR_GEN3)
 		regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
 				   RPCIF_PHYCNT_STRTIM(7), RPCIF_PHYCNT_STRTIM(7));
+	else if (rpc->type == RPCIF_RCAR_GEN4)
+		regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
+				   RPCIF_PHYCNT_STRTIM(15), RPCIF_PHYCNT_STRTIM(15));
 
 	regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1, RPCIF_PHYOFFSET1_DDRTMG(3),
 			   RPCIF_PHYOFFSET1_DDRTMG(3));
@@ -333,17 +337,17 @@ int rpcif_hw_init(struct rpcif *rpc, bool hyperflash)
 		regmap_update_bits(rpc->regmap, RPCIF_PHYINT,
 				   RPCIF_PHYINT_WPVAL, 0);
 
-	if (rpc->type == RPCIF_RCAR_GEN3)
-		regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
-				   RPCIF_CMNCR_MOIIO(3) | RPCIF_CMNCR_BSZ(3),
-				   RPCIF_CMNCR_MOIIO(3) |
-				   RPCIF_CMNCR_BSZ(hyperflash ? 1 : 0));
-	else
+	if (rpc->type == RPCIF_RZ_G2L)
 		regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
 				   RPCIF_CMNCR_MOIIO(3) | RPCIF_CMNCR_IOFV(3) |
 				   RPCIF_CMNCR_BSZ(3),
 				   RPCIF_CMNCR_MOIIO(1) | RPCIF_CMNCR_IOFV(2) |
 				   RPCIF_CMNCR_BSZ(hyperflash ? 1 : 0));
+	else
+		regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
+				   RPCIF_CMNCR_MOIIO(3) | RPCIF_CMNCR_BSZ(3),
+				   RPCIF_CMNCR_MOIIO(3) |
+				   RPCIF_CMNCR_BSZ(hyperflash ? 1 : 0));
 
 	/* Set RCF after BSZ update */
 	regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
@@ -718,6 +722,7 @@ static int rpcif_remove(struct platform_device *pdev)
 
 static const struct of_device_id rpcif_of_match[] = {
 	{ .compatible = "renesas,rcar-gen3-rpc-if", .data = (void *)RPCIF_RCAR_GEN3 },
+	{ .compatible = "renesas,rcar-gen4-rpc-if", .data = (void *)RPCIF_RCAR_GEN4 },
 	{ .compatible = "renesas,rzg2l-rpc-if", .data = (void *)RPCIF_RZ_G2L },
 	{},
 };
include/memory/renesas-rpc-if.h +1 -0
index 9c0ad64b8d292d49..862eff613dc7963d 100644
@@ -59,6 +59,7 @@ struct rpcif_op {
 
 enum rpcif_type {
 	RPCIF_RCAR_GEN3,
+	RPCIF_RCAR_GEN4,
 	RPCIF_RZ_G2L,
 };
 
Signature · 1 line
2.25.1
Reviewed-by on v1 2/2
#4 lore raw
Quoted 8 lines · Geert Uytterhoeven

The SPI Multi I/O Bus Controller (RPC-IF) on R-Car Gen4 SoCs is very similar to the RPC-IF on R-Car Gen3 SoCs. It does support four instead of three bits of strobe timing adjustment (STRTIM), and thus requires a new mask and new settings.

Inspired by a patch in the BSP by Cong Dang.

Quoted 1 line

+#define RPCIF_PHYCNT_STRTIM(v) (((v) & 0x7) << 15 | ((v) & 0x8) << 24) /* valid for R-Car and RZ/G2{E,H,M,N} */

Very minor but I spent a minute to get it: To make sure the reader easily understands that we want to set bit 27, we could make that maybe more clear with:

	... | !!((v) & 0x8) << 27)

But if you prefer, we can keep it like this.

#5 lore raw
In reply to Geert Uytterhoeven
Quoted 11 lines · Geert Uytterhoeven

Hi all,

This patch series adds support for the SPI Multi I/O Bus Controller (RPC-IF) in R-Car Gen4 SoCs, which is very similar to the variant found in R-Car Gen3 SoCs:
- The first patch fixes a missed initialization issue, which is at least seen with the current firmware stack on R-Car V4H,
- The second patch adds the actual support, and takes care of the increased size of the STRTIM field.

[...]

Applied, thanks!

[1/2] memory: renesas-rpc-if: Clear HS bit during hardware initialization

      https://git.kernel.org/krzk/linux-mem-ctrl/c/d37f4c58e47f6129fbb8c52f6d1a70e71fc2c0c7
[2/2] memory: renesas-rpc-if: Add support for R-Car Gen4
      https://git.kernel.org/krzk/linux-mem-ctrl/c/455aad51434e9622702373be57973a6c47a88684

Best regards,

Signature · 1 line
Krzysztof Kozlowski <[email protected]>