cip-dev.lists.cip-project.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support
@ 2025-07-14 10:16 Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 01/36] clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1 Biju Das
                   ` (37 more replies)
  0 siblings, 38 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

This series adds support for the RZ/G3E CANFD driver into 6.12.y-cip.
All the patches in the series are cherry-picked from mainline.

Biju Das (25):
  clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1
  clk: renesas: rzv2h: Fix a typo
  clk: renesas: rzv2h: Support static dividers without RMW
  dt-bindings: can: renesas,rcar-canfd: Simplify the conditional schema
  dt-bindings: can: renesas,rcar-canfd: Document RZ/G3E support
  can: rcar_canfd: Use of_get_available_child_by_name()
  can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro
  can: rcar_canfd: Update RCANFD_GERFL_ERR macro
  can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC
    macro
  can: rcar_canfd: Add rcar_canfd_setrnc()
  can: rcar_canfd: Update RCANFD_GAFLCFG macro
  can: rcar_canfd: Add rnc_field_width variable to struct
    rcar_canfd_hw_info
  can: rcar_canfd: Add max_aflpn variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add max_cftml variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add {nom,data}_bittiming variables to struct
    rcar_canfd_hw_info
  can: rcar_canfd: Add ch_interface_mode variable to struct
    rcar_canfd_hw_info
  can: rcar_canfd: Add shared_can_regs variable to struct
    rcar_canfd_hw_info
  can: rcar_canfd: Add struct rcanfd_regs variable to struct
    rcar_canfd_hw_info
  can: rcar_canfd: Add sh variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add external_clk variable to struct
    rcar_canfd_hw_info
  can: rcar_canfd: Enhance multi_channel_irqs handling
  can: rcar_canfd: Add RZ/G3E support
  arm64: dts: renesas: r9a09g047: Add CANFD node
  arm64: dts: renesas: r9a09g047e57-smarc: Enable CANFD
  arm64: dts: renesas: r9a09g047e57-smarc: Enable CAN Transceiver

Lad Prabhakar (9):
  clk: renesas: rzv2h: Update error message
  clk: renesas: rzv2h: Remove unused `type` field from `struct pll_clk`
  clk: renesas: rzv2h: Add support for enabling PLLs
  clk: renesas: rzv2h: Rename PLL field macros for consistency
  clk: renesas: rzv2h: Sort compatible list based on SoC part number
  clk: renesas: rzv2h: Add support for static mux clocks
  clk: renesas: rzv2h: Add macro for defining static dividers
  clk: renesas: rzv2h: Use str_on_off() helper in
    rzv2h_mod_clock_endisable()
  clk: renesas: rzv2h: Use both CLK_ON and CLK_MON bits for clock state
    validation

Tommaso Merciai (2):
  clk: renesas: rzv2h: Improve rzv2h_ddiv_set_rate()
  clk: renesas: rzv2h: Simplify rzv2h_cpg_assert()/rzv2h_cpg_deassert()

 .../bindings/net/can/renesas,rcar-canfd.yaml  | 171 ++++++++---
 arch/arm64/boot/dts/renesas/r9a09g047.dtsi    |  60 ++++
 .../boot/dts/renesas/r9a09g047e57-smarc.dts   |  53 ++++
 .../boot/dts/renesas/renesas-smarc2.dtsi      |  29 ++
 .../boot/dts/renesas/rzg3e-smarc-som.dtsi     |  14 +-
 drivers/clk/renesas/rzv2h-cpg.c               | 183 ++++++++----
 drivers/clk/renesas/rzv2h-cpg.h               |  54 ++++
 drivers/net/can/rcar/rcar_canfd.c             | 278 +++++++++++++-----
 8 files changed, 676 insertions(+), 166 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 01/36] clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 02/36] clk: renesas: rzv2h: Update error message Biju Das
                   ` (36 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 69ac2acd209a15bd7a61a15c9532a5b505252e1c upstream.

Avoid using the "- 1" for finding mstop_index in all functions accessing
priv->mstop_count, by adjusting its pointer in rzv2h_cpg_probe().

While at it, drop the intermediate local variable index.

Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
Closes: https://lore.kernel.org/all/CAMuHMdX1gPNCFddg_DyK7Bv0BeFLOLi=5eteT_HhMH=Ph2wVvA@mail.gmail.com/
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250222142009.41324-1-biju.das.jz@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 54ed7a75be6e9..7e85bfde46dcd 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -450,8 +450,7 @@ static void rzv2h_mod_clock_mstop_enable(struct rzv2h_cpg_priv *priv,
 {
 	unsigned long mstop_mask = FIELD_GET(BUS_MSTOP_BITS_MASK, mstop_data);
 	u16 mstop_index = FIELD_GET(BUS_MSTOP_IDX_MASK, mstop_data);
-	unsigned int index = (mstop_index - 1) * 16;
-	atomic_t *mstop = &priv->mstop_count[index];
+	atomic_t *mstop = &priv->mstop_count[mstop_index * 16];
 	unsigned long flags;
 	unsigned int i;
 	u32 val = 0;
@@ -472,8 +471,7 @@ static void rzv2h_mod_clock_mstop_disable(struct rzv2h_cpg_priv *priv,
 {
 	unsigned long mstop_mask = FIELD_GET(BUS_MSTOP_BITS_MASK, mstop_data);
 	u16 mstop_index = FIELD_GET(BUS_MSTOP_IDX_MASK, mstop_data);
-	unsigned int index = (mstop_index - 1) * 16;
-	atomic_t *mstop = &priv->mstop_count[index];
+	atomic_t *mstop = &priv->mstop_count[mstop_index * 16];
 	unsigned long flags;
 	unsigned int i;
 	u32 val = 0;
@@ -633,8 +631,7 @@ rzv2h_cpg_register_mod_clk(const struct rzv2h_mod_clk *mod,
 	} else if (clock->mstop_data != BUS_MSTOP_NONE && mod->critical) {
 		unsigned long mstop_mask = FIELD_GET(BUS_MSTOP_BITS_MASK, clock->mstop_data);
 		u16 mstop_index = FIELD_GET(BUS_MSTOP_IDX_MASK, clock->mstop_data);
-		unsigned int index = (mstop_index - 1) * 16;
-		atomic_t *mstop = &priv->mstop_count[index];
+		atomic_t *mstop = &priv->mstop_count[mstop_index * 16];
 		unsigned long flags;
 		unsigned int i;
 		u32 val = 0;
@@ -929,6 +926,9 @@ static int __init rzv2h_cpg_probe(struct platform_device *pdev)
 	if (!priv->mstop_count)
 		return -ENOMEM;
 
+	/* Adjust for CPG_BUS_m_MSTOP starting from m = 1 */
+	priv->mstop_count -= 16;
+
 	priv->resets = devm_kmemdup(dev, info->resets, sizeof(*info->resets) *
 				    info->num_resets, GFP_KERNEL);
 	if (!priv->resets)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 02/36] clk: renesas: rzv2h: Update error message
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 01/36] clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1 Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 03/36] clk: renesas: rzv2h: Remove unused `type` field from `struct pll_clk` Biju Das
                   ` (35 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit 43961f7ee3f31c97209157bd19420ea8a65b1181 upstream.

Update the error message in `rzv2h_mod_clock_endisable()` to provide
clearer debugging information. Instead of printing only the register
address, include both the `GET_CLK_ON_OFFSET(reg)` offset and the
corresponding `clk` name (`%pC`). This enhances readability and aids
in debugging clock enable failures.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250211105603.195905-2-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 7e85bfde46dcd..227a30d592fdd 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -542,8 +542,8 @@ static int rzv2h_mod_clock_endisable(struct clk_hw *hw, bool enable)
 	error = readl_poll_timeout_atomic(priv->base + reg, value,
 					  value & bitmask, 0, 10);
 	if (error)
-		dev_err(dev, "Failed to enable CLK_ON %p\n",
-			priv->base + reg);
+		dev_err(dev, "Failed to enable CLK_ON 0x%x/%pC\n",
+			GET_CLK_ON_OFFSET(clock->on_index), hw->clk);
 
 	return error;
 }
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 03/36] clk: renesas: rzv2h: Remove unused `type` field from `struct pll_clk`
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 01/36] clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1 Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 02/36] clk: renesas: rzv2h: Update error message Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 04/36] clk: renesas: rzv2h: Add support for enabling PLLs Biju Das
                   ` (34 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit 18510fd7bfe66218a07024fb9f2a204e0f623794 upstream.

Remove the redundant `type` field from `struct pll_clk`, as it is not used
in the PLL clock handling logic.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250309211402.80886-3-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 227a30d592fdd..5713805cac13e 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -97,7 +97,6 @@ struct pll_clk {
 	void __iomem *base;
 	struct clk_hw hw;
 	struct pll pll;
-	unsigned int type;
 };
 
 #define to_pll(_hw)	container_of(_hw, struct pll_clk, hw)
@@ -199,7 +198,6 @@ rzv2h_cpg_pll_clk_register(const struct cpg_core_clk *core,
 	pll_clk->pll = core->cfg.pll;
 	pll_clk->base = base;
 	pll_clk->priv = priv;
-	pll_clk->type = core->type;
 
 	ret = devm_clk_hw_register(dev, &pll_clk->hw);
 	if (ret)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 04/36] clk: renesas: rzv2h: Add support for enabling PLLs
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (2 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 03/36] clk: renesas: rzv2h: Remove unused `type` field from `struct pll_clk` Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 05/36] clk: renesas: rzv2h: Rename PLL field macros for consistency Biju Das
                   ` (33 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit fea942bc15135e065b456421f7a163df036242c5 upstream.

Some RZ/V2H(P) SoC variants do not have a GPU, resulting in PLLGPU being
disabled by default in TF-A. Add support for enabling PLL clocks in the
RZ/V2H(P) CPG driver to manage this.

Introduce `is_enabled` and `enable` callbacks to handle PLL state
transitions. With the `enable` callback, PLLGPU will be turned ON only
when the GPU node is enabled; otherwise, it will remain off. Define new
macros for PLL standby and monitor registers to facilitate this process.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250309211402.80886-4-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 56 +++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 5713805cac13e..fd9d401d184fe 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -44,12 +44,18 @@
 #define CPG_BUS_1_MSTOP		(0xd00)
 #define CPG_BUS_MSTOP(m)	(CPG_BUS_1_MSTOP + ((m) - 1) * 4)
 
+#define CPG_PLL_STBY(x)		((x))
+#define CPG_PLL_STBY_RESETB	BIT(0)
+#define CPG_PLL_STBY_RESETB_WEN	BIT(16)
 #define CPG_PLL_CLK1(x)		((x) + 0x004)
 #define KDIV(val)		((s16)FIELD_GET(GENMASK(31, 16), (val)))
 #define MDIV(val)		FIELD_GET(GENMASK(15, 6), (val))
 #define PDIV(val)		FIELD_GET(GENMASK(5, 0), (val))
 #define CPG_PLL_CLK2(x)		((x) + 0x008)
 #define SDIV(val)		FIELD_GET(GENMASK(2, 0), (val))
+#define CPG_PLL_MON(x)		((x) + 0x010)
+#define CPG_PLL_MON_RESETB	BIT(0)
+#define CPG_PLL_MON_LOCK	BIT(4)
 
 #define DDIV_DIVCTL_WEN(shift)		BIT((shift) + 16)
 
@@ -141,6 +147,54 @@ struct ddiv_clk {
 
 #define to_ddiv_clock(_div) container_of(_div, struct ddiv_clk, div)
 
+static int rzv2h_cpg_pll_clk_is_enabled(struct clk_hw *hw)
+{
+	struct pll_clk *pll_clk = to_pll(hw);
+	struct rzv2h_cpg_priv *priv = pll_clk->priv;
+	u32 val = readl(priv->base + CPG_PLL_MON(pll_clk->pll.offset));
+
+	/* Ensure both RESETB and LOCK bits are set */
+	return (val & (CPG_PLL_MON_RESETB | CPG_PLL_MON_LOCK)) ==
+	       (CPG_PLL_MON_RESETB | CPG_PLL_MON_LOCK);
+}
+
+static int rzv2h_cpg_pll_clk_enable(struct clk_hw *hw)
+{
+	struct pll_clk *pll_clk = to_pll(hw);
+	struct rzv2h_cpg_priv *priv = pll_clk->priv;
+	struct pll pll = pll_clk->pll;
+	u32 stby_offset;
+	u32 mon_offset;
+	u32 val;
+	int ret;
+
+	if (rzv2h_cpg_pll_clk_is_enabled(hw))
+		return 0;
+
+	stby_offset = CPG_PLL_STBY(pll.offset);
+	mon_offset = CPG_PLL_MON(pll.offset);
+
+	writel(CPG_PLL_STBY_RESETB_WEN | CPG_PLL_STBY_RESETB,
+	       priv->base + stby_offset);
+
+	/*
+	 * Ensure PLL enters into normal mode
+	 *
+	 * Note: There is no HW information about the worst case latency.
+	 *
+	 * Since this latency might depend on external crystal or PLL rate,
+	 * use a "super" safe timeout value.
+	 */
+	ret = readl_poll_timeout_atomic(priv->base + mon_offset, val,
+			(val & (CPG_PLL_MON_RESETB | CPG_PLL_MON_LOCK)) ==
+			(CPG_PLL_MON_RESETB | CPG_PLL_MON_LOCK), 200, 2000);
+	if (ret)
+		dev_err(priv->dev, "Failed to enable PLL 0x%x/%pC\n",
+			stby_offset, hw->clk);
+
+	return ret;
+}
+
 static unsigned long rzv2h_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
 						   unsigned long parent_rate)
 {
@@ -163,6 +217,8 @@ static unsigned long rzv2h_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
 }
 
 static const struct clk_ops rzv2h_cpg_pll_ops = {
+	.is_enabled = rzv2h_cpg_pll_clk_is_enabled,
+	.enable = rzv2h_cpg_pll_clk_enable,
 	.recalc_rate = rzv2h_cpg_pll_clk_recalc_rate,
 };
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 05/36] clk: renesas: rzv2h: Rename PLL field macros for consistency
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (3 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 04/36] clk: renesas: rzv2h: Add support for enabling PLLs Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 06/36] clk: renesas: rzv2h: Improve rzv2h_ddiv_set_rate() Biju Das
                   ` (32 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit 360387a8f17d2cf7afd894c318df959112f377c7 upstream.

Rename PLL field extraction macros to include the associated register name
(`CPG_PLL_CLK1` or `CPG_PLL_CLK2`) to maintain consistency with other PLL
register macros. Update all corresponding macro references accordingly.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250309211402.80886-5-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index fd9d401d184fe..b8bed0c1d9186 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -48,11 +48,11 @@
 #define CPG_PLL_STBY_RESETB	BIT(0)
 #define CPG_PLL_STBY_RESETB_WEN	BIT(16)
 #define CPG_PLL_CLK1(x)		((x) + 0x004)
-#define KDIV(val)		((s16)FIELD_GET(GENMASK(31, 16), (val)))
-#define MDIV(val)		FIELD_GET(GENMASK(15, 6), (val))
-#define PDIV(val)		FIELD_GET(GENMASK(5, 0), (val))
+#define CPG_PLL_CLK1_KDIV(x)	((s16)FIELD_GET(GENMASK(31, 16), (x)))
+#define CPG_PLL_CLK1_MDIV(x)	FIELD_GET(GENMASK(15, 6), (x))
+#define CPG_PLL_CLK1_PDIV(x)	FIELD_GET(GENMASK(5, 0), (x))
 #define CPG_PLL_CLK2(x)		((x) + 0x008)
-#define SDIV(val)		FIELD_GET(GENMASK(2, 0), (val))
+#define CPG_PLL_CLK2_SDIV(x)	FIELD_GET(GENMASK(2, 0), (x))
 #define CPG_PLL_MON(x)		((x) + 0x010)
 #define CPG_PLL_MON_RESETB	BIT(0)
 #define CPG_PLL_MON_LOCK	BIT(4)
@@ -210,10 +210,10 @@ static unsigned long rzv2h_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
 	clk1 = readl(priv->base + CPG_PLL_CLK1(pll.offset));
 	clk2 = readl(priv->base + CPG_PLL_CLK2(pll.offset));
 
-	rate = mul_u64_u32_shr(parent_rate, (MDIV(clk1) << 16) + KDIV(clk1),
-			       16 + SDIV(clk2));
+	rate = mul_u64_u32_shr(parent_rate, (CPG_PLL_CLK1_MDIV(clk1) << 16) +
+			       CPG_PLL_CLK1_KDIV(clk1), 16 + CPG_PLL_CLK2_SDIV(clk2));
 
-	return DIV_ROUND_CLOSEST_ULL(rate, PDIV(clk1));
+	return DIV_ROUND_CLOSEST_ULL(rate, CPG_PLL_CLK1_PDIV(clk1));
 }
 
 static const struct clk_ops rzv2h_cpg_pll_ops = {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 06/36] clk: renesas: rzv2h: Improve rzv2h_ddiv_set_rate()
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (4 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 05/36] clk: renesas: rzv2h: Rename PLL field macros for consistency Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 07/36] clk: renesas: rzv2h: Simplify rzv2h_cpg_assert()/rzv2h_cpg_deassert() Biju Das
                   ` (31 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

commit ce0a97ff7127312aaee137fcdb159d8ddd14ede4 upstream.

Remove duplicate code into rzv2h_ddiv_set_rate().

Reported-by: Pavel Machek <pavel@denx.de>
Closes: https://lore.kernel.org/cip-dev/Z9QBZo4GgtMjid0v@duo.ucw.cz/
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250317083213.371614-3-tommaso.merciai.xr@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index b8bed0c1d9186..1c09b92981ff4 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -329,12 +329,6 @@ static int rzv2h_ddiv_set_rate(struct clk_hw *hw, unsigned long rate,
 	writel(val, divider->reg);
 
 	ret = rzv2h_cpg_wait_ddiv_clk_update_done(priv->base, ddiv->mon);
-	if (ret)
-		goto ddiv_timeout;
-
-	spin_unlock_irqrestore(divider->lock, flags);
-
-	return 0;
 
 ddiv_timeout:
 	spin_unlock_irqrestore(divider->lock, flags);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 07/36] clk: renesas: rzv2h: Simplify rzv2h_cpg_assert()/rzv2h_cpg_deassert()
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (5 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 06/36] clk: renesas: rzv2h: Improve rzv2h_ddiv_set_rate() Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 08/36] clk: renesas: rzv2h: Sort compatible list based on SoC part number Biju Das
                   ` (30 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

commit b224c42568bc4e0d99bb4735c66123202e8b0e7f upstream.

rzv2h_cpg_assert() and rzv2h_cpg_deassert() functions are similar. Share
this code via __rzv2h_cpg_assert(). This avoid code duplication.

Reported-by: Pavel Machek <pavel@denx.de>
Closes: https://lore.kernel.org/cip-dev/Z9QA9rwuXCuVbOXp@duo.ucw.cz/
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250317083213.371614-4-tommaso.merciai.xr@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 34 +++++++++++++++------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 1c09b92981ff4..81aed6ba76372 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -709,8 +709,8 @@ rzv2h_cpg_register_mod_clk(const struct rzv2h_mod_clk *mod,
 		mod->name, PTR_ERR(clk));
 }
 
-static int rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
-			    unsigned long id)
+static int __rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
+			      unsigned long id, bool assert)
 {
 	struct rzv2h_cpg_priv *priv = rcdev_to_priv(rcdev);
 	unsigned int reg = GET_RST_OFFSET(priv->resets[id].reset_index);
@@ -718,35 +718,31 @@ static int rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
 	u8 monbit = priv->resets[id].mon_bit;
 	u32 value = mask << 16;
 
-	dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, reg);
+	dev_dbg(rcdev->dev, "%s id:%ld offset:0x%x\n",
+		assert ? "assert" : "deassert", id, reg);
 
+	if (!assert)
+		value |= mask;
 	writel(value, priv->base + reg);
 
 	reg = GET_RST_MON_OFFSET(priv->resets[id].mon_index);
 	mask = BIT(monbit);
 
 	return readl_poll_timeout_atomic(priv->base + reg, value,
-					 value & mask, 10, 200);
+					 assert ? (value & mask) : !(value & mask),
+					 10, 200);
+}
+
+static int rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
+			    unsigned long id)
+{
+	return __rzv2h_cpg_assert(rcdev, id, true);
 }
 
 static int rzv2h_cpg_deassert(struct reset_controller_dev *rcdev,
 			      unsigned long id)
 {
-	struct rzv2h_cpg_priv *priv = rcdev_to_priv(rcdev);
-	unsigned int reg = GET_RST_OFFSET(priv->resets[id].reset_index);
-	u32 mask = BIT(priv->resets[id].reset_bit);
-	u8 monbit = priv->resets[id].mon_bit;
-	u32 value = (mask << 16) | mask;
-
-	dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id, reg);
-
-	writel(value, priv->base + reg);
-
-	reg = GET_RST_MON_OFFSET(priv->resets[id].mon_index);
-	mask = BIT(monbit);
-
-	return readl_poll_timeout_atomic(priv->base + reg, value,
-					 !(value & mask), 10, 200);
+	return __rzv2h_cpg_assert(rcdev, id, false);
 }
 
 static int rzv2h_cpg_reset(struct reset_controller_dev *rcdev,
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 08/36] clk: renesas: rzv2h: Sort compatible list based on SoC part number
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (6 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 07/36] clk: renesas: rzv2h: Simplify rzv2h_cpg_assert()/rzv2h_cpg_deassert() Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 09/36] clk: renesas: rzv2h: Fix a typo Biju Das
                   ` (29 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit c3400fd7c717e752701e6832175f86ff935b812b upstream.

Reorder the compatible entries in `rzv2h_cpg_match[]` to follow a
numerical sequence based on the SoC part numbers.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407191628.323613-8-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 81aed6ba76372..7962466cd51ba 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -1014,17 +1014,17 @@ static int __init rzv2h_cpg_probe(struct platform_device *pdev)
 }
 
 static const struct of_device_id rzv2h_cpg_match[] = {
-#ifdef CONFIG_CLK_R9A09G057
-	{
-		.compatible = "renesas,r9a09g057-cpg",
-		.data = &r9a09g057_cpg_info,
-	},
-#endif
 #ifdef CONFIG_CLK_R9A09G047
 	{
 		.compatible = "renesas,r9a09g047-cpg",
 		.data = &r9a09g047_cpg_info,
 	},
+#endif
+#ifdef CONFIG_CLK_R9A09G057
+	{
+		.compatible = "renesas,r9a09g057-cpg",
+		.data = &r9a09g057_cpg_info,
+	},
 #endif
 	{ /* sentinel */ }
 };
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 09/36] clk: renesas: rzv2h: Fix a typo
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (7 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 08/36] clk: renesas: rzv2h: Sort compatible list based on SoC part number Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 10/36] clk: renesas: rzv2h: Add support for static mux clocks Biju Das
                   ` (28 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 506f96095ec2d7d1279fb49e78ae27b2abd915de upstream.

Fix a typo montor->monitor in kernel-doc comment.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250320093107.36784-1-biju.das.jz@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 7962466cd51ba..83175c3269647 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -117,7 +117,7 @@ struct pll_clk {
  * @on_index: register offset
  * @on_bit: ON/MON bit
  * @mon_index: monitor register offset
- * @mon_bit: montor bit
+ * @mon_bit: monitor bit
  */
 struct mod_clock {
 	struct rzv2h_cpg_priv *priv;
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 10/36] clk: renesas: rzv2h: Add support for static mux clocks
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (8 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 09/36] clk: renesas: rzv2h: Fix a typo Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 11/36] clk: renesas: rzv2h: Add macro for defining static dividers Biju Das
                   ` (27 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit c1d6f686e5cb2530e1d04a4c994c3085c00e644c upstream.

Add support for `CLK_TYPE_SMUX` to register static muxed clocks on the
Renesas RZ/V2H(P) SoC.  Extend `cpg_core_clk` to include parent names,
mux flags, and a new `smuxed` struct.  Update clock registration to
handle static mux clocks.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407165202.197570-2-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 21 +++++++++++++++++++++
 drivers/clk/renesas/rzv2h-cpg.h | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 83175c3269647..7b797668b65c9 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -393,6 +393,24 @@ rzv2h_cpg_ddiv_clk_register(const struct cpg_core_clk *core,
 	return div->hw.clk;
 }
 
+static struct clk * __init
+rzv2h_cpg_mux_clk_register(const struct cpg_core_clk *core,
+			   struct rzv2h_cpg_priv *priv)
+{
+	struct smuxed mux = core->cfg.smux;
+	const struct clk_hw *clk_hw;
+
+	clk_hw = devm_clk_hw_register_mux(priv->dev, core->name,
+					  core->parent_names, core->num_parents,
+					  core->flag, priv->base + mux.offset,
+					  mux.shift, mux.width,
+					  core->mux_flags, &priv->rmw_lock);
+	if (IS_ERR(clk_hw))
+		return ERR_CAST(clk_hw);
+
+	return clk_hw->clk;
+}
+
 static struct clk
 *rzv2h_cpg_clk_src_twocell_get(struct of_phandle_args *clkspec,
 			       void *data)
@@ -477,6 +495,9 @@ rzv2h_cpg_register_core_clk(const struct cpg_core_clk *core,
 	case CLK_TYPE_DDIV:
 		clk = rzv2h_cpg_ddiv_clk_register(core, priv);
 		break;
+	case CLK_TYPE_SMUX:
+		clk = rzv2h_cpg_mux_clk_register(core, priv);
+		break;
 	default:
 		goto fail;
 	}
diff --git a/drivers/clk/renesas/rzv2h-cpg.h b/drivers/clk/renesas/rzv2h-cpg.h
index 59f72fbed1337..03e602d70f692 100644
--- a/drivers/clk/renesas/rzv2h-cpg.h
+++ b/drivers/clk/renesas/rzv2h-cpg.h
@@ -53,6 +53,26 @@ struct ddiv {
 		.monbit = _monbit \
 	})
 
+/**
+ * struct smuxed - Structure for static muxed clocks
+ *
+ * @offset: register offset
+ * @shift: position of the divider field
+ * @width: width of the divider field
+ */
+struct smuxed {
+	unsigned int offset:11;
+	unsigned int shift:4;
+	unsigned int width:4;
+};
+
+#define SMUX_PACK(_offset, _shift, _width) \
+	((struct smuxed){ \
+		.offset = (_offset), \
+		.shift = (_shift), \
+		.width = (_width), \
+	})
+
 #define CPG_CDDIV0		(0x400)
 #define CPG_CDDIV1		(0x404)
 #define CPG_CDDIV3		(0x40C)
@@ -96,8 +116,12 @@ struct cpg_core_clk {
 		unsigned int conf;
 		struct ddiv ddiv;
 		struct pll pll;
+		struct smuxed smux;
 	} cfg;
 	const struct clk_div_table *dtable;
+	const char * const *parent_names;
+	unsigned int num_parents;
+	u8 mux_flags;
 	u32 flag;
 };
 
@@ -107,6 +131,7 @@ enum clk_types {
 	CLK_TYPE_FF,		/* Fixed Factor Clock */
 	CLK_TYPE_PLL,
 	CLK_TYPE_DDIV,		/* Dynamic Switching Divider */
+	CLK_TYPE_SMUX,		/* Static Mux */
 };
 
 #define DEF_TYPE(_name, _id, _type...) \
@@ -125,6 +150,13 @@ enum clk_types {
 		.parent = _parent, \
 		.dtable = _dtable, \
 		.flag = CLK_DIVIDER_HIWORD_MASK)
+#define DEF_SMUX(_name, _id, _smux_packed, _parent_names) \
+	DEF_TYPE(_name, _id, CLK_TYPE_SMUX, \
+		 .cfg.smux = _smux_packed, \
+		 .parent_names = _parent_names, \
+		 .num_parents = ARRAY_SIZE(_parent_names), \
+		 .flag = CLK_SET_RATE_PARENT, \
+		 .mux_flags = CLK_MUX_HIWORD_MASK)
 
 /**
  * struct rzv2h_mod_clk - Module Clocks definitions
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 11/36] clk: renesas: rzv2h: Add macro for defining static dividers
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (9 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 10/36] clk: renesas: rzv2h: Add support for static mux clocks Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 12/36] clk: renesas: rzv2h: Support static dividers without RMW Biju Das
                   ` (26 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit 6e1c795071359dc36e26ed96a271e06687d84f74 upstream.

Unlike dynamic dividers, static dividers do not have a monitor bit.
Introduce the `DEF_CSDIV()` macro for defining static dividers, ensuring
consistency with existing dynamic divider macros.

Additionally, introduce the `CSDIV_NO_MON` macro to indicate the absence
of a monitor bit, allowing the monitoring step to be skipped when `mon`
is set to `CSDIV_NO_MON`.

Note, `rzv2h_cpg_ddiv_clk_register()` will be re-used instead of generic
`clk_hw_register_divider_table()` for registering satic dividers as some
of the static dividers require RMW operations.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407165202.197570-3-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c |  3 +++
 drivers/clk/renesas/rzv2h-cpg.h | 10 ++++++++++
 2 files changed, 13 insertions(+)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 7b797668b65c9..e3867ba7cc95a 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -298,6 +298,9 @@ static inline int rzv2h_cpg_wait_ddiv_clk_update_done(void __iomem *base, u8 mon
 	u32 bitmask = BIT(mon);
 	u32 val;
 
+	if (mon == CSDIV_NO_MON)
+		return 0;
+
 	return readl_poll_timeout_atomic(base + CPG_CLKSTATUS0, val, !(val & bitmask), 10, 200);
 }
 
diff --git a/drivers/clk/renesas/rzv2h-cpg.h b/drivers/clk/renesas/rzv2h-cpg.h
index 03e602d70f692..00b52b459aadc 100644
--- a/drivers/clk/renesas/rzv2h-cpg.h
+++ b/drivers/clk/renesas/rzv2h-cpg.h
@@ -45,6 +45,14 @@ struct ddiv {
 	unsigned int monbit:5;
 };
 
+/*
+ * On RZ/V2H(P), the dynamic divider clock supports up to 19 monitor bits,
+ * while on RZ/G3E, it supports up to 16 monitor bits. Use the maximum value
+ * `0x1f` to indicate that monitor bits are not supported for static divider
+ * clocks.
+ */
+#define CSDIV_NO_MON	(0x1f)
+
 #define DDIV_PACK(_offset, _shift, _width, _monbit) \
 	((struct ddiv){ \
 		.offset = _offset, \
@@ -150,6 +158,8 @@ enum clk_types {
 		.parent = _parent, \
 		.dtable = _dtable, \
 		.flag = CLK_DIVIDER_HIWORD_MASK)
+#define DEF_CSDIV(_name, _id, _parent, _ddiv_packed, _dtable) \
+	DEF_DDIV(_name, _id, _parent, _ddiv_packed, _dtable)
 #define DEF_SMUX(_name, _id, _smux_packed, _parent_names) \
 	DEF_TYPE(_name, _id, CLK_TYPE_SMUX, \
 		 .cfg.smux = _smux_packed, \
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 12/36] clk: renesas: rzv2h: Support static dividers without RMW
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (10 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 11/36] clk: renesas: rzv2h: Add macro for defining static dividers Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 11:54   ` Pavel Machek
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 13/36] clk: renesas: rzv2h: Use str_on_off() helper in rzv2h_mod_clock_endisable() Biju Das
                   ` (25 subsequent siblings)
  37 siblings, 1 reply; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 52239ebe624016d01b3bf8a3a8510dfd57f56b21 upstream.

Add support for static dividers that do not require read-modify-write
(RMW) operations.  This enables the use of the generic clk_divider_ops
instead of the custom RMW-based implementation.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Co-developed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407165202.197570-4-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c |  5 ++++-
 drivers/clk/renesas/rzv2h-cpg.h | 12 ++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index e3867ba7cc95a..4a003a1ed8ec7 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -374,7 +374,10 @@ rzv2h_cpg_ddiv_clk_register(const struct cpg_core_clk *core,
 		return ERR_PTR(-ENOMEM);
 
 	init.name = core->name;
-	init.ops = &rzv2h_ddiv_clk_divider_ops;
+	if (cfg_ddiv.no_rmw)
+		init.ops = &clk_divider_ops;
+	else
+		init.ops = &rzv2h_ddiv_clk_divider_ops;
 	init.parent_names = &parent_name;
 	init.num_parents = 1;
 
diff --git a/drivers/clk/renesas/rzv2h-cpg.h b/drivers/clk/renesas/rzv2h-cpg.h
index 00b52b459aadc..97054f2071131 100644
--- a/drivers/clk/renesas/rzv2h-cpg.h
+++ b/drivers/clk/renesas/rzv2h-cpg.h
@@ -37,12 +37,15 @@ struct pll {
  * @shift: position of the divider bit
  * @width: width of the divider
  * @monbit: monitor bit in CPG_CLKSTATUS0 register
+ * @no_rmw: flag to indicate if the register is read-modify-write
+ *        (1: no RMW, 0: RMW)
  */
 struct ddiv {
 	unsigned int offset:11;
 	unsigned int shift:4;
 	unsigned int width:4;
 	unsigned int monbit:5;
+	unsigned int no_rmw:1;
 };
 
 /*
@@ -61,6 +64,15 @@ struct ddiv {
 		.monbit = _monbit \
 	})
 
+#define DDIV_PACK_NO_RMW(_offset, _shift, _width, _monbit) \
+	((struct ddiv){ \
+		.offset = (_offset), \
+		.shift = (_shift), \
+		.width = (_width), \
+		.monbit = (_monbit), \
+		.no_rmw = 1 \
+	})
+
 /**
  * struct smuxed - Structure for static muxed clocks
  *
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 13/36] clk: renesas: rzv2h: Use str_on_off() helper in rzv2h_mod_clock_endisable()
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (11 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 12/36] clk: renesas: rzv2h: Support static dividers without RMW Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 14/36] clk: renesas: rzv2h: Use both CLK_ON and CLK_MON bits for clock state validation Biju Das
                   ` (24 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit e6c2b4ed4906c9be9d522af75690dc570fdde5d4 upstream.

Replace hard-coded "ON"/"OFF" strings with the `str_on_off()` helper in
`rzv2h_mod_clock_endisable()`.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407165202.197570-5-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 4a003a1ed8ec7..7e7cb16646e06 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -25,6 +25,7 @@
 #include <linux/pm_domain.h>
 #include <linux/refcount.h>
 #include <linux/reset-controller.h>
+#include <linux/string_choices.h>
 
 #include <dt-bindings/clock/renesas-cpg-mssr.h>
 
@@ -592,7 +593,7 @@ static int rzv2h_mod_clock_endisable(struct clk_hw *hw, bool enable)
 	int error;
 
 	dev_dbg(dev, "CLK_ON 0x%x/%pC %s\n", reg, hw->clk,
-		enable ? "ON" : "OFF");
+		str_on_off(enable));
 
 	if (enabled == enable)
 		return 0;
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 14/36] clk: renesas: rzv2h: Use both CLK_ON and CLK_MON bits for clock state validation
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (12 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 13/36] clk: renesas: rzv2h: Use str_on_off() helper in rzv2h_mod_clock_endisable() Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 15/36] dt-bindings: can: renesas,rcar-canfd: Simplify the conditional schema Biju Das
                   ` (23 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

commit ef224dd26ca3554ba810996710bcf671bc1c6be9 upstream.

Update the clock enable/disable logic to follow the latest hardware
manual's guidelines, ensuring that both CLK_ON and CLK_MON bits are used
to confirm the clock state.

According to the manual, enabling a clock requires setting the
CPG_CLK_ON bit and verifying the clock has started using the CPG_CLK_MON
bit.  Similarly, disabling a clock requires clearing the CPG_CLK_ON bit
and confirming the clock has stopped via the CPG_CLK_MON bit.

Modify `rzv2h_mod_clock_is_enabled()` to check CLK_MON first and then
validate CLK_ON for a more accurate clock status evaluation.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407165202.197570-6-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/clk/renesas/rzv2h-cpg.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 7e7cb16646e06..34278c273505d 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -573,11 +573,14 @@ static int rzv2h_mod_clock_is_enabled(struct clk_hw *hw)
 	if (clock->mon_index >= 0) {
 		offset = GET_CLK_MON_OFFSET(clock->mon_index);
 		bitmask = BIT(clock->mon_bit);
-	} else {
-		offset = GET_CLK_ON_OFFSET(clock->on_index);
-		bitmask = BIT(clock->on_bit);
+
+		if (!(readl(priv->base + offset) & bitmask))
+			return 0;
 	}
 
+	offset = GET_CLK_ON_OFFSET(clock->on_index);
+	bitmask = BIT(clock->on_bit);
+
 	return readl(priv->base + offset) & bitmask;
 }
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 15/36] dt-bindings: can: renesas,rcar-canfd: Simplify the conditional schema
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (13 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 14/36] clk: renesas: rzv2h: Use both CLK_ON and CLK_MON bits for clock state validation Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 16/36] dt-bindings: can: renesas,rcar-canfd: Document RZ/G3E support Biju Das
                   ` (22 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 466c8ef7b66bf4595537333e96c7334e1ceb454a upstream.

RZ/G3E SoC has 20 interrupts, 2 resets and 6 channels that need more
branching with conditional schema. Simplify the conditional schema with
if statements rather than the complex if-else statements to prepare for
supporting RZ/G3E SoC.

Acked-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-2-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 .../bindings/net/can/renesas,rcar-canfd.yaml  | 99 +++++++++++--------
 1 file changed, 60 insertions(+), 39 deletions(-)

diff --git a/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml b/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml
index f6884f6e59e74..4a83498b2a8b1 100644
--- a/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml
+++ b/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml
@@ -45,7 +45,35 @@ properties:
   reg:
     maxItems: 1
 
-  interrupts: true
+  interrupts:
+    oneOf:
+      - items:
+          - description: Channel interrupt
+          - description: Global interrupt
+      - items:
+          - description: CAN global error interrupt
+          - description: CAN receive FIFO interrupt
+          - description: CAN0 error interrupt
+          - description: CAN0 transmit interrupt
+          - description: CAN0 transmit/receive FIFO receive completion interrupt
+          - description: CAN1 error interrupt
+          - description: CAN1 transmit interrupt
+          - description: CAN1 transmit/receive FIFO receive completion interrupt
+
+  interrupt-names:
+    oneOf:
+      - items:
+          - const: ch_int
+          - const: g_int
+      - items:
+          - const: g_err
+          - const: g_recc
+          - const: ch0_err
+          - const: ch0_rec
+          - const: ch0_trx
+          - const: ch1_err
+          - const: ch1_rec
+          - const: ch1_trx
 
   clocks:
     maxItems: 3
@@ -117,52 +145,55 @@ allOf:
     then:
       properties:
         interrupts:
-          items:
-            - description: CAN global error interrupt
-            - description: CAN receive FIFO interrupt
-            - description: CAN0 error interrupt
-            - description: CAN0 transmit interrupt
-            - description: CAN0 transmit/receive FIFO receive completion interrupt
-            - description: CAN1 error interrupt
-            - description: CAN1 transmit interrupt
-            - description: CAN1 transmit/receive FIFO receive completion interrupt
+          minItems: 8
+          maxItems: 8
 
         interrupt-names:
-          items:
-            - const: g_err
-            - const: g_recc
-            - const: ch0_err
-            - const: ch0_rec
-            - const: ch0_trx
-            - const: ch1_err
-            - const: ch1_rec
-            - const: ch1_trx
+          minItems: 8
+          maxItems: 8
 
         resets:
+          minItems: 2
           maxItems: 2
 
         reset-names:
-          items:
-            - const: rstp_n
-            - const: rstc_n
+          minItems: 2
+          maxItems: 2
 
       required:
         - reset-names
-    else:
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - renesas,rcar-gen3-canfd
+              - renesas,rcar-gen4-canfd
+    then:
       properties:
         interrupts:
-          items:
-            - description: Channel interrupt
-            - description: Global interrupt
+          minItems: 2
+          maxItems: 2
 
         interrupt-names:
-          items:
-            - const: ch_int
-            - const: g_int
+          minItems: 2
+          maxItems: 2
 
         resets:
           maxItems: 1
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - renesas,rcar-gen3-canfd
+              - renesas,rzg2l-canfd
+    then:
+      patternProperties:
+        "^channel[2-7]$": false
+
   - if:
       properties:
         compatible:
@@ -171,16 +202,6 @@ allOf:
     then:
       patternProperties:
         "^channel[4-7]$": false
-    else:
-      if:
-        not:
-          properties:
-            compatible:
-              contains:
-                const: renesas,rcar-gen4-canfd
-      then:
-        patternProperties:
-          "^channel[2-7]$": false
 
 unevaluatedProperties: false
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 16/36] dt-bindings: can: renesas,rcar-canfd: Document RZ/G3E support
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (14 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 15/36] dt-bindings: can: renesas,rcar-canfd: Simplify the conditional schema Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 17/36] can: rcar_canfd: Use of_get_available_child_by_name() Biju Das
                   ` (21 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit e623c6e56bdf776b001313934709f9ff38b7dda6 upstream.

Document support for the CAN-FD Interface on the RZ/G3E (R9A09G047) SoC,
which supports up to six channels.

The CAN-FD module on RZ/G3E is very similar to the one on both R-Car V4H
and RZ/G2L, but differs in some hardware parameters:
 * No external clock, but instead has ram clock.
 * Support up to 6 channels.
 * 20 interrupts.

Reviewed-by: "Rob Herring (Arm)" <robh@kernel.org>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-3-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 .../bindings/net/can/renesas,rcar-canfd.yaml  | 76 +++++++++++++++++--
 1 file changed, 70 insertions(+), 6 deletions(-)

diff --git a/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml b/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml
index 4a83498b2a8b1..f4ac21c684278 100644
--- a/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml
+++ b/Documentation/devicetree/bindings/net/can/renesas,rcar-canfd.yaml
@@ -42,6 +42,8 @@ properties:
               - renesas,r9a07g054-canfd    # RZ/V2L
           - const: renesas,rzg2l-canfd     # RZ/G2L family
 
+      - const: renesas,r9a09g047-canfd     # RZ/G3E
+
   reg:
     maxItems: 1
 
@@ -59,6 +61,19 @@ properties:
           - description: CAN1 error interrupt
           - description: CAN1 transmit interrupt
           - description: CAN1 transmit/receive FIFO receive completion interrupt
+          - description: CAN2 error interrupt
+          - description: CAN2 transmit interrupt
+          - description: CAN2 transmit/receive FIFO receive completion interrupt
+          - description: CAN3 error interrupt
+          - description: CAN3 transmit interrupt
+          - description: CAN3 transmit/receive FIFO receive completion interrupt
+          - description: CAN4 error interrupt
+          - description: CAN4 transmit interrupt
+          - description: CAN4 transmit/receive FIFO receive completion interrupt
+          - description: CAN5 error interrupt
+          - description: CAN5 transmit interrupt
+          - description: CAN5 transmit/receive FIFO receive completion interrupt
+        minItems: 8
 
   interrupt-names:
     oneOf:
@@ -74,15 +89,33 @@ properties:
           - const: ch1_err
           - const: ch1_rec
           - const: ch1_trx
+          - const: ch2_err
+          - const: ch2_rec
+          - const: ch2_trx
+          - const: ch3_err
+          - const: ch3_rec
+          - const: ch3_trx
+          - const: ch4_err
+          - const: ch4_rec
+          - const: ch4_trx
+          - const: ch5_err
+          - const: ch5_rec
+          - const: ch5_trx
+        minItems: 8
 
   clocks:
     maxItems: 3
 
   clock-names:
-    items:
-      - const: fck
-      - const: canfd
-      - const: can_clk
+    oneOf:
+      - items:
+          - const: fck
+          - const: canfd
+          - const: can_clk
+      - items:
+          - const: fck
+          - const: ram_clk
+          - const: can_clk
 
   power-domains:
     maxItems: 1
@@ -145,11 +178,9 @@ allOf:
     then:
       properties:
         interrupts:
-          minItems: 8
           maxItems: 8
 
         interrupt-names:
-          minItems: 8
           maxItems: 8
 
         resets:
@@ -183,6 +214,30 @@ allOf:
         resets:
           maxItems: 1
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: renesas,r9a09g047-canfd
+    then:
+      properties:
+        interrupts:
+          minItems: 20
+
+        interrupt-names:
+          minItems: 20
+
+        resets:
+          minItems: 2
+          maxItems: 2
+
+        reset-names:
+          minItems: 2
+          maxItems: 2
+
+      required:
+        - reset-names
+
   - if:
       properties:
         compatible:
@@ -203,6 +258,15 @@ allOf:
       patternProperties:
         "^channel[4-7]$": false
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: renesas,r9a09g047-canfd
+    then:
+      patternProperties:
+        "^channel[6-7]$": false
+
 unevaluatedProperties: false
 
 examples:
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 17/36] can: rcar_canfd: Use of_get_available_child_by_name()
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (15 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 16/36] dt-bindings: can: renesas,rcar-canfd: Document RZ/G3E support Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 18/36] can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro Biju Das
                   ` (20 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 56f3dc3ea4ab0c495bbdb402f2a9a12850a5e077 upstream.

Simplify rcar_canfd_probe() using of_get_available_child_by_name().

While at it, move of_node_put(child) inside the if block to avoid
additional check if of_child is NULL.

Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-4-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index aa3df0d05b853..2d9569fd0e0b6 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -1855,13 +1855,13 @@ static int rcar_canfd_probe(struct platform_device *pdev)
 
 	for (i = 0; i < info->max_channels; ++i) {
 		name[7] = '0' + i;
-		of_child = of_get_child_by_name(dev->of_node, name);
-		if (of_child && of_device_is_available(of_child)) {
+		of_child = of_get_available_child_by_name(dev->of_node, name);
+		if (of_child) {
 			channels_mask |= BIT(i);
 			transceivers[i] = devm_of_phy_optional_get(dev,
 							of_child, NULL);
+			of_node_put(of_child);
 		}
-		of_node_put(of_child);
 		if (IS_ERR(transceivers[i]))
 			return PTR_ERR(transceivers[i]);
 	}
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 18/36] can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (16 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 17/36] can: rcar_canfd: Use of_get_available_child_by_name() Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 19/36] can: rcar_canfd: Update RCANFD_GERFL_ERR macro Biju Das
                   ` (19 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 05e7f5a90c306dd1b94d3f15ab084755c03f1202 upstream.

Drop the unused macro RCANFD_GAFLCFG_GETRNC.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-5-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 2d9569fd0e0b6..565a91c2ca83d 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -94,10 +94,6 @@
 	(((x) & reg_gen4(gpriv, 0x1ff, 0xff)) << \
 	 (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
 
-#define RCANFD_GAFLCFG_GETRNC(gpriv, n, x) \
-	(((x) >> (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8))) & \
-	 reg_gen4(gpriv, 0x1ff, 0xff))
-
 /* RSCFDnCFDGAFLECTR / RSCFDnGAFLECTR */
 #define RCANFD_GAFLECTR_AFLDAE		BIT(8)
 #define RCANFD_GAFLECTR_AFLPN(gpriv, x)	((x) & reg_gen4(gpriv, 0x7f, 0x1f))
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 19/36] can: rcar_canfd: Update RCANFD_GERFL_ERR macro
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (17 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 18/36] can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 20/36] can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC macro Biju Das
                   ` (18 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit b75fcf2af2dbbc5f913cf1b9194ed01ce9c068b6 upstream.

Replace the macro RCANFD_GERFL_EEF0_7->RCANFD_GERFL_EEF. The macros
RCANFD_GERFL_EEF* in RCANFD_GERFL_ERR can be replaced by FIELD_PREP() and
drop the redundant macro RCANFD_GERFL_EEF(ch).

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://patch.msgid.link/20250417054320.14100-6-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 565a91c2ca83d..d53aa71f11c4b 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -21,6 +21,7 @@
  * wherever it is modified to a readable name.
  */
 
+#include <linux/bitfield.h>
 #include <linux/bitmap.h>
 #include <linux/bitops.h>
 #include <linux/can/dev.h>
@@ -74,18 +75,18 @@
 #define RCANFD_GSTS_GNOPM		(BIT(0) | BIT(1) | BIT(2) | BIT(3))
 
 /* RSCFDnCFDGERFL / RSCFDnGERFL */
-#define RCANFD_GERFL_EEF0_7		GENMASK(23, 16)
-#define RCANFD_GERFL_EEF(ch)		BIT(16 + (ch))
+#define RCANFD_GERFL_EEF		GENMASK(23, 16)
 #define RCANFD_GERFL_CMPOF		BIT(3)	/* CAN FD only */
 #define RCANFD_GERFL_THLES		BIT(2)
 #define RCANFD_GERFL_MES		BIT(1)
 #define RCANFD_GERFL_DEF		BIT(0)
 
 #define RCANFD_GERFL_ERR(gpriv, x) \
-	((x) & (reg_gen4(gpriv, RCANFD_GERFL_EEF0_7, \
-			 RCANFD_GERFL_EEF(0) | RCANFD_GERFL_EEF(1)) | \
-		RCANFD_GERFL_MES | \
-		((gpriv)->fdmode ? RCANFD_GERFL_CMPOF : 0)))
+({\
+	typeof(gpriv) (_gpriv) = (gpriv); \
+	((x) & ((FIELD_PREP(RCANFD_GERFL_EEF, (_gpriv)->channels_mask)) | \
+		RCANFD_GERFL_MES | ((_gpriv)->fdmode ? RCANFD_GERFL_CMPOF : 0))); \
+})
 
 /* AFL Rx rules registers */
 
@@ -938,7 +939,7 @@ static void rcar_canfd_global_error(struct net_device *ndev)
 	u32 ridx = ch + RCANFD_RFFIFO_IDX;
 
 	gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL);
-	if (gerfl & RCANFD_GERFL_EEF(ch)) {
+	if (gerfl & FIELD_PREP(RCANFD_GERFL_EEF, BIT(ch))) {
 		netdev_dbg(ndev, "Ch%u: ECC Error flag\n", ch);
 		stats->tx_dropped++;
 	}
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 20/36] can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC macro
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (18 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 19/36] can: rcar_canfd: Update RCANFD_GERFL_ERR macro Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 21/36] can: rcar_canfd: Add rcar_canfd_setrnc() Biju Das
                   ` (17 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit c9e17c91f1656f90b06e5cd2f39dfaab08de9611 upstream.

Drop the mask operation in RCANFD_GAFLCFG_SETRNC macro as the num_rules
can never be larger than number of supported rules.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-7-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index d53aa71f11c4b..45d0c34f64f69 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -92,8 +92,7 @@
 
 /* RSCFDnCFDGAFLCFG0 / RSCFDnGAFLCFG0 */
 #define RCANFD_GAFLCFG_SETRNC(gpriv, n, x) \
-	(((x) & reg_gen4(gpriv, 0x1ff, 0xff)) << \
-	 (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
+	((x) << (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
 
 /* RSCFDnCFDGAFLECTR / RSCFDnGAFLECTR */
 #define RCANFD_GAFLECTR_AFLDAE		BIT(8)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 21/36] can: rcar_canfd: Add rcar_canfd_setrnc()
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (19 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 20/36] can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC macro Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 22/36] can: rcar_canfd: Update RCANFD_GAFLCFG macro Biju Das
                   ` (16 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 6b9f8b53a1f3ad8e7880e3ad0e08074f5d7fd404 upstream.

Add rcar_canfd_setrnc() to replace the macro RCANFD_GAFLCFG_SETRNC.
While at it, replace int->unsigned int for local variables offset, page
and num_rules in rcar_canfd_configure_afl_rules().

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-8-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 45d0c34f64f69..6b87c1548f684 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -90,10 +90,6 @@
 
 /* AFL Rx rules registers */
 
-/* RSCFDnCFDGAFLCFG0 / RSCFDnGAFLCFG0 */
-#define RCANFD_GAFLCFG_SETRNC(gpriv, n, x) \
-	((x) << (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
-
 /* RSCFDnCFDGAFLECTR / RSCFDnGAFLECTR */
 #define RCANFD_GAFLECTR_AFLDAE		BIT(8)
 #define RCANFD_GAFLECTR_AFLPN(gpriv, x)	((x) & reg_gen4(gpriv, 0x7f, 0x1f))
@@ -677,6 +673,15 @@ static void rcar_canfd_tx_failure_cleanup(struct net_device *ndev)
 		can_free_echo_skb(ndev, i, NULL);
 }
 
+static void rcar_canfd_setrnc(struct rcar_canfd_global *gpriv, unsigned int ch,
+			      unsigned int num_rules)
+{
+	unsigned int shift = reg_gen4(gpriv, 16, 24) - (ch & 1) * reg_gen4(gpriv, 16, 8);
+	u32 rnc = num_rules << shift;
+
+	rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch), rnc);
+}
+
 static void rcar_canfd_set_mode(struct rcar_canfd_global *gpriv)
 {
 	if (is_gen4(gpriv)) {
@@ -785,7 +790,7 @@ static void rcar_canfd_configure_controller(struct rcar_canfd_global *gpriv)
 static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
 					   u32 ch, u32 rule_entry)
 {
-	int offset, page, num_rules = RCANFD_CHANNEL_NUMRULES;
+	unsigned int offset, page, num_rules = RCANFD_CHANNEL_NUMRULES;
 	u32 rule_entry_index = rule_entry % 16;
 	u32 ridx = ch + RCANFD_RFFIFO_IDX;
 
@@ -796,8 +801,7 @@ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
 			    RCANFD_GAFLECTR_AFLDAE));
 
 	/* Write number of rules for channel */
-	rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch),
-			   RCANFD_GAFLCFG_SETRNC(gpriv, ch, num_rules));
+	rcar_canfd_setrnc(gpriv, ch, num_rules);
 	if (is_gen4(gpriv))
 		offset = RCANFD_GEN4_GAFL_OFFSET;
 	else if (gpriv->fdmode)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 22/36] can: rcar_canfd: Update RCANFD_GAFLCFG macro
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (20 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 21/36] can: rcar_canfd: Add rcar_canfd_setrnc() Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 23/36] can: rcar_canfd: Add rnc_field_width variable to struct rcar_canfd_hw_info Biju Das
                   ` (15 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit a2427e44942bb772cf4e416df45b569a0e35b1cb upstream.

Update RCANFD_GAFLCFG macro by replacing the parameter ch->w, where w is
the GAFLCFG index used in the hardware manual.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-9-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 6b87c1548f684..fded4da501031 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -290,7 +290,7 @@
 /* RSCFDnCFDGAFLECTR / RSCFDnGAFLECTR */
 #define RCANFD_GAFLECTR			(0x0098)
 /* RSCFDnCFDGAFLCFG / RSCFDnGAFLCFG */
-#define RCANFD_GAFLCFG(ch)		(0x009c + (0x04 * ((ch) / 2)))
+#define RCANFD_GAFLCFG(w)		(0x009c + (0x04 * (w)))
 /* RSCFDnCFDRMNB / RSCFDnRMNB */
 #define RCANFD_RMNB			(0x00a4)
 /* RSCFDnCFDRMND / RSCFDnRMND */
@@ -678,8 +678,9 @@ static void rcar_canfd_setrnc(struct rcar_canfd_global *gpriv, unsigned int ch,
 {
 	unsigned int shift = reg_gen4(gpriv, 16, 24) - (ch & 1) * reg_gen4(gpriv, 16, 8);
 	u32 rnc = num_rules << shift;
+	unsigned int w = ch / 2;
 
-	rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch), rnc);
+	rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(w), rnc);
 }
 
 static void rcar_canfd_set_mode(struct rcar_canfd_global *gpriv)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 23/36] can: rcar_canfd: Add rnc_field_width variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (21 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 22/36] can: rcar_canfd: Update RCANFD_GAFLCFG macro Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 24/36] can: rcar_canfd: Add max_aflpn " Biju Das
                   ` (14 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit e9ffa12e02e193395e594df8977157121b107c21 upstream.

The shift and w value in rcar_canfd_setrnc() are dictated by the
field width:
  - R-Car Gen4 packs 2 values in a 32-bit word, using a field width
    of 16 bits,
  - R-Car Gen3 packs up to 4 values in a 32-bit word, using a field
    width of 8 bits.

Add rnc_field_width variable to struct rcar_canfd_hw_info to handle this
difference. The rnc_stride is 32 / rnc_field_width and the index parameter
w is calculated by ch / rnc_stride. The shift value in rcar_canfd_setrnc()
is computed by using (32 - (ch % rnc_stride + 1) * rnc_field_width).

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-10-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index fded4da501031..558291a360433 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -503,6 +503,7 @@
 struct rcar_canfd_global;
 
 struct rcar_canfd_hw_info {
+	u8 rnc_field_width;
 	u8 max_channels;
 	u8 postdiv;
 	/* hardware features */
@@ -579,18 +580,21 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 };
 
 static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
+	.rnc_field_width = 8,
 	.max_channels = 2,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
 };
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
+	.rnc_field_width = 16,
 	.max_channels = 8,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
 };
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
+	.rnc_field_width = 8,
 	.max_channels = 2,
 	.postdiv = 1,
 	.multi_channel_irqs = 1,
@@ -676,9 +680,10 @@ static void rcar_canfd_tx_failure_cleanup(struct net_device *ndev)
 static void rcar_canfd_setrnc(struct rcar_canfd_global *gpriv, unsigned int ch,
 			      unsigned int num_rules)
 {
-	unsigned int shift = reg_gen4(gpriv, 16, 24) - (ch & 1) * reg_gen4(gpriv, 16, 8);
+	unsigned int rnc_stride = 32 / gpriv->info->rnc_field_width;
+	unsigned int shift = 32 - (ch % rnc_stride + 1) * gpriv->info->rnc_field_width;
+	unsigned int w = ch / rnc_stride;
 	u32 rnc = num_rules << shift;
-	unsigned int w = ch / 2;
 
 	rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(w), rnc);
 }
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 24/36] can: rcar_canfd: Add max_aflpn variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (22 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 23/36] can: rcar_canfd: Add rnc_field_width variable to struct rcar_canfd_hw_info Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 25/36] can: rcar_canfd: Add max_cftml " Biju Das
                   ` (13 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 2d6cb8ff94166f3965b3fc3637faecf295a8c708 upstream.

R-Car Gen3 has maximum acceptance filter list page number of 31 whereas on
R-Car Gen4 it is 127. Add max_aflpn variable to struct rcar_canfd_hw_info
in order to support RZ/G3E that has max AFLPN of 63.

While at it, rename the parameter x->page_num in RCANFD_GAFLECTR_AFLPN
macro to make it clear.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-11-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 558291a360433..322d72df10edc 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -92,7 +92,7 @@
 
 /* RSCFDnCFDGAFLECTR / RSCFDnGAFLECTR */
 #define RCANFD_GAFLECTR_AFLDAE		BIT(8)
-#define RCANFD_GAFLECTR_AFLPN(gpriv, x)	((x) & reg_gen4(gpriv, 0x7f, 0x1f))
+#define RCANFD_GAFLECTR_AFLPN(gpriv, page_num)	((page_num) & (gpriv)->info->max_aflpn)
 
 /* RSCFDnCFDGAFLIDj / RSCFDnGAFLIDj */
 #define RCANFD_GAFLID_GAFLLB		BIT(29)
@@ -504,6 +504,7 @@ struct rcar_canfd_global;
 
 struct rcar_canfd_hw_info {
 	u8 rnc_field_width;
+	u8 max_aflpn;
 	u8 max_channels;
 	u8 postdiv;
 	/* hardware features */
@@ -581,6 +582,7 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 
 static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.rnc_field_width = 8,
+	.max_aflpn = 31,
 	.max_channels = 2,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
@@ -588,6 +590,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.rnc_field_width = 16,
+	.max_aflpn = 127,
 	.max_channels = 8,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
@@ -595,6 +598,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.rnc_field_width = 8,
+	.max_aflpn = 31,
 	.max_channels = 2,
 	.postdiv = 1,
 	.multi_channel_irqs = 1,
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 25/36] can: rcar_canfd: Add max_cftml variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (23 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 24/36] can: rcar_canfd: Add max_aflpn " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 26/36] can: rcar_canfd: Add {nom,data}_bittiming variables " Biju Das
                   ` (12 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 04d7a3a4660fb94b1398027a9089af95014115f1 upstream.

R-Car Gen3 has CFTML max positional value is 15 whereas on R-Car Gen4 it
is 31. Add a max_cftml variable to struct rcar_canfd_hw_info to handle
this difference.

While at it, rename the parameter x->cftml in RCANFD_CFCC_CFTML macro to
make it clear.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-12-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 322d72df10edc..5465fa8972230 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -225,8 +225,11 @@
 /* Common FIFO bits */
 
 /* RSCFDnCFDCFCCk */
-#define RCANFD_CFCC_CFTML(gpriv, x)	\
-	(((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 16, 20))
+#define RCANFD_CFCC_CFTML(gpriv, cftml) \
+({\
+	typeof(gpriv) (_gpriv) = (gpriv); \
+	(((cftml) & (_gpriv)->info->max_cftml) << reg_gen4(_gpriv, 16, 20)); \
+})
 #define RCANFD_CFCC_CFM(gpriv, x)	(((x) & 0x3) << reg_gen4(gpriv,  8, 16))
 #define RCANFD_CFCC_CFIM		BIT(12)
 #define RCANFD_CFCC_CFDC(gpriv, x)	(((x) & 0x7) << reg_gen4(gpriv, 21,  8))
@@ -505,6 +508,7 @@ struct rcar_canfd_global;
 struct rcar_canfd_hw_info {
 	u8 rnc_field_width;
 	u8 max_aflpn;
+	u8 max_cftml;
 	u8 max_channels;
 	u8 postdiv;
 	/* hardware features */
@@ -583,6 +587,7 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
+	.max_cftml = 15,
 	.max_channels = 2,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
@@ -591,6 +596,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.rnc_field_width = 16,
 	.max_aflpn = 127,
+	.max_cftml = 31,
 	.max_channels = 8,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
@@ -599,6 +605,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
+	.max_cftml = 15,
 	.max_channels = 2,
 	.postdiv = 1,
 	.multi_channel_irqs = 1,
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 26/36] can: rcar_canfd: Add {nom,data}_bittiming variables to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (24 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 25/36] can: rcar_canfd: Add max_cftml " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 27/36] can: rcar_canfd: Add ch_interface_mode variable " Biju Das
                   ` (11 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit b5a9f2ec427cbdfe915c377fdd61812636b2cdc2 upstream.

Both R-Car Gen4 and R-Car Gen3 have different bit timing parameters
Add {nom,data}_bittiming variables to struct rcar_canfd_hw_info to
handle this difference.

Since the mask used in the macros are max value - 1, replace that
as well.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-13-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 53 ++++++++++++++++++++++++-------
 1 file changed, 42 insertions(+), 11 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 5465fa8972230..d8380f38cddea 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -110,13 +110,13 @@
 
 /* RSCFDnCFDCmNCFG - CAN FD only */
 #define RCANFD_NCFG_NTSEG2(gpriv, x) \
-	(((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 25, 24))
+	(((x) & ((gpriv)->info->nom_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 25, 24))
 
 #define RCANFD_NCFG_NTSEG1(gpriv, x) \
-	(((x) & reg_gen4(gpriv, 0xff, 0x7f)) << reg_gen4(gpriv, 17, 16))
+	(((x) & ((gpriv)->info->nom_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 17, 16))
 
 #define RCANFD_NCFG_NSJW(gpriv, x) \
-	(((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 10, 11))
+	(((x) & ((gpriv)->info->nom_bittiming->sjw_max - 1)) << reg_gen4(gpriv, 10, 11))
 
 #define RCANFD_NCFG_NBRP(x)		(((x) & 0x3ff) << 0)
 
@@ -178,13 +178,13 @@
 #define RCANFD_CERFL_ERR(x)		((x) & (0x7fff)) /* above bits 14:0 */
 
 /* RSCFDnCFDCmDCFG */
-#define RCANFD_DCFG_DSJW(gpriv, x)	(((x) & reg_gen4(gpriv, 0xf, 0x7)) << 24)
+#define RCANFD_DCFG_DSJW(gpriv, x)	(((x) & ((gpriv)->info->data_bittiming->sjw_max - 1)) << 24)
 
 #define RCANFD_DCFG_DTSEG2(gpriv, x) \
-	(((x) & reg_gen4(gpriv, 0x0f, 0x7)) << reg_gen4(gpriv, 16, 20))
+	(((x) & ((gpriv)->info->data_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 16, 20))
 
 #define RCANFD_DCFG_DTSEG1(gpriv, x) \
-	(((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 8, 16))
+	(((x) & ((gpriv)->info->data_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 8, 16))
 
 #define RCANFD_DCFG_DBRP(x)		(((x) & 0xff) << 0)
 
@@ -506,6 +506,8 @@
 struct rcar_canfd_global;
 
 struct rcar_canfd_hw_info {
+	const struct can_bittiming_const *nom_bittiming;
+	const struct can_bittiming_const *data_bittiming;
 	u8 rnc_field_width;
 	u8 max_aflpn;
 	u8 max_cftml;
@@ -546,7 +548,7 @@ struct rcar_canfd_global {
 };
 
 /* CAN FD mode nominal rate constants */
-static const struct can_bittiming_const rcar_canfd_nom_bittiming_const = {
+static const struct can_bittiming_const rcar_canfd_gen3_nom_bittiming_const = {
 	.name = RCANFD_DRV_NAME,
 	.tseg1_min = 2,
 	.tseg1_max = 128,
@@ -558,8 +560,20 @@ static const struct can_bittiming_const rcar_canfd_nom_bittiming_const = {
 	.brp_inc = 1,
 };
 
+static const struct can_bittiming_const rcar_canfd_gen4_nom_bittiming_const = {
+	.name = RCANFD_DRV_NAME,
+	.tseg1_min = 2,
+	.tseg1_max = 256,
+	.tseg2_min = 2,
+	.tseg2_max = 128,
+	.sjw_max = 128,
+	.brp_min = 1,
+	.brp_max = 1024,
+	.brp_inc = 1,
+};
+
 /* CAN FD mode data rate constants */
-static const struct can_bittiming_const rcar_canfd_data_bittiming_const = {
+static const struct can_bittiming_const rcar_canfd_gen3_data_bittiming_const = {
 	.name = RCANFD_DRV_NAME,
 	.tseg1_min = 2,
 	.tseg1_max = 16,
@@ -571,6 +585,18 @@ static const struct can_bittiming_const rcar_canfd_data_bittiming_const = {
 	.brp_inc = 1,
 };
 
+static const struct can_bittiming_const rcar_canfd_gen4_data_bittiming_const = {
+	.name = RCANFD_DRV_NAME,
+	.tseg1_min = 2,
+	.tseg1_max = 32,
+	.tseg2_min = 2,
+	.tseg2_max = 16,
+	.sjw_max = 16,
+	.brp_min = 1,
+	.brp_max = 256,
+	.brp_inc = 1,
+};
+
 /* Classical CAN mode bitrate constants */
 static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 	.name = RCANFD_DRV_NAME,
@@ -585,6 +611,8 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 };
 
 static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
+	.nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const,
+	.data_bittiming = &rcar_canfd_gen3_data_bittiming_const,
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
 	.max_cftml = 15,
@@ -594,6 +622,8 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 };
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
+	.nom_bittiming = &rcar_canfd_gen4_nom_bittiming_const,
+	.data_bittiming = &rcar_canfd_gen4_data_bittiming_const,
 	.rnc_field_width = 16,
 	.max_aflpn = 127,
 	.max_cftml = 31,
@@ -603,6 +633,8 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 };
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
+	.nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const,
+	.data_bittiming = &rcar_canfd_gen3_data_bittiming_const,
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
 	.max_cftml = 15,
@@ -1799,9 +1831,8 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
 	}
 
 	if (gpriv->fdmode) {
-		priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const;
-		priv->can.data_bittiming_const =
-			&rcar_canfd_data_bittiming_const;
+		priv->can.bittiming_const = gpriv->info->nom_bittiming;
+		priv->can.data_bittiming_const = gpriv->info->data_bittiming;
 
 		/* Controller starts in CAN FD only mode */
 		err = can_set_static_ctrlmode(ndev, CAN_CTRLMODE_FD);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 27/36] can: rcar_canfd: Add ch_interface_mode variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (25 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 26/36] can: rcar_canfd: Add {nom,data}_bittiming variables " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 28/36] can: rcar_canfd: Add shared_can_regs " Biju Das
                   ` (10 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit c10e5510101112932fc2955a5ff97ecf8448a9d1 upstream.

R-Car Gen4 has channel specific interface mode bit for setting CAN-FD or
Classical CAN mode whereas on R-Car Gen3 it is global. Add a
ch_interface_mode variable to struct rcar_canfd_hw_info to handle this
difference.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-14-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index d8380f38cddea..25c00abee9ccf 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -516,6 +516,7 @@ struct rcar_canfd_hw_info {
 	/* hardware features */
 	unsigned shared_global_irqs:1;	/* Has shared global irqs */
 	unsigned multi_channel_irqs:1;	/* Has multiple channel irqs */
+	unsigned ch_interface_mode:1;	/* Has channel interface mode */
 };
 
 /* Channel priv data */
@@ -619,6 +620,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.max_channels = 2,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
+	.ch_interface_mode = 0,
 };
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
@@ -630,6 +632,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.max_channels = 8,
 	.postdiv = 2,
 	.shared_global_irqs = 1,
+	.ch_interface_mode = 1,
 };
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
@@ -641,6 +644,7 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.max_channels = 2,
 	.postdiv = 1,
 	.multi_channel_irqs = 1,
+	.ch_interface_mode = 0,
 };
 
 /* Helper functions */
@@ -733,7 +737,7 @@ static void rcar_canfd_setrnc(struct rcar_canfd_global *gpriv, unsigned int ch,
 
 static void rcar_canfd_set_mode(struct rcar_canfd_global *gpriv)
 {
-	if (is_gen4(gpriv)) {
+	if (gpriv->info->ch_interface_mode) {
 		u32 ch, val = gpriv->fdmode ? RCANFD_GEN4_FDCFG_FDOE
 					    : RCANFD_GEN4_FDCFG_CLOE;
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 28/36] can: rcar_canfd: Add shared_can_regs variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (26 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 27/36] can: rcar_canfd: Add ch_interface_mode variable " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 29/36] can: rcar_canfd: Add struct rcanfd_regs " Biju Das
                   ` (9 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 836cc711fc18747fc936ac62abd61a64465f00cc upstream.

R-Car Gen4 has shared regs for both CAN-FD and Classical CAN operations.
Add shared_can_regs variable to struct rcar_canfd_hw_info to handle this
difference.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-15-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 25c00abee9ccf..7e0f84596807d 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -517,6 +517,7 @@ struct rcar_canfd_hw_info {
 	unsigned shared_global_irqs:1;	/* Has shared global irqs */
 	unsigned multi_channel_irqs:1;	/* Has multiple channel irqs */
 	unsigned ch_interface_mode:1;	/* Has channel interface mode */
+	unsigned shared_can_regs:1;	/* Has shared classical can registers */
 };
 
 /* Channel priv data */
@@ -621,6 +622,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.postdiv = 2,
 	.shared_global_irqs = 1,
 	.ch_interface_mode = 0,
+	.shared_can_regs = 0,
 };
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
@@ -633,6 +635,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.postdiv = 2,
 	.shared_global_irqs = 1,
 	.ch_interface_mode = 1,
+	.shared_can_regs = 1,
 };
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
@@ -645,6 +648,7 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.postdiv = 1,
 	.multi_channel_irqs = 1,
 	.ch_interface_mode = 0,
+	.shared_can_regs = 0,
 };
 
 /* Helper functions */
@@ -855,7 +859,7 @@ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
 
 	/* Write number of rules for channel */
 	rcar_canfd_setrnc(gpriv, ch, num_rules);
-	if (is_gen4(gpriv))
+	if (gpriv->info->shared_can_regs)
 		offset = RCANFD_GEN4_GAFL_OFFSET;
 	else if (gpriv->fdmode)
 		offset = RCANFD_F_GAFL_OFFSET;
@@ -1391,7 +1395,7 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
 			   brp, sjw, tseg1, tseg2);
 	} else {
 		/* Classical CAN only mode */
-		if (is_gen4(gpriv)) {
+		if (gpriv->info->shared_can_regs) {
 			cfg = (RCANFD_NCFG_NTSEG1(gpriv, tseg1) |
 			       RCANFD_NCFG_NBRP(brp) |
 			       RCANFD_NCFG_NSJW(gpriv, sjw) |
@@ -1556,7 +1560,7 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
 
 	dlc = RCANFD_CFPTR_CFDLC(can_fd_len2dlc(cf->len));
 
-	if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) {
+	if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || gpriv->info->shared_can_regs) {
 		rcar_canfd_write(priv->base,
 				 RCANFD_F_CFID(gpriv, ch, RCANFD_CFFIFO_IDX), id);
 		rcar_canfd_write(priv->base,
@@ -1615,7 +1619,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
 	u32 ch = priv->channel;
 	u32 ridx = ch + RCANFD_RFFIFO_IDX;
 
-	if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) {
+	if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || gpriv->info->shared_can_regs) {
 		id = rcar_canfd_read(priv->base, RCANFD_F_RFID(gpriv, ridx));
 		dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(gpriv, ridx));
 
@@ -1666,7 +1670,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
 		cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc));
 		if (id & RCANFD_RFID_RFRTR)
 			cf->can_id |= CAN_RTR_FLAG;
-		else if (is_gen4(gpriv))
+		else if (gpriv->info->shared_can_regs)
 			rcar_canfd_get_data(priv, cf, RCANFD_F_RFDF(gpriv, ridx, 0));
 		else
 			rcar_canfd_get_data(priv, cf, RCANFD_C_RFDF(ridx, 0));
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 29/36] can: rcar_canfd: Add struct rcanfd_regs variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (27 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 28/36] can: rcar_canfd: Add shared_can_regs " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 30/36] can: rcar_canfd: Add sh " Biju Das
                   ` (8 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 5026d2acaefab81857390c00c771ee6a2fa65461 upstream.

R-Car Gen3 and Gen4 have some differences in the register offsets. Add
struct rcanfd_regs variable regs to the struct rcar_canfd_hw_info to
handle these differences.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-16-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 48 ++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 7 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 7e0f84596807d..fbfe2d6484f1e 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -300,7 +300,7 @@
 #define RCANFD_RMND(y)			(0x00a8 + (0x04 * (y)))
 
 /* RSCFDnCFDRFCCx / RSCFDnRFCCx */
-#define RCANFD_RFCC(gpriv, x)		(reg_gen4(gpriv, 0x00c0, 0x00b8) + (0x04 * (x)))
+#define RCANFD_RFCC(gpriv, x)		((gpriv)->info->regs->rfcc + (0x04 * (x)))
 /* RSCFDnCFDRFSTSx / RSCFDnRFSTSx */
 #define RCANFD_RFSTS(gpriv, x)		(RCANFD_RFCC(gpriv, x) + 0x20)
 /* RSCFDnCFDRFPCTRx / RSCFDnRFPCTRx */
@@ -310,13 +310,13 @@
 
 /* RSCFDnCFDCFCCx / RSCFDnCFCCx */
 #define RCANFD_CFCC(gpriv, ch, idx) \
-	(reg_gen4(gpriv, 0x0120, 0x0118) + (0x0c * (ch)) + (0x04 * (idx)))
+	((gpriv)->info->regs->cfcc + (0x0c * (ch)) + (0x04 * (idx)))
 /* RSCFDnCFDCFSTSx / RSCFDnCFSTSx */
 #define RCANFD_CFSTS(gpriv, ch, idx) \
-	(reg_gen4(gpriv, 0x01e0, 0x0178) + (0x0c * (ch)) + (0x04 * (idx)))
+	((gpriv)->info->regs->cfsts + (0x0c * (ch)) + (0x04 * (idx)))
 /* RSCFDnCFDCFPCTRx / RSCFDnCFPCTRx */
 #define RCANFD_CFPCTR(gpriv, ch, idx) \
-	(reg_gen4(gpriv, 0x0240, 0x01d8) + (0x0c * (ch)) + (0x04 * (idx)))
+	((gpriv)->info->regs->cfpctr + (0x0c * (ch)) + (0x04 * (idx)))
 
 /* RSCFDnCFDFESTS / RSCFDnFESTS */
 #define RCANFD_FESTS			(0x0238)
@@ -432,7 +432,7 @@
 /* CAN FD mode specific register map */
 
 /* RSCFDnCFDCmXXX -> RCANFD_F_XXX(m) */
-#define RCANFD_F_DCFG(gpriv, m)		(reg_gen4(gpriv, 0x1400, 0x0500) + (0x20 * (m)))
+#define RCANFD_F_DCFG(gpriv, m)		((gpriv)->info->regs->f_dcfg + (0x20 * (m)))
 #define RCANFD_F_CFDCFG(m)		(0x0504 + (0x20 * (m)))
 #define RCANFD_F_CFDCTR(m)		(0x0508 + (0x20 * (m)))
 #define RCANFD_F_CFDSTS(m)		(0x050c + (0x20 * (m)))
@@ -448,7 +448,7 @@
 #define RCANFD_F_RMDF(q, b)		(0x200c + (0x04 * (b)) + (0x20 * (q)))
 
 /* RSCFDnCFDRFXXx -> RCANFD_F_RFXX(x) */
-#define RCANFD_F_RFOFFSET(gpriv)	reg_gen4(gpriv, 0x6000, 0x3000)
+#define RCANFD_F_RFOFFSET(gpriv)	((gpriv)->info->regs->rfoffset)
 #define RCANFD_F_RFID(gpriv, x)		(RCANFD_F_RFOFFSET(gpriv) + (0x80 * (x)))
 #define RCANFD_F_RFPTR(gpriv, x)	(RCANFD_F_RFOFFSET(gpriv) + 0x04 + (0x80 * (x)))
 #define RCANFD_F_RFFDSTS(gpriv, x)	(RCANFD_F_RFOFFSET(gpriv) + 0x08 + (0x80 * (x)))
@@ -456,7 +456,7 @@
 	(RCANFD_F_RFOFFSET(gpriv) + 0x0c + (0x80 * (x)) + (0x04 * (df)))
 
 /* RSCFDnCFDCFXXk -> RCANFD_F_CFXX(ch, k) */
-#define RCANFD_F_CFOFFSET(gpriv)	reg_gen4(gpriv, 0x6400, 0x3400)
+#define RCANFD_F_CFOFFSET(gpriv)	((gpriv)->info->regs->cfoffset)
 
 #define RCANFD_F_CFID(gpriv, ch, idx) \
 	(RCANFD_F_CFOFFSET(gpriv) + (0x180 * (ch)) + (0x80 * (idx)))
@@ -505,9 +505,20 @@
 
 struct rcar_canfd_global;
 
+struct rcar_canfd_regs {
+	u16 rfcc;	/* RX FIFO Configuration/Control Register */
+	u16 cfcc;	/* Common FIFO Configuration/Control Register */
+	u16 cfsts;	/* Common FIFO Status Register */
+	u16 cfpctr;	/* Common FIFO Pointer Control Register */
+	u16 f_dcfg;	/* Global FD Configuration Register */
+	u16 rfoffset;	/* Receive FIFO buffer access ID register */
+	u16 cfoffset;	/* Transmit/receive FIFO buffer access ID register */
+};
+
 struct rcar_canfd_hw_info {
 	const struct can_bittiming_const *nom_bittiming;
 	const struct can_bittiming_const *data_bittiming;
+	const struct rcar_canfd_regs *regs;
 	u8 rnc_field_width;
 	u8 max_aflpn;
 	u8 max_cftml;
@@ -612,9 +623,30 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = {
 	.brp_inc = 1,
 };
 
+static const struct rcar_canfd_regs rcar_gen3_regs = {
+	.rfcc = 0x00b8,
+	.cfcc = 0x0118,
+	.cfsts = 0x0178,
+	.cfpctr = 0x01d8,
+	.f_dcfg = 0x0500,
+	.rfoffset = 0x3000,
+	.cfoffset = 0x3400,
+};
+
+static const struct rcar_canfd_regs rcar_gen4_regs = {
+	.rfcc = 0x00c0,
+	.cfcc = 0x0120,
+	.cfsts = 0x01e0,
+	.cfpctr = 0x0240,
+	.f_dcfg = 0x1400,
+	.rfoffset = 0x6000,
+	.cfoffset = 0x6400,
+};
+
 static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const,
 	.data_bittiming = &rcar_canfd_gen3_data_bittiming_const,
+	.regs = &rcar_gen3_regs,
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
 	.max_cftml = 15,
@@ -628,6 +660,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.nom_bittiming = &rcar_canfd_gen4_nom_bittiming_const,
 	.data_bittiming = &rcar_canfd_gen4_data_bittiming_const,
+	.regs = &rcar_gen4_regs,
 	.rnc_field_width = 16,
 	.max_aflpn = 127,
 	.max_cftml = 31,
@@ -641,6 +674,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const,
 	.data_bittiming = &rcar_canfd_gen3_data_bittiming_const,
+	.regs = &rcar_gen3_regs,
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
 	.max_cftml = 15,
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 30/36] can: rcar_canfd: Add sh variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (28 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 29/36] can: rcar_canfd: Add struct rcanfd_regs " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 31/36] can: rcar_canfd: Add external_clk " Biju Das
                   ` (7 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit c5670c23d67dd81e71262bb7c5942502cd9df62e upstream.

R-Car Gen3 and Gen4 have some differences in the shift bits. Introduce a
struct rcar_canfd_shift_data to hold these values and add the struct
rcar_canfd_shift_data variable sh to struct rcar_canfd_hw_info to handle
these differences. After this, drop the unused functions reg_gen4() and
is_gen4().

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-17-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 64 ++++++++++++++++++++++---------
 1 file changed, 45 insertions(+), 19 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index fbfe2d6484f1e..67f7b5f6376c4 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -110,13 +110,13 @@
 
 /* RSCFDnCFDCmNCFG - CAN FD only */
 #define RCANFD_NCFG_NTSEG2(gpriv, x) \
-	(((x) & ((gpriv)->info->nom_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 25, 24))
+	(((x) & ((gpriv)->info->nom_bittiming->tseg2_max - 1)) << (gpriv)->info->sh->ntseg2)
 
 #define RCANFD_NCFG_NTSEG1(gpriv, x) \
-	(((x) & ((gpriv)->info->nom_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 17, 16))
+	(((x) & ((gpriv)->info->nom_bittiming->tseg1_max - 1)) << (gpriv)->info->sh->ntseg1)
 
 #define RCANFD_NCFG_NSJW(gpriv, x) \
-	(((x) & ((gpriv)->info->nom_bittiming->sjw_max - 1)) << reg_gen4(gpriv, 10, 11))
+	(((x) & ((gpriv)->info->nom_bittiming->sjw_max - 1)) << (gpriv)->info->sh->nsjw)
 
 #define RCANFD_NCFG_NBRP(x)		(((x) & 0x3ff) << 0)
 
@@ -181,10 +181,10 @@
 #define RCANFD_DCFG_DSJW(gpriv, x)	(((x) & ((gpriv)->info->data_bittiming->sjw_max - 1)) << 24)
 
 #define RCANFD_DCFG_DTSEG2(gpriv, x) \
-	(((x) & ((gpriv)->info->data_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 16, 20))
+	(((x) & ((gpriv)->info->data_bittiming->tseg2_max - 1)) << (gpriv)->info->sh->dtseg2)
 
 #define RCANFD_DCFG_DTSEG1(gpriv, x) \
-	(((x) & ((gpriv)->info->data_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 8, 16))
+	(((x) & ((gpriv)->info->data_bittiming->tseg1_max - 1)) << (gpriv)->info->sh->dtseg1)
 
 #define RCANFD_DCFG_DBRP(x)		(((x) & 0xff) << 0)
 
@@ -228,11 +228,11 @@
 #define RCANFD_CFCC_CFTML(gpriv, cftml) \
 ({\
 	typeof(gpriv) (_gpriv) = (gpriv); \
-	(((cftml) & (_gpriv)->info->max_cftml) << reg_gen4(_gpriv, 16, 20)); \
+	(((cftml) & (_gpriv)->info->max_cftml) << (_gpriv)->info->sh->cftml); \
 })
-#define RCANFD_CFCC_CFM(gpriv, x)	(((x) & 0x3) << reg_gen4(gpriv,  8, 16))
+#define RCANFD_CFCC_CFM(gpriv, x)	(((x) & 0x3) << (gpriv)->info->sh->cfm)
 #define RCANFD_CFCC_CFIM		BIT(12)
-#define RCANFD_CFCC_CFDC(gpriv, x)	(((x) & 0x7) << reg_gen4(gpriv, 21,  8))
+#define RCANFD_CFCC_CFDC(gpriv, x)	(((x) & 0x7) << (gpriv)->info->sh->cfdc)
 #define RCANFD_CFCC_CFPLS(x)		(((x) & 0x7) << 4)
 #define RCANFD_CFCC_CFTXIE		BIT(2)
 #define RCANFD_CFCC_CFE			BIT(0)
@@ -515,10 +515,22 @@ struct rcar_canfd_regs {
 	u16 cfoffset;	/* Transmit/receive FIFO buffer access ID register */
 };
 
+struct rcar_canfd_shift_data {
+	u8 ntseg2;	/* Nominal Bit Rate Time Segment 2 Control */
+	u8 ntseg1;	/* Nominal Bit Rate Time Segment 1 Control */
+	u8 nsjw;	/* Nominal Bit Rate Resynchronization Jump Width Control */
+	u8 dtseg2;	/* Data Bit Rate Time Segment 2 Control */
+	u8 dtseg1;	/* Data Bit Rate Time Segment 1 Control */
+	u8 cftml;	/* Common FIFO TX Message Buffer Link */
+	u8 cfm;		/* Common FIFO Mode */
+	u8 cfdc;	/* Common FIFO Depth Configuration */
+};
+
 struct rcar_canfd_hw_info {
 	const struct can_bittiming_const *nom_bittiming;
 	const struct can_bittiming_const *data_bittiming;
 	const struct rcar_canfd_regs *regs;
+	const struct rcar_canfd_shift_data *sh;
 	u8 rnc_field_width;
 	u8 max_aflpn;
 	u8 max_cftml;
@@ -643,10 +655,33 @@ static const struct rcar_canfd_regs rcar_gen4_regs = {
 	.cfoffset = 0x6400,
 };
 
+static const struct rcar_canfd_shift_data rcar_gen3_shift_data = {
+	.ntseg2 = 24,
+	.ntseg1 = 16,
+	.nsjw = 11,
+	.dtseg2 = 20,
+	.dtseg1 = 16,
+	.cftml = 20,
+	.cfm = 16,
+	.cfdc = 8,
+};
+
+static const struct rcar_canfd_shift_data rcar_gen4_shift_data = {
+	.ntseg2 = 25,
+	.ntseg1 = 17,
+	.nsjw = 10,
+	.dtseg2 = 16,
+	.dtseg1 = 8,
+	.cftml = 16,
+	.cfm = 8,
+	.cfdc = 21,
+};
+
 static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const,
 	.data_bittiming = &rcar_canfd_gen3_data_bittiming_const,
 	.regs = &rcar_gen3_regs,
+	.sh = &rcar_gen3_shift_data,
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
 	.max_cftml = 15,
@@ -661,6 +696,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.nom_bittiming = &rcar_canfd_gen4_nom_bittiming_const,
 	.data_bittiming = &rcar_canfd_gen4_data_bittiming_const,
 	.regs = &rcar_gen4_regs,
+	.sh = &rcar_gen4_shift_data,
 	.rnc_field_width = 16,
 	.max_aflpn = 127,
 	.max_cftml = 31,
@@ -675,6 +711,7 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const,
 	.data_bittiming = &rcar_canfd_gen3_data_bittiming_const,
 	.regs = &rcar_gen3_regs,
+	.sh = &rcar_gen3_shift_data,
 	.rnc_field_width = 8,
 	.max_aflpn = 31,
 	.max_cftml = 15,
@@ -686,17 +723,6 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 };
 
 /* Helper functions */
-static inline bool is_gen4(struct rcar_canfd_global *gpriv)
-{
-	return gpriv->info == &rcar_gen4_hw_info;
-}
-
-static inline u32 reg_gen4(struct rcar_canfd_global *gpriv,
-			   u32 gen4, u32 not_gen4)
-{
-	return is_gen4(gpriv) ? gen4 : not_gen4;
-}
-
 static inline void rcar_canfd_update(u32 mask, u32 val, u32 __iomem *reg)
 {
 	u32 data = readl(reg);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 31/36] can: rcar_canfd: Add external_clk variable to struct rcar_canfd_hw_info
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (29 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 30/36] can: rcar_canfd: Add sh " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 32/36] can: rcar_canfd: Enhance multi_channel_irqs handling Biju Das
                   ` (6 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit e5258b337de26c97cf210858407e0fc881bc0e3d upstream.

All existing SoCs support an external clock, but RZ/G3E has only internal
clocks. Add external_clk variable to struct rcar_canfd_hw_info to handle
this difference.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-18-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 67f7b5f6376c4..0bf0e88dfe257 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -541,6 +541,7 @@ struct rcar_canfd_hw_info {
 	unsigned multi_channel_irqs:1;	/* Has multiple channel irqs */
 	unsigned ch_interface_mode:1;	/* Has channel interface mode */
 	unsigned shared_can_regs:1;	/* Has shared classical can registers */
+	unsigned external_clk:1;	/* Has external clock */
 };
 
 /* Channel priv data */
@@ -690,6 +691,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
 	.shared_global_irqs = 1,
 	.ch_interface_mode = 0,
 	.shared_can_regs = 0,
+	.external_clk = 1,
 };
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
@@ -705,6 +707,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
 	.shared_global_irqs = 1,
 	.ch_interface_mode = 1,
 	.shared_can_regs = 1,
+	.external_clk = 1,
 };
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
@@ -720,6 +723,7 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.multi_channel_irqs = 1,
 	.ch_interface_mode = 0,
 	.shared_can_regs = 0,
+	.external_clk = 1,
 };
 
 /* Helper functions */
@@ -2048,7 +2052,7 @@ static int rcar_canfd_probe(struct platform_device *pdev)
 		fcan_freq = clk_get_rate(gpriv->can_clk) / info->postdiv;
 	} else {
 		fcan_freq = clk_get_rate(gpriv->can_clk);
-		gpriv->extclk = true;
+		gpriv->extclk = gpriv->info->external_clk;
 	}
 
 	addr = devm_platform_ioremap_resource(pdev, 0);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 32/36] can: rcar_canfd: Enhance multi_channel_irqs handling
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (30 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 31/36] can: rcar_canfd: Add external_clk " Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 33/36] can: rcar_canfd: Add RZ/G3E support Biju Das
                   ` (5 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 0853b7e479a69d1e335665ceec9898c5b9ecc810 upstream.

Currently multi_channel_irqs has only 2 channels. But RZ/G3E has six
channels. Enhance multi_channel_irqs handling to support more than two
channels.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-19-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 0bf0e88dfe257..6a9c970364cb0 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -1857,16 +1857,19 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
 
 	if (info->multi_channel_irqs) {
 		char *irq_name;
+		char name[10];
 		int err_irq;
 		int tx_irq;
 
-		err_irq = platform_get_irq_byname(pdev, ch == 0 ? "ch0_err" : "ch1_err");
+		scnprintf(name, sizeof(name), "ch%u_err", ch);
+		err_irq = platform_get_irq_byname(pdev, name);
 		if (err_irq < 0) {
 			err = err_irq;
 			goto fail;
 		}
 
-		tx_irq = platform_get_irq_byname(pdev, ch == 0 ? "ch0_trx" : "ch1_trx");
+		scnprintf(name, sizeof(name), "ch%u_trx", ch);
+		tx_irq = platform_get_irq_byname(pdev, name);
 		if (tx_irq < 0) {
 			err = tx_irq;
 			goto fail;
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 33/36] can: rcar_canfd: Add RZ/G3E support
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (31 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 32/36] can: rcar_canfd: Enhance multi_channel_irqs handling Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 34/36] arm64: dts: renesas: r9a09g047: Add CANFD node Biju Das
                   ` (4 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit be53aa052008538d67d9ad23f6f8160df390e1d6 upstream.

The CAN-FD IP found on the RZ/G3E SoC is similar to R-Car Gen4, but
it has no external clock instead it has clk_ram, it has 6 channels
and supports 20 interrupts. Add support for RZ/G3E CAN-FD driver.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-20-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 drivers/net/can/rcar/rcar_canfd.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
index 6a9c970364cb0..27d503ac87dcd 100644
--- a/drivers/net/can/rcar/rcar_canfd.c
+++ b/drivers/net/can/rcar/rcar_canfd.c
@@ -726,6 +726,22 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
 	.external_clk = 1,
 };
 
+static const struct rcar_canfd_hw_info r9a09g047_hw_info = {
+	.nom_bittiming = &rcar_canfd_gen4_nom_bittiming_const,
+	.data_bittiming = &rcar_canfd_gen4_data_bittiming_const,
+	.regs = &rcar_gen4_regs,
+	.sh = &rcar_gen4_shift_data,
+	.rnc_field_width = 16,
+	.max_aflpn = 63,
+	.max_cftml = 31,
+	.max_channels = 6,
+	.postdiv = 1,
+	.multi_channel_irqs = 1,
+	.ch_interface_mode = 1,
+	.shared_can_regs = 1,
+	.external_clk = 0,
+};
+
 /* Helper functions */
 static inline void rcar_canfd_update(u32 mask, u32 val, u32 __iomem *reg)
 {
@@ -1969,6 +1985,7 @@ static int rcar_canfd_probe(struct platform_device *pdev)
 	u32 rule_entry = 0;
 	bool fdmode = true;			/* CAN FD only mode - default */
 	char name[9] = "channelX";
+	struct clk *clk_ram;
 	int i;
 
 	info = of_device_get_match_data(dev);
@@ -2058,6 +2075,11 @@ static int rcar_canfd_probe(struct platform_device *pdev)
 		gpriv->extclk = gpriv->info->external_clk;
 	}
 
+	clk_ram = devm_clk_get_optional_enabled(dev, "ram_clk");
+	if (IS_ERR(clk_ram))
+		return dev_err_probe(dev, PTR_ERR(clk_ram),
+				     "cannot get enabled ram clock\n");
+
 	addr = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(addr)) {
 		err = PTR_ERR(addr);
@@ -2220,6 +2242,7 @@ static SIMPLE_DEV_PM_OPS(rcar_canfd_pm_ops, rcar_canfd_suspend,
 
 static const __maybe_unused struct of_device_id rcar_canfd_of_table[] = {
 	{ .compatible = "renesas,r8a779a0-canfd", .data = &rcar_gen4_hw_info },
+	{ .compatible = "renesas,r9a09g047-canfd", .data = &r9a09g047_hw_info },
 	{ .compatible = "renesas,rcar-gen3-canfd", .data = &rcar_gen3_hw_info },
 	{ .compatible = "renesas,rcar-gen4-canfd", .data = &rcar_gen4_hw_info },
 	{ .compatible = "renesas,rzg2l-canfd", .data = &rzg2l_hw_info },
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 34/36] arm64: dts: renesas: r9a09g047: Add CANFD node
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (32 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 33/36] can: rcar_canfd: Add RZ/G3E support Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 35/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CANFD Biju Das
                   ` (3 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 9c1d49dd0975cd91529417a70a34817e489d954b upstream.

Add CANFD node to RZ/G3E ("R9A09G047") SoC DTSI.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250320164121.193857-2-biju.das.jz@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 arch/arm64/boot/dts/renesas/r9a09g047.dtsi | 60 ++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g047.dtsi b/arch/arm64/boot/dts/renesas/r9a09g047.dtsi
index 5b413d31b8cd9..bfdb03e69540b 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g047.dtsi
+++ b/arch/arm64/boot/dts/renesas/r9a09g047.dtsi
@@ -294,6 +294,66 @@ scif0: serial@11c01400 {
 			status = "disabled";
 		};
 
+		canfd: can@12440000 {
+			compatible = "renesas,r9a09g047-canfd";
+			reg = <0 0x12440000 0 0x40000>;
+			interrupts = <GIC_SPI 709 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 710 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 697 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 703 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 711 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 698 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 704 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 712 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 699 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 705 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 713 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 700 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 706 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 714 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 701 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 707 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 715 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 702 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 708 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 716 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "g_err", "g_recc",
+					  "ch0_err", "ch0_rec", "ch0_trx",
+					  "ch1_err", "ch1_rec", "ch1_trx",
+					  "ch2_err", "ch2_rec", "ch2_trx",
+					  "ch3_err", "ch3_rec", "ch3_trx",
+					  "ch4_err", "ch4_rec", "ch4_trx",
+					  "ch5_err", "ch5_rec", "ch5_trx";
+			clocks = <&cpg CPG_MOD 0x9c>, <&cpg CPG_MOD 0x9d>,
+				 <&cpg CPG_MOD 0x9e>;
+			clock-names = "fck", "ram_clk", "can_clk";
+			assigned-clocks = <&cpg CPG_MOD 0x9e>;
+			assigned-clock-rates = <80000000>;
+			resets = <&cpg 0xa1>, <&cpg 0xa2>;
+			reset-names = "rstp_n", "rstc_n";
+			power-domains = <&cpg>;
+			status = "disabled";
+
+			channel0 {
+				status = "disabled";
+			};
+			channel1 {
+				status = "disabled";
+			};
+			channel2 {
+				status = "disabled";
+			};
+			channel3 {
+				status = "disabled";
+			};
+			channel4 {
+				status = "disabled";
+			};
+			channel5 {
+				status = "disabled";
+			};
+		};
+
 		wdt1: watchdog@14400000 {
 			compatible = "renesas,r9a09g047-wdt", "renesas,r9a09g057-wdt";
 			reg = <0 0x14400000 0 0x400>;
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 35/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CANFD
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (33 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 34/36] arm64: dts: renesas: r9a09g047: Add CANFD node Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 36/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CAN Transceiver Biju Das
                   ` (2 subsequent siblings)
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit f2858ea240d35ed35dc87108cf8b06685e89a421 upstream.

Enable CANFD on the RZ/G3E SMARC EVK platform.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250320164121.193857-3-biju.das.jz@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 .../boot/dts/renesas/r9a09g047e57-smarc.dts   | 31 +++++++++++++++++++
 .../boot/dts/renesas/renesas-smarc2.dtsi      |  4 +++
 .../boot/dts/renesas/rzg3e-smarc-som.dtsi     | 14 +++++++--
 3 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts b/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts
index 5d7983812c701..7e1daaabce8a9 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts
+++ b/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts
@@ -8,6 +8,8 @@
 /dts-v1/;
 
 /* Switch selection settings */
+#define SW_LCD_EN		0
+#define SW_PDM_EN		0
 #define SW_SD0_DEV_SEL		0
 #define SW_SDIO_M2E		0
 
@@ -33,7 +35,36 @@ vqmmc_sd1_pvdd: regulator-vqmmc-sd1-pvdd {
 	};
 };
 
+&canfd {
+	pinctrl-0 = <&canfd_pins>;
+	pinctrl-names = "default";
+
+#if (!SW_PDM_EN)
+	channel1 {
+		status = "okay";
+	};
+#endif
+
+#if (!SW_LCD_EN)
+	channel4 {
+		status = "okay";
+	};
+#endif
+};
+
 &pinctrl {
+	canfd_pins: canfd {
+		can1_pins: can1 {
+			pinmux = <RZG3E_PORT_PINMUX(L, 2, 3)>, /* RX */
+				 <RZG3E_PORT_PINMUX(L, 3, 3)>; /* TX */
+		};
+
+		can4_pins: can4 {
+			pinmux = <RZG3E_PORT_PINMUX(5, 2, 3)>, /* RX */
+				 <RZG3E_PORT_PINMUX(5, 3, 3)>; /* TX */
+		};
+	};
+
 	scif_pins: scif {
 		pins = "SCIF_TXD", "SCIF_RXD";
 		renesas,output-impedance = <1>;
diff --git a/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi b/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi
index fd82df8adc1ec..1d3a844174b37 100644
--- a/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi
+++ b/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi
@@ -29,6 +29,10 @@ aliases {
 	};
 };
 
+&canfd {
+	status = "okay";
+};
+
 &scif0 {
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/renesas/rzg3e-smarc-som.dtsi b/arch/arm64/boot/dts/renesas/rzg3e-smarc-som.dtsi
index 051a43a7e2f0e..e9327cf9077f2 100644
--- a/arch/arm64/boot/dts/renesas/rzg3e-smarc-som.dtsi
+++ b/arch/arm64/boot/dts/renesas/rzg3e-smarc-som.dtsi
@@ -6,12 +6,20 @@
  */
 
 /*
- * Please set the switch position SYS.1 on the SoM and the corresponding macro
- * SW_SD0_DEV_SEL on the board DTS:
+ * Please set the below switch position on the SoM and the corresponding macro
+ * on the board DTS:
  *
- * SW_SD0_DEV_SEL:
+ * Switch position SYS.1, Macro SW_SD0_DEV_SEL:
  *      0 - SD0 is connected to eMMC (default)
  *      1 - SD0 is connected to uSD0 card
+ *
+ * Switch position SYS.5, Macro SW_LCD_EN:
+ *      0 - Select Misc. Signals routing
+ *      1 - Select LCD
+ *
+ * Switch position BOOT.6, Macro SW_PDM_EN:
+ *      0 - Select CAN routing
+ *      1 - Select PDM
  */
 
 / {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* [PATCH 6.12.y-cip 36/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CAN Transceiver
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (34 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 35/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CANFD Biju Das
@ 2025-07-14 10:16 ` Biju Das
  2025-07-14 11:55 ` [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Pavel Machek
  2025-07-15  2:24 ` nobuhiro1.iwamatsu
  37 siblings, 0 replies; 41+ messages in thread
From: Biju Das @ 2025-07-14 10:16 UTC (permalink / raw)
  To: Pavel Machek; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, Biju Das, cip-dev

commit 99256644c8c9523e27312f6318058481943281ab upstream.

Enable TCAN1046V-Q1 CAN Transceiver populated on RZ/G3E SMARC EVK by
modelling it as two instances of tcan1042.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250320164121.193857-4-biju.das.jz@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
 .../boot/dts/renesas/r9a09g047e57-smarc.dts   | 22 ++++++++++++++++
 .../boot/dts/renesas/renesas-smarc2.dtsi      | 25 +++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts b/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts
index 7e1daaabce8a9..1f5e61a73c35b 100644
--- a/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts
+++ b/arch/arm64/boot/dts/renesas/r9a09g047e57-smarc.dts
@@ -8,6 +8,8 @@
 /dts-v1/;
 
 /* Switch selection settings */
+#define SW_GPIO8_CAN0_STB	0
+#define SW_GPIO9_CAN1_STB	0
 #define SW_LCD_EN		0
 #define SW_PDM_EN		0
 #define SW_SD0_DEV_SEL		0
@@ -42,16 +44,36 @@ &canfd {
 #if (!SW_PDM_EN)
 	channel1 {
 		status = "okay";
+#if (!SW_LCD_EN) && (SW_GPIO9_CAN1_STB)
+		phys = <&can_transceiver1>;
+#endif
 	};
 #endif
 
 #if (!SW_LCD_EN)
 	channel4 {
 		status = "okay";
+#if (SW_GPIO8_CAN0_STB)
+		phys = <&can_transceiver0>;
+#endif
 	};
 #endif
 };
 
+#if (!SW_LCD_EN) && (SW_GPIO8_CAN0_STB)
+&can_transceiver0 {
+	standby-gpios = <&pinctrl RZG3E_GPIO(5, 4) GPIO_ACTIVE_HIGH>;
+	status = "okay";
+};
+#endif
+
+#if (!SW_LCD_EN) && (SW_GPIO9_CAN1_STB)
+&can_transceiver1 {
+	standby-gpios = <&pinctrl RZG3E_GPIO(5, 5) GPIO_ACTIVE_HIGH>;
+	status = "okay";
+};
+#endif
+
 &pinctrl {
 	canfd_pins: canfd {
 		can1_pins: can1 {
diff --git a/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi b/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi
index 1d3a844174b37..afdc1940e24ab 100644
--- a/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi
+++ b/arch/arm64/boot/dts/renesas/renesas-smarc2.dtsi
@@ -12,6 +12,17 @@
  * SW_SDIO_M2E:
  *     0 - SMARC SDIO signal is connected to uSD1
  *     1 - SMARC SDIO signal is connected to M.2 Key E connector
+ *
+ * Please set the switch position SW_GPIO_CAN_PMOD on the carrier board and the
+ * corresponding macro SW_GPIO8_CAN0_STB/SW_GPIO8_CAN0_STB on the board DTS:
+ *
+ * SW_GPIO8_CAN0_STB:
+ *	0 - Connect to GPIO8 PMOD (default)
+ *	1 - Connect to CAN0 transceiver STB pin
+ *
+ * SW_GPIO9_CAN1_STB:
+ *	0 - Connect to GPIO9 PMOD (default)
+ *	1 - Connect to CAN1 transceiver STB pin
  */
 
 / {
@@ -27,6 +38,20 @@ aliases {
 		serial3 = &scif0;
 		mmc1 = &sdhi1;
 	};
+
+	can_transceiver0: can-phy0 {
+		compatible = "ti,tcan1042";
+		#phy-cells = <0>;
+		max-bitrate = <8000000>;
+		status = "disabled";
+	};
+
+	can_transceiver1: can-phy1 {
+		compatible = "ti,tcan1042";
+		#phy-cells = <0>;
+		max-bitrate = <8000000>;
+		status = "disabled";
+	};
 };
 
 &canfd {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 41+ messages in thread

* Re: [PATCH 6.12.y-cip 12/36] clk: renesas: rzv2h: Support static dividers without RMW
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 12/36] clk: renesas: rzv2h: Support static dividers without RMW Biju Das
@ 2025-07-14 11:54   ` Pavel Machek
  0 siblings, 0 replies; 41+ messages in thread
From: Pavel Machek @ 2025-07-14 11:54 UTC (permalink / raw)
  To: Biju Das; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, cip-dev

[-- Attachment #1: Type: text/plain, Size: 463 bytes --]

Hi!

>   * @width: width of the divider
>   * @monbit: monitor bit in CPG_CLKSTATUS0 register
> + * @no_rmw: flag to indicate if the register is read-modify-write
> + *        (1: no RMW, 0: RMW)
>   */

For the record, I'm not pleased with flag doing what feels like double
negation, but...

Best regards,
								Pavel
-- 
In cooperation with DENX Software Engineering GmbH, HRB 165235 Munich,
Office: Kirchenstr.5, D-82194 Groebenzell, Germany

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (35 preceding siblings ...)
  2025-07-14 10:16 ` [PATCH 6.12.y-cip 36/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CAN Transceiver Biju Das
@ 2025-07-14 11:55 ` Pavel Machek
  2025-07-15  2:24 ` nobuhiro1.iwamatsu
  37 siblings, 0 replies; 41+ messages in thread
From: Pavel Machek @ 2025-07-14 11:55 UTC (permalink / raw)
  To: Biju Das; +Cc: nobuhiro1.iwamatsu, Lad Prabhakar, cip-dev

[-- Attachment #1: Type: text/plain, Size: 477 bytes --]

Hi!

> This series adds support for the RZ/G3E CANFD driver into 6.12.y-cip.
> All the patches in the series are cherry-picked from mainline.

First, this series is a bit long (and 6.1 even more so).

Anyway patches look reasonable and I can apply them if they pass
testing and there are no other comments.

Best regards,
								Pavel
-- 
In cooperation with DENX Software Engineering GmbH, HRB 165235 Munich,
Office: Kirchenstr.5, D-82194 Groebenzell, Germany

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 41+ messages in thread

* RE: [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support
  2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
                   ` (36 preceding siblings ...)
  2025-07-14 11:55 ` [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Pavel Machek
@ 2025-07-15  2:24 ` nobuhiro1.iwamatsu
  2025-07-15  8:36   ` Pavel Machek
  37 siblings, 1 reply; 41+ messages in thread
From: nobuhiro1.iwamatsu @ 2025-07-15  2:24 UTC (permalink / raw)
  To: biju.das.jz, pavel; +Cc: prabhakar.mahadev-lad.rj, cip-dev

Hi all,

> -----Original Message-----
> From: Biju Das <biju.das.jz@bp.renesas.com>
> Sent: Monday, July 14, 2025 7:16 PM
> To: Pavel Machek <pavel@denx.de>
> Cc: iwamatsu nobuhiro(岩松 信洋 □DITC○CPT)
> <nobuhiro1.iwamatsu@toshiba.co.jp>; Lad Prabhakar
> <prabhakar.mahadev-lad.rj@bp.renesas.com>; Biju Das
> <biju.das.jz@bp.renesas.com>; cip-dev@lists.cip-project.org
> Subject: [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support
> 
> This series adds support for the RZ/G3E CANFD driver into 6.12.y-cip.
> All the patches in the series are cherry-picked from mainline.
> 
> Biju Das (25):
>   clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1
>   clk: renesas: rzv2h: Fix a typo
>   clk: renesas: rzv2h: Support static dividers without RMW
>   dt-bindings: can: renesas,rcar-canfd: Simplify the conditional schema
>   dt-bindings: can: renesas,rcar-canfd: Document RZ/G3E support
>   can: rcar_canfd: Use of_get_available_child_by_name()
>   can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro
>   can: rcar_canfd: Update RCANFD_GERFL_ERR macro
>   can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC
>     macro
>   can: rcar_canfd: Add rcar_canfd_setrnc()
>   can: rcar_canfd: Update RCANFD_GAFLCFG macro
>   can: rcar_canfd: Add rnc_field_width variable to struct
>     rcar_canfd_hw_info
>   can: rcar_canfd: Add max_aflpn variable to struct rcar_canfd_hw_info
>   can: rcar_canfd: Add max_cftml variable to struct rcar_canfd_hw_info
>   can: rcar_canfd: Add {nom,data}_bittiming variables to struct
>     rcar_canfd_hw_info
>   can: rcar_canfd: Add ch_interface_mode variable to struct
>     rcar_canfd_hw_info
>   can: rcar_canfd: Add shared_can_regs variable to struct
>     rcar_canfd_hw_info
>   can: rcar_canfd: Add struct rcanfd_regs variable to struct
>     rcar_canfd_hw_info
>   can: rcar_canfd: Add sh variable to struct rcar_canfd_hw_info
>   can: rcar_canfd: Add external_clk variable to struct
>     rcar_canfd_hw_info
>   can: rcar_canfd: Enhance multi_channel_irqs handling
>   can: rcar_canfd: Add RZ/G3E support
>   arm64: dts: renesas: r9a09g047: Add CANFD node
>   arm64: dts: renesas: r9a09g047e57-smarc: Enable CANFD
>   arm64: dts: renesas: r9a09g047e57-smarc: Enable CAN Transceiver
> 
> Lad Prabhakar (9):
>   clk: renesas: rzv2h: Update error message
>   clk: renesas: rzv2h: Remove unused `type` field from `struct pll_clk`
>   clk: renesas: rzv2h: Add support for enabling PLLs
>   clk: renesas: rzv2h: Rename PLL field macros for consistency
>   clk: renesas: rzv2h: Sort compatible list based on SoC part number
>   clk: renesas: rzv2h: Add support for static mux clocks
>   clk: renesas: rzv2h: Add macro for defining static dividers
>   clk: renesas: rzv2h: Use str_on_off() helper in
>     rzv2h_mod_clock_endisable()
>   clk: renesas: rzv2h: Use both CLK_ON and CLK_MON bits for clock state
>     validation
> 
> Tommaso Merciai (2):
>   clk: renesas: rzv2h: Improve rzv2h_ddiv_set_rate()
>   clk: renesas: rzv2h: Simplify rzv2h_cpg_assert()/rzv2h_cpg_deassert()
> 
>  .../bindings/net/can/renesas,rcar-canfd.yaml  | 171 ++++++++---
>  arch/arm64/boot/dts/renesas/r9a09g047.dtsi    |  60 ++++
>  .../boot/dts/renesas/r9a09g047e57-smarc.dts   |  53 ++++
>  .../boot/dts/renesas/renesas-smarc2.dtsi      |  29 ++
>  .../boot/dts/renesas/rzg3e-smarc-som.dtsi     |  14 +-
>  drivers/clk/renesas/rzv2h-cpg.c               | 183 ++++++++----
>  drivers/clk/renesas/rzv2h-cpg.h               |  54 ++++
>  drivers/net/can/rcar/rcar_canfd.c             | 278
> +++++++++++++-----
>  8 files changed, 676 insertions(+), 166 deletions(-)
> 

I reviewed this series, looks good to me.
I can apply, if there are no other comments and test was OK.
  Test: https://gitlab.com/cip-project/cip-kernel/linux-cip/-/pipelines/1926889907

Reviewed-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>

Best regards,
  Nobuhiro



^ permalink raw reply	[flat|nested] 41+ messages in thread

* Re: [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support
  2025-07-15  2:24 ` nobuhiro1.iwamatsu
@ 2025-07-15  8:36   ` Pavel Machek
  0 siblings, 0 replies; 41+ messages in thread
From: Pavel Machek @ 2025-07-15  8:36 UTC (permalink / raw)
  To: nobuhiro1.iwamatsu; +Cc: biju.das.jz, prabhakar.mahadev-lad.rj, cip-dev

[-- Attachment #1: Type: text/plain, Size: 502 bytes --]

Hi!


> I reviewed this series, looks good to me.
> I can apply, if there are no other comments and test was OK.
>   Test: https://gitlab.com/cip-project/cip-kernel/linux-cip/-/pipelines/1926889907
> 
> Reviewed-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>

Thank you, I added "Reviewed-by:" tag and pushed the series.

Best regards,
								Pavel
-- 
In cooperation with DENX Software Engineering GmbH, HRB 165235 Munich,
Office: Kirchenstr.5, D-82194 Groebenzell, Germany

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

^ permalink raw reply	[flat|nested] 41+ messages in thread

end of thread, other threads:[~2025-07-15  8:36 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-14 10:16 [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 01/36] clk: renesas: rzv2h: Adjust for CPG_BUS_m_MSTOP starting from m = 1 Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 02/36] clk: renesas: rzv2h: Update error message Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 03/36] clk: renesas: rzv2h: Remove unused `type` field from `struct pll_clk` Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 04/36] clk: renesas: rzv2h: Add support for enabling PLLs Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 05/36] clk: renesas: rzv2h: Rename PLL field macros for consistency Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 06/36] clk: renesas: rzv2h: Improve rzv2h_ddiv_set_rate() Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 07/36] clk: renesas: rzv2h: Simplify rzv2h_cpg_assert()/rzv2h_cpg_deassert() Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 08/36] clk: renesas: rzv2h: Sort compatible list based on SoC part number Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 09/36] clk: renesas: rzv2h: Fix a typo Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 10/36] clk: renesas: rzv2h: Add support for static mux clocks Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 11/36] clk: renesas: rzv2h: Add macro for defining static dividers Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 12/36] clk: renesas: rzv2h: Support static dividers without RMW Biju Das
2025-07-14 11:54   ` Pavel Machek
2025-07-14 10:16 ` [PATCH 6.12.y-cip 13/36] clk: renesas: rzv2h: Use str_on_off() helper in rzv2h_mod_clock_endisable() Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 14/36] clk: renesas: rzv2h: Use both CLK_ON and CLK_MON bits for clock state validation Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 15/36] dt-bindings: can: renesas,rcar-canfd: Simplify the conditional schema Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 16/36] dt-bindings: can: renesas,rcar-canfd: Document RZ/G3E support Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 17/36] can: rcar_canfd: Use of_get_available_child_by_name() Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 18/36] can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 19/36] can: rcar_canfd: Update RCANFD_GERFL_ERR macro Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 20/36] can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC macro Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 21/36] can: rcar_canfd: Add rcar_canfd_setrnc() Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 22/36] can: rcar_canfd: Update RCANFD_GAFLCFG macro Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 23/36] can: rcar_canfd: Add rnc_field_width variable to struct rcar_canfd_hw_info Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 24/36] can: rcar_canfd: Add max_aflpn " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 25/36] can: rcar_canfd: Add max_cftml " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 26/36] can: rcar_canfd: Add {nom,data}_bittiming variables " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 27/36] can: rcar_canfd: Add ch_interface_mode variable " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 28/36] can: rcar_canfd: Add shared_can_regs " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 29/36] can: rcar_canfd: Add struct rcanfd_regs " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 30/36] can: rcar_canfd: Add sh " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 31/36] can: rcar_canfd: Add external_clk " Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 32/36] can: rcar_canfd: Enhance multi_channel_irqs handling Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 33/36] can: rcar_canfd: Add RZ/G3E support Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 34/36] arm64: dts: renesas: r9a09g047: Add CANFD node Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 35/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CANFD Biju Das
2025-07-14 10:16 ` [PATCH 6.12.y-cip 36/36] arm64: dts: renesas: r9a09g047e57-smarc: Enable CAN Transceiver Biju Das
2025-07-14 11:55 ` [PATCH 6.12.y-cip 00/36] Add RZ/G3E CANFD support Pavel Machek
2025-07-15  2:24 ` nobuhiro1.iwamatsu
2025-07-15  8:36   ` Pavel Machek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).