watchdog: sp5100-tco: Abort if watchdog is disabled by hardware
authorGuenter Roeck <linux@roeck-us.net>
Sun, 24 Dec 2017 21:04:16 +0000 (13:04 -0800)
committerWim Van Sebroeck <wim@iguana.be>
Sun, 21 Jan 2018 11:56:37 +0000 (12:56 +0100)
If the watchdog control register indicates that the watchdog hardware
is disabled even after we tried to enable it, there is no point to
instantiate the driver.

Cc: Zoltán Böszörményi <zboszor@pr.hu>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/watchdog/sp5100_tco.c
drivers/watchdog/sp5100_tco.h

index bb6c460..23246cb 100644 (file)
@@ -273,14 +273,20 @@ static int sp5100_tco_setupdevice(struct device *dev,
        /* Setup the watchdog timer */
        tco_timer_enable();
 
-       /* Check that the watchdog action is set to reset the system */
        val = readl(SP5100_WDT_CONTROL(tco->tcobase));
+       if (val & SP5100_WDT_DISABLED) {
+               dev_err(dev, "Watchdog hardware is disabled\n");
+               ret = -ENODEV;
+               goto unreg_region;
+       }
+
        /*
         * Save WatchDogFired status, because WatchDogFired flag is
         * cleared here.
         */
        if (val & SP5100_WDT_FIRED)
                wdd->bootstatus = WDIOF_CARDRESET;
+       /* Set watchdog action to reset the system */
        val &= ~SP5100_WDT_ACTION_RESET;
        writel(val, SP5100_WDT_CONTROL(tco->tcobase));
 
index ca0721c..008b209 100644 (file)
@@ -19,6 +19,7 @@
 #define SP5100_WDT_START_STOP_BIT      BIT(0)
 #define SP5100_WDT_FIRED               BIT(1)
 #define SP5100_WDT_ACTION_RESET                BIT(2)
+#define SP5100_WDT_DISABLED            BIT(3)
 #define SP5100_WDT_TRIGGER_BIT         BIT(7)
 
 #define SP5100_PM_IOPORTS_SIZE         0x02