Skip to content

Commit da235d2

Browse files
claudiubezneageertu
authored andcommitted
clk: renesas: rzg2l: Check reset monitor registers
The hardware manual of both RZ/G2L and RZ/G3S specifies that the reset monitor registers need to be interrogated when the reset signals are toggled (chapters "Procedures for Supplying and Stopping Reset Signals" and "Procedure for Activating Modules"). Without this, there is a chance that different modules (e.g. Ethernet) are not ready after their reset signal is toggled, leading to failures (on probe or resume from deep sleep states). The same indications are available for RZ/V2M for TYPE-B reset controls. Fixes: ef3c613 ("clk: renesas: Add CPG core wrapper for RZ/G2L SoC") Fixes: 8090bea ("clk: renesas: rzg2l: Add support for RZ/V2M reset monitor reg") Signed-off-by: Claudiu Beznea <[email protected]> Reviewed-by: Geert Uytterhoeven <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Geert Uytterhoeven <[email protected]>
1 parent 755cb95 commit da235d2

File tree

1 file changed

+44
-15
lines changed

1 file changed

+44
-15
lines changed

drivers/clk/renesas/rzg2l-cpg.c

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,12 +1416,27 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
14161416
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
14171417
const struct rzg2l_cpg_info *info = priv->info;
14181418
unsigned int reg = info->resets[id].off;
1419-
u32 value = BIT(info->resets[id].bit) << 16;
1419+
u32 mask = BIT(info->resets[id].bit);
1420+
s8 monbit = info->resets[id].monbit;
1421+
u32 value = mask << 16;
14201422

14211423
dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
14221424

14231425
writel(value, priv->base + CLK_RST_R(reg));
1424-
return 0;
1426+
1427+
if (info->has_clk_mon_regs) {
1428+
reg = CLK_MRST_R(reg);
1429+
} else if (monbit >= 0) {
1430+
reg = CPG_RST_MON;
1431+
mask = BIT(monbit);
1432+
} else {
1433+
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
1434+
udelay(35);
1435+
return 0;
1436+
}
1437+
1438+
return readl_poll_timeout_atomic(priv->base + reg, value,
1439+
value & mask, 10, 200);
14251440
}
14261441

14271442
static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
@@ -1430,14 +1445,28 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
14301445
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
14311446
const struct rzg2l_cpg_info *info = priv->info;
14321447
unsigned int reg = info->resets[id].off;
1433-
u32 dis = BIT(info->resets[id].bit);
1434-
u32 value = (dis << 16) | dis;
1448+
u32 mask = BIT(info->resets[id].bit);
1449+
s8 monbit = info->resets[id].monbit;
1450+
u32 value = (mask << 16) | mask;
14351451

14361452
dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
14371453
CLK_RST_R(reg));
14381454

14391455
writel(value, priv->base + CLK_RST_R(reg));
1440-
return 0;
1456+
1457+
if (info->has_clk_mon_regs) {
1458+
reg = CLK_MRST_R(reg);
1459+
} else if (monbit >= 0) {
1460+
reg = CPG_RST_MON;
1461+
mask = BIT(monbit);
1462+
} else {
1463+
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
1464+
udelay(35);
1465+
return 0;
1466+
}
1467+
1468+
return readl_poll_timeout_atomic(priv->base + reg, value,
1469+
!(value & mask), 10, 200);
14411470
}
14421471

14431472
static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
@@ -1449,9 +1478,6 @@ static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
14491478
if (ret)
14501479
return ret;
14511480

1452-
/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
1453-
udelay(35);
1454-
14551481
return rzg2l_cpg_deassert(rcdev, id);
14561482
}
14571483

@@ -1460,18 +1486,21 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
14601486
{
14611487
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
14621488
const struct rzg2l_cpg_info *info = priv->info;
1463-
unsigned int reg = info->resets[id].off;
1464-
u32 bitmask = BIT(info->resets[id].bit);
14651489
s8 monbit = info->resets[id].monbit;
1490+
unsigned int reg;
1491+
u32 bitmask;
14661492

14671493
if (info->has_clk_mon_regs) {
1468-
return !!(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
1494+
reg = CLK_MRST_R(info->resets[id].off);
1495+
bitmask = BIT(info->resets[id].bit);
14691496
} else if (monbit >= 0) {
1470-
u32 monbitmask = BIT(monbit);
1471-
1472-
return !!(readl(priv->base + CPG_RST_MON) & monbitmask);
1497+
reg = CPG_RST_MON;
1498+
bitmask = BIT(monbit);
1499+
} else {
1500+
return -ENOTSUPP;
14731501
}
1474-
return -ENOTSUPP;
1502+
1503+
return !!(readl(priv->base + reg) & bitmask);
14751504
}
14761505

14771506
static const struct reset_control_ops rzg2l_cpg_reset_ops = {

0 commit comments

Comments
 (0)