linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support
@ 2025-09-03  8:27 Tommaso Merciai
  2025-09-03  8:27 ` [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert() Tommaso Merciai
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03  8:27 UTC (permalink / raw)
  To: tomm.merciai
  Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai,
	Geert Uytterhoeven, Michael Turquette, Stephen Boyd,
	Philipp Zabel, linux-clk, linux-kernel

Dear All,

This patch series adds runtime PM support to the rz-dmac driver.
It also combines common code from rzg2l_cpg_assert() and rzg2l_cpg_deassert()
into a new __rzg2l_cpg_assert() helper to avoid code duplication,
and reworks __rzg2l_cpg_assert()/__rzv2h_cpg_assert() to return the state of
the assert/deassert operation.

Thanks & Regards,
Tommaso

v1->v2:
 - Rebased on top of next-20250903
 - Simplify polling condition and removed dev_warn() in __rzv2h_cpg_assert()
 - Simplify polling condition and removed dev_warn() in __rzg2l_cpg_assert()
 - Collected tags

Tommaso Merciai (5):
  clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and
    rzg2l_cpg_deassert()
  clk: renesas: rzg2l: Re-assert reset on deassert timeout
  clk: renesas: rzv2h: Re-assert reset on deassert timeout
  clk: renesas: rzv2h: Simplify polling condition in
    __rzv2h_cpg_assert()
  dmaengine: sh: rz-dmac: Add runtime PM support

 drivers/clk/renesas/rzg2l-cpg.c | 53 +++++++++++++-----------------
 drivers/clk/renesas/rzv2h-cpg.c | 13 ++++++--
 drivers/dma/sh/rz-dmac.c        | 57 +++++++++++++++++++++++++++++----
 3 files changed, 83 insertions(+), 40 deletions(-)

-- 
2.43.0


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

* [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert()
  2025-09-03  8:27 [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
@ 2025-09-03  8:27 ` Tommaso Merciai
  2025-09-03 11:54   ` Geert Uytterhoeven
  2025-09-03  8:27 ` [PATCH v2 2/5] clk: renesas: rzg2l: Re-assert reset on deassert timeout Tommaso Merciai
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03  8:27 UTC (permalink / raw)
  To: tomm.merciai
  Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai,
	Geert Uytterhoeven, Michael Turquette, Stephen Boyd,
	Philipp Zabel, linux-clk, linux-kernel

Combine common code from rzg2l_cpg_assert() and rzg2l_cpg_deassert() into a
new __rzg2l_cpg_assert() helper to avoid code duplication. This reduces
maintenance effort and improves code clarity.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v1->v2:
 - Collected GUytterhoeven tag
 - Simplify polling condition in __rzg2l_cpg_assert()

 drivers/clk/renesas/rzg2l-cpg.c | 45 ++++++++++++---------------------
 1 file changed, 16 insertions(+), 29 deletions(-)

diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c
index b508823f9723c..1143ce0afed47 100644
--- a/drivers/clk/renesas/rzg2l-cpg.c
+++ b/drivers/clk/renesas/rzg2l-cpg.c
@@ -1638,8 +1638,8 @@ rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
 
 #define rcdev_to_priv(x)	container_of(x, struct rzg2l_cpg_priv, rcdev)
 
-static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
-			    unsigned long id)
+static int __rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
+			      unsigned long id, bool assert)
 {
 	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
 	const struct rzg2l_cpg_info *info = priv->info;
@@ -1647,9 +1647,13 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
 	u32 mask = BIT(info->resets[id].bit);
 	s8 monbit = info->resets[id].monbit;
 	u32 value = mask << 16;
+	int ret;
 
-	dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
+	dev_dbg(rcdev->dev, "%s id:%ld offset:0x%x\n",
+		assert ? "assert" : "deassert", id, CLK_RST_R(reg));
 
+	if (!assert)
+		value |= mask;
 	writel(value, priv->base + CLK_RST_R(reg));
 
 	if (info->has_clk_mon_regs) {
@@ -1664,37 +1668,20 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
 	}
 
 	return readl_poll_timeout_atomic(priv->base + reg, value,
-					 value & mask, 10, 200);
+					 assert == !!(value & mask),
+					 10, 200);
+}
+
+static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
+			    unsigned long id)
+{
+	return __rzg2l_cpg_assert(rcdev, id, true);
 }
 
 static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
 			      unsigned long id)
 {
-	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
-	const struct rzg2l_cpg_info *info = priv->info;
-	unsigned int reg = info->resets[id].off;
-	u32 mask = BIT(info->resets[id].bit);
-	s8 monbit = info->resets[id].monbit;
-	u32 value = (mask << 16) | mask;
-
-	dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
-		CLK_RST_R(reg));
-
-	writel(value, priv->base + CLK_RST_R(reg));
-
-	if (info->has_clk_mon_regs) {
-		reg = CLK_MRST_R(reg);
-	} else if (monbit >= 0) {
-		reg = CPG_RST_MON;
-		mask = BIT(monbit);
-	} else {
-		/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
-		udelay(35);
-		return 0;
-	}
-
-	return readl_poll_timeout_atomic(priv->base + reg, value,
-					 !(value & mask), 10, 200);
+	return __rzg2l_cpg_assert(rcdev, id, false);
 }
 
 static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
-- 
2.43.0


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

* [PATCH v2 2/5] clk: renesas: rzg2l: Re-assert reset on deassert timeout
  2025-09-03  8:27 [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
  2025-09-03  8:27 ` [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert() Tommaso Merciai
@ 2025-09-03  8:27 ` Tommaso Merciai
  2025-09-03 11:56   ` Geert Uytterhoeven
  2025-09-03  8:27 ` [PATCH v2 3/5] clk: renesas: rzv2h: " Tommaso Merciai
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03  8:27 UTC (permalink / raw)
  To: tomm.merciai
  Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai,
	Geert Uytterhoeven, Michael Turquette, Stephen Boyd,
	Philipp Zabel, linux-clk, linux-kernel

Prevent issues during reset deassertion by re-asserting the reset if a
timeout occurs when trying to deassert. This ensures the reset line is in a
known state and improves reliability for hardware that may not immediately
clear the reset monitor bit.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v1->v2:
 - Collected GUytterhoeven tag
 - Removed dev_warn() in __rzg2l_cpg_assert()

 drivers/clk/renesas/rzg2l-cpg.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c
index 1143ce0afed47..8e9fea7f7dccb 100644
--- a/drivers/clk/renesas/rzg2l-cpg.c
+++ b/drivers/clk/renesas/rzg2l-cpg.c
@@ -1667,9 +1667,15 @@ static int __rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
 		return 0;
 	}
 
-	return readl_poll_timeout_atomic(priv->base + reg, value,
-					 assert == !!(value & mask),
-					 10, 200);
+	ret = readl_poll_timeout_atomic(priv->base + reg, value,
+					assert == !!(value & mask),
+					10, 200);
+	if (ret && !assert) {
+		value = mask << 16;
+		writel(value, priv->base + CLK_RST_R(info->resets[id].off));
+	}
+
+	return ret;
 }
 
 static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
-- 
2.43.0


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

* [PATCH v2 3/5] clk: renesas: rzv2h: Re-assert reset on deassert timeout
  2025-09-03  8:27 [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
  2025-09-03  8:27 ` [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert() Tommaso Merciai
  2025-09-03  8:27 ` [PATCH v2 2/5] clk: renesas: rzg2l: Re-assert reset on deassert timeout Tommaso Merciai
@ 2025-09-03  8:27 ` Tommaso Merciai
  2025-09-03 11:57   ` Geert Uytterhoeven
  2025-09-03  8:27 ` [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert() Tommaso Merciai
  2025-09-03  8:27 ` [PATCH v2 5/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
  4 siblings, 1 reply; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03  8:27 UTC (permalink / raw)
  To: tomm.merciai
  Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai,
	Geert Uytterhoeven, Michael Turquette, Stephen Boyd,
	Philipp Zabel, linux-clk, linux-kernel

Prevent issues during reset deassertion by re-asserting the reset if a
timeout occurs when trying to deassert. This ensures the reset line is in a
known state and improves reliability for hardware that may not immediately
clear the reset monitor bit.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v1->v2:
 - Collected GUytterhoeven tag
 - Removed dev_warn() in __rzg2l_cpg_assert()

 drivers/clk/renesas/rzv2h-cpg.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/clk/renesas/rzv2h-cpg.c b/drivers/clk/renesas/rzv2h-cpg.c
index 58ccbae0f9046..35c5ff38e231e 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -854,6 +854,7 @@ static int __rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
 	u32 mask = BIT(priv->resets[id].reset_bit);
 	u8 monbit = priv->resets[id].mon_bit;
 	u32 value = mask << 16;
+	int ret;
 
 	dev_dbg(rcdev->dev, "%s id:%ld offset:0x%x\n",
 		assert ? "assert" : "deassert", id, reg);
@@ -865,9 +866,15 @@ static int __rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
 	reg = GET_RST_MON_OFFSET(priv->resets[id].mon_index);
 	mask = BIT(monbit);
 
-	return readl_poll_timeout_atomic(priv->base + reg, value,
-					 assert ? (value & mask) : !(value & mask),
-					 10, 200);
+	ret = readl_poll_timeout_atomic(priv->base + reg, value,
+					assert ? (value & mask) : !(value & mask),
+					10, 200);
+	if (ret && !assert) {
+		value = mask << 16;
+		writel(value, priv->base + GET_RST_OFFSET(priv->resets[id].reset_index));
+	}
+
+	return ret;
 }
 
 static int rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
-- 
2.43.0


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

* [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert()
  2025-09-03  8:27 [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
                   ` (2 preceding siblings ...)
  2025-09-03  8:27 ` [PATCH v2 3/5] clk: renesas: rzv2h: " Tommaso Merciai
@ 2025-09-03  8:27 ` Tommaso Merciai
  2025-09-03 11:58   ` Geert Uytterhoeven
  2025-09-03  8:27 ` [PATCH v2 5/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
  4 siblings, 1 reply; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03  8:27 UTC (permalink / raw)
  To: tomm.merciai
  Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai,
	Geert Uytterhoeven, Michael Turquette, Stephen Boyd,
	Philipp Zabel, linux-clk, linux-kernel

Replace the ternary operator with a direct boolean comparison to improve
code readability and maintainability. The logic remains unchanged.

Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v1->v2:
 - New patch

 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 35c5ff38e231e..0e8800906b89e 100644
--- a/drivers/clk/renesas/rzv2h-cpg.c
+++ b/drivers/clk/renesas/rzv2h-cpg.c
@@ -867,7 +867,7 @@ static int __rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
 	mask = BIT(monbit);
 
 	ret = readl_poll_timeout_atomic(priv->base + reg, value,
-					assert ? (value & mask) : !(value & mask),
+					assert == !!(value & mask),
 					10, 200);
 	if (ret && !assert) {
 		value = mask << 16;
-- 
2.43.0


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

* [PATCH v2 5/5] dmaengine: sh: rz-dmac: Add runtime PM support
  2025-09-03  8:27 [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
                   ` (3 preceding siblings ...)
  2025-09-03  8:27 ` [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert() Tommaso Merciai
@ 2025-09-03  8:27 ` Tommaso Merciai
  2025-09-03 12:17   ` Geert Uytterhoeven
  4 siblings, 1 reply; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03  8:27 UTC (permalink / raw)
  To: tomm.merciai
  Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai,
	Geert Uytterhoeven, Michael Turquette, Stephen Boyd, Vinod Koul,
	Philipp Zabel, Wolfram Sang, Lad Prabhakar, Fabrizio Castro,
	Uwe Kleine-König, linux-clk, linux-kernel, dmaengine

Enable runtime power management in the rz-dmac driver by adding suspend and
resume callbacks. This ensures the driver can correctly assert and deassert
the reset control and manage power state transitions during suspend and
resume. Adding runtime PM support allows the DMA controller to reduce power
consumption when idle and maintain correct operation across system sleep
states, addressing the previous lack of dynamic power management in the
driver.

Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v1->v2:
 - No chanes

 drivers/dma/sh/rz-dmac.c | 57 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 7 deletions(-)

diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c
index 1f687b08d6b86..2f06bdb7ce3be 100644
--- a/drivers/dma/sh/rz-dmac.c
+++ b/drivers/dma/sh/rz-dmac.c
@@ -437,6 +437,17 @@ static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan)
  * DMA engine operations
  */
 
+static void rz_dmac_chan_init_all(struct rz_dmac *dmac)
+{
+	unsigned int i;
+
+	rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_0_7_COMMON_BASE + DCTRL);
+	rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_8_15_COMMON_BASE + DCTRL);
+
+	for (i = 0; i < dmac->n_channels; i++)
+		rz_dmac_ch_writel(&dmac->channels[i], CHCTRL_DEFAULT, CHCTRL, 1);
+}
+
 static int rz_dmac_alloc_chan_resources(struct dma_chan *chan)
 {
 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
@@ -970,10 +981,6 @@ static int rz_dmac_probe(struct platform_device *pdev)
 		goto err_pm_disable;
 	}
 
-	ret = reset_control_deassert(dmac->rstc);
-	if (ret)
-		goto err_pm_runtime_put;
-
 	for (i = 0; i < dmac->n_channels; i++) {
 		ret = rz_dmac_chan_probe(dmac, &dmac->channels[i], i);
 		if (ret < 0)
@@ -1028,8 +1035,6 @@ static int rz_dmac_probe(struct platform_device *pdev)
 				  channel->lmdesc.base_dma);
 	}
 
-	reset_control_assert(dmac->rstc);
-err_pm_runtime_put:
 	pm_runtime_put(&pdev->dev);
 err_pm_disable:
 	pm_runtime_disable(&pdev->dev);
@@ -1052,13 +1057,50 @@ static void rz_dmac_remove(struct platform_device *pdev)
 				  channel->lmdesc.base,
 				  channel->lmdesc.base_dma);
 	}
-	reset_control_assert(dmac->rstc);
 	pm_runtime_put(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 
 	platform_device_put(dmac->icu.pdev);
 }
 
+static int rz_dmac_runtime_suspend(struct device *dev)
+{
+	struct rz_dmac *dmac = dev_get_drvdata(dev);
+
+	return reset_control_assert(dmac->rstc);
+}
+
+static int rz_dmac_runtime_resume(struct device *dev)
+{
+	struct rz_dmac *dmac = dev_get_drvdata(dev);
+
+	return reset_control_deassert(dmac->rstc);
+}
+
+static int rz_dmac_resume(struct device *dev)
+{
+	struct rz_dmac *dmac = dev_get_drvdata(dev);
+	int ret;
+
+	ret = pm_runtime_force_resume(dev);
+	if (ret)
+		return ret;
+
+	rz_dmac_chan_init_all(dmac);
+
+	return 0;
+}
+
+static const struct dev_pm_ops rz_dmac_pm_ops = {
+	/*
+	 * TODO for system sleep/resume:
+	 *   - Wait for the current transfer to complete and stop the device,
+	 *   - Resume transfers, if any.
+	 */
+	NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, rz_dmac_resume)
+	RUNTIME_PM_OPS(rz_dmac_runtime_suspend, rz_dmac_runtime_resume, NULL)
+};
+
 static const struct of_device_id of_rz_dmac_match[] = {
 	{ .compatible = "renesas,r9a09g057-dmac", },
 	{ .compatible = "renesas,rz-dmac", },
@@ -1068,6 +1110,7 @@ MODULE_DEVICE_TABLE(of, of_rz_dmac_match);
 
 static struct platform_driver rz_dmac_driver = {
 	.driver		= {
+		.pm	= pm_ptr(&rz_dmac_pm_ops),
 		.name	= "rz-dmac",
 		.of_match_table = of_rz_dmac_match,
 	},
-- 
2.43.0


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

* Re: [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert()
  2025-09-03  8:27 ` [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert() Tommaso Merciai
@ 2025-09-03 11:54   ` Geert Uytterhoeven
  0 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2025-09-03 11:54 UTC (permalink / raw)
  To: Tommaso Merciai
  Cc: tomm.merciai, linux-renesas-soc, biju.das.jz, Michael Turquette,
	Stephen Boyd, Philipp Zabel, linux-clk, linux-kernel

Hi Tommaso,

On Wed, 3 Sept 2025 at 10:28, Tommaso Merciai
<tommaso.merciai.xr@bp.renesas.com> wrote:
> Combine common code from rzg2l_cpg_assert() and rzg2l_cpg_deassert() into a
> new __rzg2l_cpg_assert() helper to avoid code duplication. This reduces
> maintenance effort and improves code clarity.
>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> ---
> v1->v2:
>  - Collected GUytterhoeven tag
>  - Simplify polling condition in __rzg2l_cpg_assert()

Thanks, will queue in renesas-clk for v6.18...

> --- a/drivers/clk/renesas/rzg2l-cpg.c
> +++ b/drivers/clk/renesas/rzg2l-cpg.c
> @@ -1664,37 +1668,20 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
>         }
>
>         return readl_poll_timeout_atomic(priv->base + reg, value,
> -                                        value & mask, 10, 200);
> +                                        assert == !!(value & mask),
> +                                        10, 200);

... with these lines folded into a single line.

> +}
> +

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

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

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

* Re: [PATCH v2 2/5] clk: renesas: rzg2l: Re-assert reset on deassert timeout
  2025-09-03  8:27 ` [PATCH v2 2/5] clk: renesas: rzg2l: Re-assert reset on deassert timeout Tommaso Merciai
@ 2025-09-03 11:56   ` Geert Uytterhoeven
  0 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2025-09-03 11:56 UTC (permalink / raw)
  To: Tommaso Merciai
  Cc: tomm.merciai, linux-renesas-soc, biju.das.jz, Michael Turquette,
	Stephen Boyd, Philipp Zabel, linux-clk, linux-kernel

On Wed, 3 Sept 2025 at 10:28, Tommaso Merciai
<tommaso.merciai.xr@bp.renesas.com> wrote:
> Prevent issues during reset deassertion by re-asserting the reset if a
> timeout occurs when trying to deassert. This ensures the reset line is in a
> known state and improves reliability for hardware that may not immediately
> clear the reset monitor bit.
>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> ---
> v1->v2:
>  - Collected GUytterhoeven tag
>  - Removed dev_warn() in __rzg2l_cpg_assert()

Thanks, will queue in renesas-clk for v6.18.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

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

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

* Re: [PATCH v2 3/5] clk: renesas: rzv2h: Re-assert reset on deassert timeout
  2025-09-03  8:27 ` [PATCH v2 3/5] clk: renesas: rzv2h: " Tommaso Merciai
@ 2025-09-03 11:57   ` Geert Uytterhoeven
  0 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2025-09-03 11:57 UTC (permalink / raw)
  To: Tommaso Merciai
  Cc: tomm.merciai, linux-renesas-soc, biju.das.jz, Michael Turquette,
	Stephen Boyd, Philipp Zabel, linux-clk, linux-kernel

On Wed, 3 Sept 2025 at 10:28, Tommaso Merciai
<tommaso.merciai.xr@bp.renesas.com> wrote:
> Prevent issues during reset deassertion by re-asserting the reset if a
> timeout occurs when trying to deassert. This ensures the reset line is in a
> known state and improves reliability for hardware that may not immediately
> clear the reset monitor bit.
>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> ---
> v1->v2:
>  - Collected GUytterhoeven tag
>  - Removed dev_warn() in __rzg2l_cpg_assert()

Thanks, will queue in renesas-clk for v6.18.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

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

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

* Re: [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert()
  2025-09-03  8:27 ` [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert() Tommaso Merciai
@ 2025-09-03 11:58   ` Geert Uytterhoeven
  2025-09-03 13:51     ` Tommaso Merciai
  0 siblings, 1 reply; 12+ messages in thread
From: Geert Uytterhoeven @ 2025-09-03 11:58 UTC (permalink / raw)
  To: Tommaso Merciai
  Cc: tomm.merciai, linux-renesas-soc, biju.das.jz, Michael Turquette,
	Stephen Boyd, Philipp Zabel, linux-clk, linux-kernel

Hi Tommaso,

On Wed, 3 Sept 2025 at 10:28, Tommaso Merciai
<tommaso.merciai.xr@bp.renesas.com> wrote:
> Replace the ternary operator with a direct boolean comparison to improve
> code readability and maintainability. The logic remains unchanged.
>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

Thanks for your patch!

> --- a/drivers/clk/renesas/rzv2h-cpg.c
> +++ b/drivers/clk/renesas/rzv2h-cpg.c
> @@ -867,7 +867,7 @@ static int __rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
>         mask = BIT(monbit);
>
>         ret = readl_poll_timeout_atomic(priv->base + reg, value,
> -                                       assert ? (value & mask) : !(value & mask),
> +                                       assert == !!(value & mask),
>                                         10, 200);

These two lines now fit on a single line.

>         if (ret && !assert) {
>                 value = mask << 16;

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
i.e. will queue in renesas-clk for v6.18 with the above fixed.
No need to resend.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

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

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

* Re: [PATCH v2 5/5] dmaengine: sh: rz-dmac: Add runtime PM support
  2025-09-03  8:27 ` [PATCH v2 5/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
@ 2025-09-03 12:17   ` Geert Uytterhoeven
  0 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2025-09-03 12:17 UTC (permalink / raw)
  To: Tommaso Merciai
  Cc: tomm.merciai, linux-renesas-soc, biju.das.jz, Michael Turquette,
	Stephen Boyd, Vinod Koul, Philipp Zabel, Wolfram Sang,
	Lad Prabhakar, Fabrizio Castro, Uwe Kleine-König, linux-clk,
	linux-kernel, dmaengine

Hi Tommaso,

Thanks for your patch!

I don't understand why you included this patch in a series with clock
patches. AFAIUC, there is no dependency.  Am I missing something?

On Wed, 3 Sept 2025 at 10:28, Tommaso Merciai
<tommaso.merciai.xr@bp.renesas.com> wrote:
> Enable runtime power management in the rz-dmac driver by adding suspend and
> resume callbacks. This ensures the driver can correctly assert and deassert

This is not really what this patch does: the Runtime PM-related changes
just hide^Wmove reset handling into the runtime callbacks.

> the reset control and manage power state transitions during suspend and
> resume. Adding runtime PM support allows the DMA controller to reduce power

(I assume) This patch does fix resuming from _system_ suspend.

> consumption when idle and maintain correct operation across system sleep
> states, addressing the previous lack of dynamic power management in the
> driver.

The driver still does not do dynamic power management: you still call
pm_runtime_resume_and_get() from the driver's probe() .callback, and
call pm_runtime_put() only from the .remove() callback, so the device
is powered all the time.
To implement dynamic power management, you have to change that,
and call pm_runtime_resume_and_get() and pm_runtime_put() from the
.device_alloc_chan_resources() resp. .device_free_chan_resources()
callbacks (see e.g. drivers/dma/sh/rcar-dmac.c).

> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>

> --- a/drivers/dma/sh/rz-dmac.c
> +++ b/drivers/dma/sh/rz-dmac.c
> @@ -437,6 +437,17 @@ static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan)
>   * DMA engine operations
>   */
>
> +static void rz_dmac_chan_init_all(struct rz_dmac *dmac)
> +{
> +       unsigned int i;
> +
> +       rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_0_7_COMMON_BASE + DCTRL);
> +       rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_8_15_COMMON_BASE + DCTRL);
> +
> +       for (i = 0; i < dmac->n_channels; i++)
> +               rz_dmac_ch_writel(&dmac->channels[i], CHCTRL_DEFAULT, CHCTRL, 1);
> +}
> +
>  static int rz_dmac_alloc_chan_resources(struct dma_chan *chan)
>  {
>         struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
> @@ -970,10 +981,6 @@ static int rz_dmac_probe(struct platform_device *pdev)
>                 goto err_pm_disable;
>         }
>
> -       ret = reset_control_deassert(dmac->rstc);
> -       if (ret)
> -               goto err_pm_runtime_put;
> -
>         for (i = 0; i < dmac->n_channels; i++) {
>                 ret = rz_dmac_chan_probe(dmac, &dmac->channels[i], i);
>                 if (ret < 0)
> @@ -1028,8 +1035,6 @@ static int rz_dmac_probe(struct platform_device *pdev)
>                                   channel->lmdesc.base_dma);
>         }
>
> -       reset_control_assert(dmac->rstc);
> -err_pm_runtime_put:
>         pm_runtime_put(&pdev->dev);
>  err_pm_disable:
>         pm_runtime_disable(&pdev->dev);
> @@ -1052,13 +1057,50 @@ static void rz_dmac_remove(struct platform_device *pdev)
>                                   channel->lmdesc.base,
>                                   channel->lmdesc.base_dma);
>         }
> -       reset_control_assert(dmac->rstc);
>         pm_runtime_put(&pdev->dev);
>         pm_runtime_disable(&pdev->dev);
>
>         platform_device_put(dmac->icu.pdev);
>  }
>
> +static int rz_dmac_runtime_suspend(struct device *dev)
> +{
> +       struct rz_dmac *dmac = dev_get_drvdata(dev);
> +
> +       return reset_control_assert(dmac->rstc);

Do you really want to reset the device (and thus loose register state)
each and every time the device is runtime-suspended?  For now it doesn't
matter much, but once you implement real dynamic power management,
it does.
I think the reset handling should be moved to the system suspend/resume
callbacks.

> +}
> +
> +static int rz_dmac_runtime_resume(struct device *dev)
> +{
> +       struct rz_dmac *dmac = dev_get_drvdata(dev);
> +
> +       return reset_control_deassert(dmac->rstc);

Shouldn't this reinitialize some registers?
For now that indeed doesn't matter, as reset is only deasserted
from .probe(), before any register initialization.

> +}
> +
> +static int rz_dmac_resume(struct device *dev)
> +{
> +       struct rz_dmac *dmac = dev_get_drvdata(dev);
> +       int ret;
> +
> +       ret = pm_runtime_force_resume(dev);
> +       if (ret)
> +               return ret;
> +
> +       rz_dmac_chan_init_all(dmac);
> +
> +       return 0;
> +}
> +
> +static const struct dev_pm_ops rz_dmac_pm_ops = {
> +       /*
> +        * TODO for system sleep/resume:
> +        *   - Wait for the current transfer to complete and stop the device,
> +        *   - Resume transfers, if any.
> +        */
> +       NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, rz_dmac_resume)
> +       RUNTIME_PM_OPS(rz_dmac_runtime_suspend, rz_dmac_runtime_resume, NULL)
> +};
> +
>  static const struct of_device_id of_rz_dmac_match[] = {
>         { .compatible = "renesas,r9a09g057-dmac", },
>         { .compatible = "renesas,rz-dmac", },
> @@ -1068,6 +1110,7 @@ MODULE_DEVICE_TABLE(of, of_rz_dmac_match);
>
>  static struct platform_driver rz_dmac_driver = {
>         .driver         = {
> +               .pm     = pm_ptr(&rz_dmac_pm_ops),
>                 .name   = "rz-dmac",
>                 .of_match_table = of_rz_dmac_match,
>         },

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

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

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

* Re: [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert()
  2025-09-03 11:58   ` Geert Uytterhoeven
@ 2025-09-03 13:51     ` Tommaso Merciai
  0 siblings, 0 replies; 12+ messages in thread
From: Tommaso Merciai @ 2025-09-03 13:51 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: tomm.merciai, linux-renesas-soc, biju.das.jz, Michael Turquette,
	Stephen Boyd, Philipp Zabel, linux-clk, linux-kernel

Hi Geert,

On Wed, Sep 03, 2025 at 01:58:26PM +0200, Geert Uytterhoeven wrote:
> Hi Tommaso,
> 
> On Wed, 3 Sept 2025 at 10:28, Tommaso Merciai
> <tommaso.merciai.xr@bp.renesas.com> wrote:
> > Replace the ternary operator with a direct boolean comparison to improve
> > code readability and maintainability. The logic remains unchanged.
> >
> > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> 
> Thanks for your patch!
> 
> > --- a/drivers/clk/renesas/rzv2h-cpg.c
> > +++ b/drivers/clk/renesas/rzv2h-cpg.c
> > @@ -867,7 +867,7 @@ static int __rzv2h_cpg_assert(struct reset_controller_dev *rcdev,
> >         mask = BIT(monbit);
> >
> >         ret = readl_poll_timeout_atomic(priv->base + reg, value,
> > -                                       assert ? (value & mask) : !(value & mask),
> > +                                       assert == !!(value & mask),
> >                                         10, 200);
> 
> These two lines now fit on a single line.
> 
> >         if (ret && !assert) {
> >                 value = mask << 16;
> 
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> i.e. will queue in renesas-clk for v6.18 with the above fixed.
> No need to resend.

Thank you for taking care of this!
Same for PATCH 1/5.

Kind Regards,
Tommaso


> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> -- 
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds
> 

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

end of thread, other threads:[~2025-09-03 13:51 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-03  8:27 [PATCH v2 0/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
2025-09-03  8:27 ` [PATCH v2 1/5] clk: renesas: rzg2l: Simplify rzg2l_cpg_assert() and rzg2l_cpg_deassert() Tommaso Merciai
2025-09-03 11:54   ` Geert Uytterhoeven
2025-09-03  8:27 ` [PATCH v2 2/5] clk: renesas: rzg2l: Re-assert reset on deassert timeout Tommaso Merciai
2025-09-03 11:56   ` Geert Uytterhoeven
2025-09-03  8:27 ` [PATCH v2 3/5] clk: renesas: rzv2h: " Tommaso Merciai
2025-09-03 11:57   ` Geert Uytterhoeven
2025-09-03  8:27 ` [PATCH v2 4/5] clk: renesas: rzv2h: Simplify polling condition in __rzv2h_cpg_assert() Tommaso Merciai
2025-09-03 11:58   ` Geert Uytterhoeven
2025-09-03 13:51     ` Tommaso Merciai
2025-09-03  8:27 ` [PATCH v2 5/5] dmaengine: sh: rz-dmac: Add runtime PM support Tommaso Merciai
2025-09-03 12:17   ` Geert Uytterhoeven

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).