On 4/21/21 8:46 PM, 王擎 wrote: > >> On 4/21/21 7:45 PM, Wang Qing wrote: >>> Use the bark interrupt as the pretimeout notifier if available. >>> >>> When the watchdog timer expires in dual mode, an interrupt will be >>> triggered first, then the timing restarts. The reset signal will be >>> initiated when the timer expires again. >>> >>> The pretimeout notification shall occur at timeout-sec/2. >>> >>> V2: >>> - panic() by default if WATCHDOG_PRETIMEOUT_GOV is not enabled. >>> >>> V3: >>> - Modify the pretimeout behavior, manually reset after the pretimeout >>> - is processed and wait until timeout. >>> >>> V4: >>> - Remove pretimeout related processing. >>> - Add dual mode control separately. >>> >>> V5: >>> - Fix some formatting and printing problems. >>> >>> V6: >>> - Realize pretimeout processing through dualmode. >>> >>> Signed-off-by: Wang Qing <wangqing@xxxxxxxx> >>> --- >>> drivers/watchdog/mtk_wdt.c | 53 +++++++++++++++++++++++++++++++++++++++++----- >>> 1 file changed, 48 insertions(+), 5 deletions(-) >>> >>> diff --git a/drivers/watchdog/mtk_wdt.c b/drivers/watchdog/mtk_wdt.c >>> index 97ca993..ebc648b >>> --- a/drivers/watchdog/mtk_wdt.c >>> +++ b/drivers/watchdog/mtk_wdt.c >>> @@ -25,6 +25,7 @@ >>> #include <linux/reset-controller.h> >>> #include <linux/types.h> >>> #include <linux/watchdog.h> >>> +#include <linux/interrupt.h> >>> >>> #define WDT_MAX_TIMEOUT 31 >>> #define WDT_MIN_TIMEOUT 1 >>> @@ -184,15 +185,22 @@ static int mtk_wdt_set_timeout(struct watchdog_device *wdt_dev, >>> { >>> struct mtk_wdt_dev *mtk_wdt = watchdog_get_drvdata(wdt_dev); >>> void __iomem *wdt_base = mtk_wdt->wdt_base; >>> + unsigned int timeout_interval; >>> u32 reg; >>> >>> - wdt_dev->timeout = timeout; >>> + timeout_interval = wdt_dev->timeout = timeout; >>> + /* >>> + * In dual mode, irq will be triggered at timeout/2 >>> + * the real timeout occurs at timeout >>> + */ >>> + if (wdt_dev->pretimeout) >>> + timeout_interval = wdt_dev->pretimeout = timeout/2; >> >> Please run checkpatch --strict and fix what it reports. >> Also, there should be a set_pretimeout function to set the >> pretimeout. It is ok to update it here, but it should be set >> in its own function to make sure that the actual value >> is reported back to userspace. >> >> Thanks, >> Guenter > > The reason why the set_pretimeout interface is not provided is > because the pretimeout is fixed after the timeout is set, we need > to modify timeout after setting pretimeout, which is puzzling. > What you need to do is to set pretimeout = timeout / 2 if a pretimeout is set to a value != 0. Just like we adjust timeout to valid values when set, we adjust pretimeout as well. I don't see a problem with that. Guenter