Hello all,

just found out, that since patch:

commit 1473f6ac882fde8078826ca828aa3494ff98bf08
Author: Prasanthi Chellakumar <prasanthi.chellaku...@microchip.com>
Date:   Tue Oct 9 11:46:40 2018 -0700

    arm: at91: wdt: Convert watchdog driver to dm/dt

    Convert the Watchdog driver for AT91SAM9x processors to support
    the driver model and device tree. Changes "CONFIG_AT91SAM9_WATCHDOG"
    to new "CONFIG_WDT_AT91" Kconfig option.

    Signed-off-by: Prasanthi Chellakumar <prasanthi.chellaku...@microchip.com>

wdt always triggers really fast on smartweb and taurus board...

A fast look into it, and I see, that at91_wdt_probe() seems not called.

Prasanthi already mentioned to me (offlist), to add

#include <wdt.h>

static struct udevice *watchdog_dev;

#ifdef CONFIG_WDT_AT91
         if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) {
                 printf("Cannot find watchdog!\n");
         } else {
                 printf("Enabling Watchdog\n");
                 wdt_start(watchdog_dev, 15, 0);
         }
#endif

into board code. With this patch at91_wdt_probe() is called now.

Digging deeper in it and it seems there are more things broken:

http://git.denx.de/?p=u-boot.git;a=blob;f=drivers/watchdog/at91sam9_wdt.c;h=13f8772e4130ac1e273c920d211eefc4491f5eff;hb=ee168783ae889cf449cee36cc1e51e108a210ed4#l48

timeout_s in at91_wdt_start() is assumed in seconds, but wdt_start in 
include/wdt.h
states the timeout is in milliseconds :-(

So code goes into the if:

        if (timeout_s > WDT_MAX_TIMEOUT || timeout_s < WDT_MIN_TIMEOUT)
                 timeout = priv->timeout;

and sets timeout new, but never converts the new value with WDT_SEC2TICKS()
macro, so the wrong value is written into AT91_WDT_MR ... following
patch fixes this:

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index 81f448322d..c67bed705f 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -48,11 +48,12 @@ struct at91_wdt_priv {
 static int at91_wdt_start(struct udevice *dev, u64 timeout_s, ulong flags)
 {
        struct at91_wdt_priv *priv = dev_get_priv(dev);
-       u32 timeout = WDT_SEC2TICKS(timeout_s);
+       u32 timeout;

        if (timeout_s > WDT_MAX_TIMEOUT || timeout_s < WDT_MIN_TIMEOUT)
-               timeout = priv->timeout;
+               timeout_s = priv->timeout;

+       timeout = WDT_SEC2TICKS(timeout_s);
        /* Check if disabled */
        if (readl(priv->regs + AT91_WDT_MR) & AT91_WDT_MR_WDDIS) {
                printf("sorry, watchdog is disabled\n");

With this 2 patches, same value as before commit 1473f6ac882fd is written
into AT91_WDT_MR now ... but board reset thorugh WDT still remains ...

Seems with DM_WDT support, wdt reset() gets not called ...

Any ideas where to look at ?

And is it really necessary to call wdt_start() from board code to
start wdt ? DTS entries for wdt seem correct to me.

Thanks!

bye,
Heiko
--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to