diff mbox series

[2/3] watchdog: omap_wdt: Fix WDT reloading

Message ID 20200124044425.469550-2-marex@denx.de
State Accepted, archived
Commit 11c1af60b5c779be780d105fd33232282d30b5b6
Delegated to: Lokesh Vutla
Headers show
Series [1/3] watchdog: omap_wdt: Fix WDT timeout configuration | expand

Commit Message

Marek Vasut Jan. 24, 2020, 4:44 a.m. UTC
The watchdog timer value was never updated in the hardware by this
driver, so the watchdog triggered on some random stale value that
was left in the hardware. The TI SPRUH37C says, quote:

  20.4.3.9 Modifying Timer Count/Load Values and Prescaler Setting
  ...
  After a write access, the load register value and prescaler ratio
  registers are updated immediately, but new values are considered
  only after the next consecutive counter overflow or after a new
  trigger command (the WDT_WTGR register).

This means at least one trigger must happen. The driver probably
depended on someone calling it's .reset() callback, however that
is not guaranteed e.g. if the WDT operates without servicing.

Add this missing trigger.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Grygorii Strashko <grygorii.strashko@ti.com>
Cc: Sam Protsenko <semen.protsenko@linaro.org>
Cc: Suniel Mahesh <sunil.m@techveda.org>
---
 drivers/watchdog/omap_wdt.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Lokesh Vutla Feb. 3, 2020, 2:26 p.m. UTC | #1
On 24/01/20 10:14 AM, Marek Vasut wrote:
> The watchdog timer value was never updated in the hardware by this
> driver, so the watchdog triggered on some random stale value that
> was left in the hardware. The TI SPRUH37C says, quote:
> 
>   20.4.3.9 Modifying Timer Count/Load Values and Prescaler Setting
>   ...
>   After a write access, the load register value and prescaler ratio
>   registers are updated immediately, but new values are considered
>   only after the next consecutive counter overflow or after a new
>   trigger command (the WDT_WTGR register).
> 
> This means at least one trigger must happen. The driver probably
> depended on someone calling it's .reset() callback, however that
> is not guaranteed e.g. if the WDT operates without servicing.
> 
> Add this missing trigger.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Grygorii Strashko <grygorii.strashko@ti.com>
> Cc: Sam Protsenko <semen.protsenko@linaro.org>
> Cc: Suniel Mahesh <sunil.m@techveda.org>

Reviewed-by: Lokesh Vutla <lokeshvutla@ti.com>

Thanks and regards,
Lokesh
diff mbox series

Patch

diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c
index b9cdf70036..85425ca505 100644
--- a/drivers/watchdog/omap_wdt.c
+++ b/drivers/watchdog/omap_wdt.c
@@ -219,6 +219,16 @@  static int omap3_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
 	while ((readl(&priv->regs->wdtwwps)) & WDT_WWPS_PEND_WSPR)
 		;
 
+	/* Trigger the watchdog to actually reload the counter. */
+	while ((readl(&priv->regs->wdtwwps)) & WDT_WWPS_PEND_WTGR)
+		;
+
+	priv->wdt_trgr_pattern = ~(priv->wdt_trgr_pattern);
+	writel(priv->wdt_trgr_pattern, &priv->regs->wdtwtgr);
+
+	while ((readl(&priv->regs->wdtwwps)) & WDT_WWPS_PEND_WTGR)
+		;
+
 	return 0;
 }