[PATCH] watchdog: rti_wdt: Add 10% safety margin to clock frequency
Stefan Roese
sr at denx.de
Tue Mar 8 10:12:55 CET 2022
On 2/21/22 17:21, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka at siemens.com>
>
> When running against RC_OSC_32k, the watchdog may suffer from running
> faster than expected, expiring earlier. The Linux kernel adds a 10%
> margin to the timeout calculation by slowing down the read clock rate
> accordingly. Do the same here, also to have comparable preset values
> for both drivers.
>
> Along this, fix the name of the local var holding to frequency - in Hz,
> not kHz.
>
> Signed-off-by: Jan Kiszka <jan.kiszka at siemens.com>
Applied to u-boot-watchdog/master
Thanks,
Stefan
> ---
> drivers/watchdog/rti_wdt.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
> index 253286d349b..8d93f19b984 100644
> --- a/drivers/watchdog/rti_wdt.c
> +++ b/drivers/watchdog/rti_wdt.c
> @@ -41,7 +41,7 @@
>
> struct rti_wdt_priv {
> phys_addr_t regs;
> - unsigned int clk_khz;
> + unsigned int clk_hz;
> };
>
> #ifdef CONFIG_WDT_K3_RTI_LOAD_FW
> @@ -139,7 +139,7 @@ static int rti_wdt_start(struct udevice *dev, u64
> timeout_ms, ulong flags)
> if (ret < 0)
> return ret;
>
> - timer_margin = timeout_ms * priv->clk_khz / 1000;
> + timer_margin = timeout_ms * priv->clk_hz / 1000;
> timer_margin >>= WDT_PRELOAD_SHIFT;
> if (timer_margin > WDT_PRELOAD_MAX)
> timer_margin = WDT_PRELOAD_MAX;
> @@ -185,7 +185,15 @@ static int rti_wdt_probe(struct udevice *dev)
> if (ret)
> return ret;
>
> - priv->clk_khz = clk_get_rate(&clk);
> + priv->clk_hz = clk_get_rate(&clk);
> +
> + /*
> + * If watchdog is running at 32k clock, it is not accurate.
> + * Adjust frequency down in this case so that it does not expire
> + * earlier than expected.
> + */
> + if (priv->clk_hz < 32768)
> + priv->clk_hz = priv->clk_hz * 9 / 10;
>
> return 0;
> }
Viele Grüße,
Stefan Roese
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list