From: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> Move the clock division ratio values into OF match data instead of hardcoding them in the driver. Introduce `rzv2h_of_data` to hold `cks_min` and `cks_max`, populated via the device tree match table. In probe, call `of_device_get_match_data()` to retrieve these values for setting up the watchdog. This refactoring is transparent for existing RZ/V2H(P) usage and facilitates adding RZ/T2H support with different divider ranges. Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> Reviewed-by: Fabrizio Castro <fabrizio.castro.jz@xxxxxxxxxxx> --- drivers/watchdog/rzv2h_wdt.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/watchdog/rzv2h_wdt.c b/drivers/watchdog/rzv2h_wdt.c index 8defd0241213..d64d29709160 100644 --- a/drivers/watchdog/rzv2h_wdt.c +++ b/drivers/watchdog/rzv2h_wdt.c @@ -45,12 +45,18 @@ module_param(nowayout, bool, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); +struct rzv2h_of_data { + u8 cks_min; + u8 cks_max; +}; + struct rzv2h_wdt_priv { void __iomem *base; struct clk *pclk; struct clk *oscclk; struct reset_control *rstc; struct watchdog_device wdev; + const struct rzv2h_of_data *of_data; }; static int rzv2h_wdt_ping(struct watchdog_device *wdev) @@ -106,7 +112,7 @@ static int rzv2h_wdt_start(struct watchdog_device *wdev) * - RPES[9:8] - Window End Position Select - 11b: 0% * - TOPS[1:0] - Timeout Period Select - 11b: 16384 cycles (3FFFh) */ - rzv2h_wdt_setup(wdev, WDTCR_CKS_CLK_256 | WDTCR_RPSS_100 | + rzv2h_wdt_setup(wdev, priv->of_data->cks_max | WDTCR_RPSS_100 | WDTCR_RPES_0 | WDTCR_TOPS_16384); /* @@ -184,7 +190,7 @@ static int rzv2h_wdt_restart(struct watchdog_device *wdev, * - RPES[9:8] - Window End Position Select - 00b: 75% * - TOPS[1:0] - Timeout Period Select - 00b: 1024 cycles (03FFh) */ - rzv2h_wdt_setup(wdev, WDTCR_CKS_CLK_1 | WDTCR_RPSS_25 | + rzv2h_wdt_setup(wdev, priv->of_data->cks_min | WDTCR_RPSS_25 | WDTCR_RPES_75 | WDTCR_TOPS_1024); rzv2h_wdt_ping(wdev); @@ -213,6 +219,8 @@ static int rzv2h_wdt_probe(struct platform_device *pdev) if (!priv) return -ENOMEM; + priv->of_data = of_device_get_match_data(dev); + priv->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); @@ -254,8 +262,13 @@ static int rzv2h_wdt_probe(struct platform_device *pdev) return devm_watchdog_register_device(dev, &priv->wdev); } +static const struct rzv2h_of_data rzv2h_wdt_of_data = { + .cks_min = WDTCR_CKS_CLK_1, + .cks_max = WDTCR_CKS_CLK_256, +}; + static const struct of_device_id rzv2h_wdt_ids[] = { - { .compatible = "renesas,r9a09g057-wdt", }, + { .compatible = "renesas,r9a09g057-wdt", .data = &rzv2h_wdt_of_data }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, rzv2h_wdt_ids); -- 2.49.0