Re: [PATCH] watchdog: imx7ulp_wdt: Keep WDOG running until A55 enters WFI on i.MX94
From: Frank Li <Frank.li@nxp.com>
Date: 2026-02-04 15:48:29
Also in:
imx, linux-watchdog, lkml
On Wed, Feb 04, 2026 at 12:35:01AM +0000, Peng Fan wrote:
quoted
Subject: Re: [PATCH] watchdog: imx7ulp_wdt: Keep WDOG running until A55 enters WFI on i.MX94 On Tue, Feb 03, 2026 at 04:05:47PM +0800, Peng Fan (OSS) wrote:quoted
From: Ranjani Vaidyanathan <redacted> On i.MX94, watchdog sources clock from bus clock that will bealwaysquoted
on during the lifecycle of Linux. There is a Low Power Clock Gating(LPCG) between the bus clock and watchdog, but the LPCG isnotquoted
exported for software to control, it is hardware automatically controlled. When Cortex-A55 executes WFI during suspend flow, the LPCG will automatically gate off the clock stop watchdog. So watchdog could always be alive to protect Linux, until WFI isexecuted. suppose only after suspend's WFI? suppose CPUIDLE's WFI doesn't affect it?Only suspend WFI.
Thank you clarify, sugggest rephrase this to avoid confuse. "WFI" is easily miss leading for CPUIDLE's WFI. "until core halt" ? Frank
Regards Peng.quoted
Frankquoted
Introduce a new hardware feature flag to indicate CPU low-power-modequoted
auto clock gating support, and use it to avoid stopping the watchdog during suspend when LPCG can safely keep it running. Add i.MX94-specific watchdog hardware data and DT compatibleentry toquoted
enable this behavior. Signed-off-by: Ranjani Vaidyanathan[off-list ref]quoted
[peng.fan@nxp.com: rewrite commit log for clarity] Signed-off-by: Peng Fan <peng.fan@nxp.com> --- drivers/watchdog/imx7ulp_wdt.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)diff --git a/drivers/watchdog/imx7ulp_wdt.cb/drivers/watchdog/imx7ulp_wdt.c index03479110453ce78a6a89ce8d351ba9ece2f5e2c5..0ae4c0c00138e8985 4f14edca0fdquoted
5fa84591c2d2 100644--- a/drivers/watchdog/imx7ulp_wdt.c +++ b/drivers/watchdog/imx7ulp_wdt.c@@ -56,6 +56,7 @@ MODULE_PARM_DESC(nowayout, "Watchdogcannot be stopped once started (default="quoted
struct imx_wdt_hw_feature { bool prescaler_enable; bool post_rcs_wait; + bool cpu_lpm_auto_cg; u32 wdog_clock_rate; };@@ -360,7 +361,8 @@ static int __maybe_unusedimx7ulp_wdt_suspend_noirq(struct device *dev) { struct imx7ulp_wdt_device *imx7ulp_wdt =dev_get_drvdata(dev);quoted
- if (watchdog_active(&imx7ulp_wdt->wdd)) + + if (watchdog_active(&imx7ulp_wdt->wdd) && +!imx7ulp_wdt->hw->cpu_lpm_auto_cg) imx7ulp_wdt_stop(&imx7ulp_wdt->wdd); clk_disable_unprepare(imx7ulp_wdt->clk);@@ -408,10 +410,17 @@ static const struct imx_wdt_hw_featureimx93_wdt_hw = {quoted
.wdog_clock_rate = 125, }; +static const struct imx_wdt_hw_feature imx94_wdt_hw = { + .prescaler_enable = true, + .wdog_clock_rate = 125, + .cpu_lpm_auto_cg = true, +}; + static const struct of_device_id imx7ulp_wdt_dt_ids[] = { { .compatible = "fsl,imx7ulp-wdt", .data = &imx7ulp_wdt_hw, }, { .compatible = "fsl,imx8ulp-wdt", .data = &imx8ulp_wdt_hw, }, { .compatible = "fsl,imx93-wdt", .data = &imx93_wdt_hw, }, + { .compatible = "fsl,imx94-wdt", .data = &imx94_wdt_hw, }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, imx7ulp_wdt_dt_ids); --- base-commit: 193579fe01389bc21aff0051d13f24e8ea95b47d change-id: 20260203-imx94-wdog-1e0aa14d661b Best regards, -- Peng Fan [off-list ref]