watchdog: w83627hf_wdt: add bootstatus support
authorHenning Schild <henning.schild@siemens.com>
Wed, 24 Aug 2022 15:24:48 +0000 (17:24 +0200)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Sun, 2 Oct 2022 10:55:34 +0000 (12:55 +0200)
The status bit in the status and control register can tell us whether
the last reboot was caused by the watchdog. Make sure to take that into
the bootstatus before clearing it.

Signed-off-by: Henning Schild <henning.schild@siemens.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20220824152448.7736-1-henning.schild@siemens.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
drivers/watchdog/w83627hf_wdt.c

index 56a4a4030ca9650b902f8ac55511b3c71ff4c6a5..bc33b63c5a5df2f2d061c7dd2cd61e50a80a35b6 100644 (file)
@@ -113,6 +113,10 @@ MODULE_PARM_DESC(early_disable, "Disable watchdog at boot time (default=0)");
 #define W836X7HF_WDT_CSR       0xf7
 #define NCT6102D_WDT_CSR       0xf2
 
+#define WDT_CSR_STATUS         0x10
+#define WDT_CSR_KBD            0x40
+#define WDT_CSR_MOUSE          0x80
+
 static void superio_outb(int reg, int val)
 {
        outb(reg, WDT_EFER);
@@ -244,8 +248,12 @@ static int w83627hf_init(struct watchdog_device *wdog, enum chips chip)
        t = superio_inb(cr_wdt_control) & ~0x0C;
        superio_outb(cr_wdt_control, t);
 
-       /* reset trigger, disable keyboard & mouse turning off watchdog */
-       t = superio_inb(cr_wdt_csr) & ~0xD0;
+       t = superio_inb(cr_wdt_csr);
+       if (t & WDT_CSR_STATUS)
+               wdog->bootstatus |= WDIOF_CARDRESET;
+
+       /* reset status, disable keyboard & mouse turning off watchdog */
+       t &= ~(WDT_CSR_STATUS | WDT_CSR_KBD | WDT_CSR_MOUSE);
        superio_outb(cr_wdt_csr, t);
 
        superio_exit();