[PATCH] watchdog: imx: Support set timeout by wdt command

Stefano Babic sbabic at denx.de
Thu Jul 16 11:07:36 CEST 2020


On 01.07.20 11:15, Mo, Yuezhang wrote:
> After "4b969deac0 watchdog: imx: Add DM support", the imx watchdog
> can be started by wdt command. But the imx watchdog driver only
> support start with the default timeout.
> 
> This commit adds the support for setting the timeout which pass from
> the wdt command into the imx watchdog. If the timeout out of the
> valid range(0.5~128s), start the watchdog with a timeout within the
> valid range and the timeout is the one which closest to the passed
> timeout.
> 

Thanks, it looks useful to me.

> Signed-off-by: Yuezhang.Mo <yuezhang.mo at sony.com>
> Reviewed-by: Andy.Wu <Andy.Wu at sony.com>
> ---
>  drivers/watchdog/imx_watchdog.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/watchdog/imx_watchdog.c b/drivers/watchdog/imx_watchdog.c
> index 01762df019..b90c2daece 100644
> --- a/drivers/watchdog/imx_watchdog.c
> +++ b/drivers/watchdog/imx_watchdog.c
> @@ -16,6 +16,10 @@
>  #include <asm/arch/immap_lsch2.h>
>  #endif
>  #include <fsl_wdog.h>
> +#include <div64.h>
> +
> +#define TIMEOUT_MAX	128000
> +#define TIMEOUT_MIN	500
>  
>  static void imx_watchdog_expire_now(struct watchdog_regs *wdog, bool ext_reset)
>  {
> @@ -57,9 +61,9 @@ static void imx_watchdog_reset(struct watchdog_regs *wdog)
>  #endif /* CONFIG_WATCHDOG_RESET_DISABLE*/
>  }
>  
> -static void imx_watchdog_init(struct watchdog_regs *wdog, bool ext_reset)
> +static void imx_watchdog_init(struct watchdog_regs *wdog, bool ext_reset,
> +			      u64 timeout)
>  {
> -	u16 timeout;
>  	u16 wcr;
>  
>  	/*
> @@ -70,7 +74,11 @@ static void imx_watchdog_init(struct watchdog_regs *wdog, bool ext_reset)
>  #ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS
>  #define CONFIG_WATCHDOG_TIMEOUT_MSECS 128000
>  #endif
> -	timeout = (CONFIG_WATCHDOG_TIMEOUT_MSECS / 500) - 1;
> +
> +	timeout = max_t(u64, timeout, TIMEOUT_MIN);
> +	timeout = min_t(u64, timeout, TIMEOUT_MAX);
> +	timeout = lldiv(timeout, 500) - 1;
> +
>  #ifdef CONFIG_FSL_LSCH2
>  	wcr = (WCR_WDA | WCR_SRS | WCR_WDE) << 8 | timeout;
>  #else
> @@ -95,7 +103,7 @@ void hw_watchdog_init(void)
>  {
>  	struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
>  
> -	imx_watchdog_init(wdog, true);
> +	imx_watchdog_init(wdog, true, CONFIG_WATCHDOG_TIMEOUT_MSECS);
>  }
>  #else
>  struct imx_wdt_priv {
> @@ -126,7 +134,7 @@ static int imx_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
>  {
>  	struct imx_wdt_priv *priv = dev_get_priv(dev);
>  
> -	imx_watchdog_init(priv->base, priv->ext_reset);
> +	imx_watchdog_init(priv->base, priv->ext_reset, timeout);
>  
>  	return 0;
>  }
> 

Reviewed-by: stefano Babic <sbabic at denx.de>

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list