| From 748177579c5e566ddb4a3e9d9c9c3e243c6a5e68 Mon Sep 17 00:00:00 2001 |
| From: Ahmad Fatoum <a.fatoum@pengutronix.de> |
| Date: Thu, 11 Jun 2020 21:17:45 +0200 |
| Subject: [PATCH] watchdog: f71808e_wdt: clear watchdog timeout occurred flag |
| |
| commit 4f39d575844148fbf3081571a1f3b4ae04150958 upstream. |
| |
| The flag indicating a watchdog timeout having occurred normally persists |
| till Power-On Reset of the Fintek Super I/O chip. The user can clear it |
| by writing a `1' to the bit. |
| |
| The driver doesn't offer a restart method, so regular system reboot |
| might not reset the Super I/O and if the watchdog isn't enabled, we |
| won't touch the register containing the bit on the next boot. |
| In this case all subsequent regular reboots will be wrongly flagged |
| by the driver as being caused by the watchdog. |
| |
| Fix this by having the flag cleared after read. This is also done by |
| other drivers like those for the i6300esb and mpc8xxx_wdt. |
| |
| Fixes: b97cb21a4634 ("watchdog: f71808e_wdt: Fix WDTMOUT_STS register read") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Link: https://lore.kernel.org/r/20200611191750.28096-5-a.fatoum@pengutronix.de |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/watchdog/f71808e_wdt.c b/drivers/watchdog/f71808e_wdt.c |
| index 9f7a8f0e54d6..491ba2d973ac 100644 |
| --- a/drivers/watchdog/f71808e_wdt.c |
| +++ b/drivers/watchdog/f71808e_wdt.c |
| @@ -693,6 +693,13 @@ static int __init watchdog_init(int sioaddr) |
| wdt_conf = superio_inb(sioaddr, F71808FG_REG_WDT_CONF); |
| watchdog.caused_reboot = wdt_conf & BIT(F71808FG_FLAG_WDTMOUT_STS); |
| |
| + /* |
| + * We don't want WDTMOUT_STS to stick around till regular reboot. |
| + * Write 1 to the bit to clear it to zero. |
| + */ |
| + superio_outb(sioaddr, F71808FG_REG_WDT_CONF, |
| + wdt_conf | BIT(F71808FG_FLAG_WDTMOUT_STS)); |
| + |
| superio_exit(sioaddr); |
| |
| err = watchdog_set_timeout(timeout); |
| -- |
| 2.27.0 |
| |