Messages in this thread |  | | Subject | Re: [PATCH v2 1/1] drivers: watchdog: stm32_iwdg: set WDOG_HW_RUNNING at probe | | From | Guenter Roeck <> | | Date | Fri, 22 Nov 2019 02:45:49 -0800 |
| |
On 11/22/19 12:24 AM, Christophe Roullier wrote: > If the watchdog hardware is already enabled during the boot process, > when the Linux watchdog driver loads, it should start/reset the watchdog > and tell the watchdog framework. As a result, ping can be generated from > the watchdog framework (if CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is set), > until the userspace watchdog daemon takes over control > > Fixes:4332d113c66a ("watchdog: Add STM32 IWDG driver") > > Signed-off-by: Christophe Roullier <christophe.roullier@st.com> > --- > Changes since v1: > According to Guenter > I follow the guidance from intel-mid_wdt.c > and I added test to check if CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is set > because we need to be flexible (depends on customer config, but watchdog > not always start by bootloader (Uboot, ..)) > I've tested some config and it is working as expected: > Watchdog enable in Uboot + HANDLE_BOOT_ENABLE is not set + daemon watchdog in userland ON ==> No reset IWDG2 > Watchdog enable in Uboot + HANDLE_BOOT_ENABLE is not set ==> Reset IWDG2 > Watchdog enable in Uboot + HANDLE_BOOT_ENABLE=y ==> No reset IWDG2 > Watchdog enable in Uboot + HANDLE_BOOT_ENABLE=y + daemon watchdog in userland ON puis OFF ==> Reset IWDG2 > Watchdog disable in Uboot + HANDLE_BOOT_ENABLE is not set ==> No reset IWDG2 > Watchdog disable in Uboot + HANDLE_BOOT_ENABLE=y ==> No reset IWDG2 > Watchdog disable in Uboot + HANDLE_BOOT_ENABLE=y + daemon watchdog in userland ON ==> No reset IWDG2 > Watchdog disable in Uboot + HANDLE_BOOT_ENABLE=y + daemon watchdog in userland ON puis OFF ==> Reset IWDG2 > > Thanks, > Christophe > > drivers/watchdog/stm32_iwdg.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c > index a3a329011a06..7f454a6e17ba 100644 > --- a/drivers/watchdog/stm32_iwdg.c > +++ b/drivers/watchdog/stm32_iwdg.c > @@ -50,6 +50,9 @@ > #define TIMEOUT_US 100000 > #define SLEEP_US 1000 > > +static bool handle_boot_enabled = > + IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED); > + > struct stm32_iwdg_data { > bool has_pclk; > u32 max_prescaler; > @@ -262,6 +265,24 @@ static int stm32_iwdg_probe(struct platform_device *pdev) > watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT); > watchdog_init_timeout(wdd, 0, dev); > > + /* > + * In case of CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is set > + * (Means U-Boot/bootloaders leaves the watchdog running) > + * When we get here we should make a decision to prevent > + * any side effects before user space daemon will take care of it. > + * The best option, taking into consideration that there is no > + * way to read values back from hardware, is to enforce watchdog > + * being run with deterministic values. > + */ > + if (handle_boot_enabled) {
You don't need that variable. Just use if (IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED)) { directly.
> + ret = stm32_iwdg_start(wdd); > + if (ret) > + return ret; > + > + /* Make sure the watchdog is serviced */ > + set_bit(WDOG_HW_RUNNING, &wdd->status); > + } > + > ret = devm_watchdog_register_device(dev, wdd); > if (ret) > return ret; >
|  |