[PATCH v3 2/3] watchdog: rzv2h: Convert WDTDCR handling to regmap
From: Prabhakar
Date: Fri Aug 14 2026 - 15:15:37 EST
From: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>
Convert the WDTDCR register access from raw readl/writel variants over to
the regmap framework using devm_regmap_init_mmio().
This conversion serves as a preparatory refactoring step. It allows the
driver to subsequently support syscon-based system controllers natively
by passing along alternative regmap handles without forcing messy
architectural branching at runtime.
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx>
---
v2->v3:
- Dropped unwinding changes to patch#1.
- Set use_raw_spinlock to true in regmap config as certain watchdog operations
runs in an atomic panic context.
---
drivers/watchdog/rzv2h_wdt.c | 37 ++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/drivers/watchdog/rzv2h_wdt.c b/drivers/watchdog/rzv2h_wdt.c
index b770226f785e..cf28caef31e8 100644
--- a/drivers/watchdog/rzv2h_wdt.c
+++ b/drivers/watchdog/rzv2h_wdt.c
@@ -12,6 +12,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
#include <linux/reset.h>
#include <linux/units.h>
#include <linux/watchdog.h>
@@ -67,7 +68,7 @@ struct rzv2h_of_data {
struct rzv2h_wdt_priv {
void __iomem *base;
- void __iomem *wdtdcr;
+ struct regmap *wdtdcr_regmap;
struct clk *pclk;
struct clk *oscclk;
struct reset_control *rstc;
@@ -91,20 +92,12 @@ static int rzv2h_wdt_ping(struct watchdog_device *wdev)
static int rzt2h_wdt_wdtdcr_count_stop(struct rzv2h_wdt_priv *priv)
{
- u32 reg = readl(priv->wdtdcr + WDTDCR);
-
- writel(reg | WDTDCR_WDTSTOPCTRL, priv->wdtdcr + WDTDCR);
-
- return 0;
+ return regmap_set_bits(priv->wdtdcr_regmap, WDTDCR, WDTDCR_WDTSTOPCTRL);
}
static int rzt2h_wdt_wdtdcr_count_start(struct rzv2h_wdt_priv *priv)
{
- u32 reg = readl(priv->wdtdcr + WDTDCR);
-
- writel(reg & ~WDTDCR_WDTSTOPCTRL, priv->wdtdcr + WDTDCR);
-
- return 0;
+ return regmap_clear_bits(priv->wdtdcr_regmap, WDTDCR, WDTDCR_WDTSTOPCTRL);
}
static void rzv2h_wdt_setup(struct watchdog_device *wdev, u16 wdtcr)
@@ -280,14 +273,30 @@ static const struct watchdog_ops rzv2h_wdt_ops = {
.restart = rzv2h_wdt_restart,
};
+static const struct regmap_config rzv2h_wdtdcr_regmap_config = {
+ .name = "wdtdcr",
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+ .max_register = WDTDCR,
+ .fast_io = true,
+ .use_raw_spinlock = true,
+};
+
static int rzt2h_wdt_wdtdcr_init(struct platform_device *pdev,
struct rzv2h_wdt_priv *priv)
{
+ void __iomem *wdtdcr;
int ret;
- priv->wdtdcr = devm_platform_ioremap_resource(pdev, 1);
- if (IS_ERR(priv->wdtdcr))
- return PTR_ERR(priv->wdtdcr);
+ wdtdcr = devm_platform_ioremap_resource(pdev, 1);
+ if (IS_ERR(wdtdcr))
+ return PTR_ERR(wdtdcr);
+
+ priv->wdtdcr_regmap = devm_regmap_init_mmio(&pdev->dev, wdtdcr,
+ &rzv2h_wdtdcr_regmap_config);
+ if (IS_ERR(priv->wdtdcr_regmap))
+ return PTR_ERR(priv->wdtdcr_regmap);
ret = pm_runtime_resume_and_get(&pdev->dev);
if (ret)
--
2.43.0