[PATCH] watchdog: imx7ulp_wdt: Keep WDOG running until A55 enters WFI on i.MX94
Peng Fan
peng.fan at nxp.com
Tue Feb 3 16:35:01 PST 2026
> 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:
> > From: Ranjani Vaidyanathan <ranjani.vaidyanathan at nxp.com>
> >
> > On i.MX94, watchdog sources clock from bus clock that will be
> always
> > on during the lifecycle of Linux. There is a Low Power Clock
> > Gating(LPCG) between the bus clock and watchdog, but the LPCG is
> not
> > 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 is
> executed.
>
> suppose only after suspend's WFI? suppose CPUIDLE's WFI doesn't
> affect it?
Only suspend WFI.
Regards
Peng.
>
> Frank
> >
> > Introduce a new hardware feature flag to indicate CPU low-power-
> mode
> > 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 compatible
> entry to
> > enable this behavior.
> >
> > Signed-off-by: Ranjani Vaidyanathan
> <ranjani.vaidyanathan at nxp.com>
> > [peng.fan at nxp.com: rewrite commit log for clarity]
> > Signed-off-by: Peng Fan <peng.fan at nxp.com>
> > ---
> > drivers/watchdog/imx7ulp_wdt.c | 11 ++++++++++-
> > 1 file changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/watchdog/imx7ulp_wdt.c
> > b/drivers/watchdog/imx7ulp_wdt.c index
> >
> 03479110453ce78a6a89ce8d351ba9ece2f5e2c5..0ae4c0c00138e8985
> 4f14edca0fd
> > 5fa84591c2d2 100644
> > --- a/drivers/watchdog/imx7ulp_wdt.c
> > +++ b/drivers/watchdog/imx7ulp_wdt.c
> > @@ -56,6 +56,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog
> cannot be stopped once started (default="
> > 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_unused
> > imx7ulp_wdt_suspend_noirq(struct device *dev) {
> > struct imx7ulp_wdt_device *imx7ulp_wdt =
> dev_get_drvdata(dev);
> >
> > - 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_feature
> imx93_wdt_hw = {
> > .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 <peng.fan at nxp.com>
> >
More information about the linux-arm-kernel
mailing list