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 <zbos...@pr.hu>
Signed-off-by: Guenter Roeck <li...@roeck-us.net>
---
 drivers/watchdog/sp5100_tco.c | 8 +++++++-
 drivers/watchdog/sp5100_tco.h | 1 +
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/watchdog/sp5100_tco.c b/drivers/watchdog/sp5100_tco.c
index bb6c4608c1c0..23246cb40598 100644
--- a/drivers/watchdog/sp5100_tco.c
+++ b/drivers/watchdog/sp5100_tco.c
@@ -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));
 
diff --git a/drivers/watchdog/sp5100_tco.h b/drivers/watchdog/sp5100_tco.h
index ca0721c8d879..008b2094bd13 100644
--- a/drivers/watchdog/sp5100_tco.h
+++ b/drivers/watchdog/sp5100_tco.h
@@ -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
-- 
2.7.4

Reply via email to