Message ID | HK2PR04MB3891530A4E72D306E14F19A5816C0@HK2PR04MB3891.apcprd04.prod.outlook.com |
---|---|
State | Accepted |
Commit | ee6866e6c773341ad4058d46ff898ad258db1292 |
Delegated to: | Stefano Babic |
Headers | show |
Series | watchdog: imx: Support set timeout by wdt command | expand |
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@sony.com> > Reviewed-by: Andy.Wu <Andy.Wu@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@denx.de> Best regards, Stefano Babic
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; }