[PATCH 6.1.y-cip v2 02/22] clk: renesas: rzg2l: Deassert reset on assert timeout
Claudiu Beznea <[email protected]> Wed, 8 Jul 2026 11:11:39 +0300
| Newsgroups | org.cip-project.lists.cip-dev |
|---|---|
| Message-ID | <[email protected]> |
From: Biju Das <[email protected]> commit 0b0201f259e1158a875c5fd01adf318ae5d32352 upstream. If the assert() fails due to timeout error, set the reset register bit back to deasserted state. This change is needed especially for handling assert error in suspend() callback that expect the device to be in operational state in case of failure. Signed-off-by: Biju Das <[email protected]> Reviewed-by: Geert Uytterhoeven <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Geert Uytterhoeven <[email protected]> [claudiu.beznea: fixed conflict] Signed-off-by: Claudiu Beznea <[email protected]> --- Changes in v2: - none; this patch is new drivers/clk/renesas/rzg2l-cpg.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c index e8ea65446890..4d61a39e48cc 100644 --- a/drivers/clk/renesas/rzg2l-cpg.c +++ b/drivers/clk/renesas/rzg2l-cpg.c @@ -1769,6 +1769,8 @@ 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; + u32 mon; + int ret; dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg)); @@ -1785,8 +1787,14 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev, return 0; } - return readl_poll_timeout_atomic(priv->base + reg, value, - value & mask, 10, 200); + ret = readl_poll_timeout_atomic(priv->base + reg, mon, + !!(mon & mask), 10, 200); + if (ret) { + value ^= mask; + writel(value, priv->base + CLK_RST_R(info->resets[id].off)); + } + + return ret; } static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev, -- 2.43.0