[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aYI3ZYYSfI1Gt1RT@lizhi-Precision-Tower-5810>
Date: Tue, 3 Feb 2026 12:59:01 -0500
From: Frank Li <Frank.li@....com>
To: "Peng Fan (OSS)" <peng.fan@....nxp.com>
Cc: Wim Van Sebroeck <wim@...ux-watchdog.org>,
Guenter Roeck <linux@...ck-us.net>,
Sascha Hauer <s.hauer@...gutronix.de>,
Pengutronix Kernel Team <kernel@...gutronix.de>,
Fabio Estevam <festevam@...il.com>, linux-watchdog@...r.kernel.org,
imx@...ts.linux.dev, linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org,
Ranjani Vaidyanathan <ranjani.vaidyanathan@....com>,
Peng Fan <peng.fan@....com>
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@....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?
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@....com>
> [peng.fan@....com: rewrite commit log for clarity]
> Signed-off-by: Peng Fan <peng.fan@....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..0ae4c0c00138e89854f14edca0fd5fa84591c2d2 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@....com>
>
Powered by blists - more mailing lists