rtc: pcf2127: handle boot-enabled watchdog feature
authorMartin Hundebøll <martin@geanix.com>
Mon, 21 Oct 2019 08:08:38 +0000 (10:08 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Mon, 21 Oct 2019 08:24:18 +0000 (10:24 +0200)
Linux should handle when the pcf2127 watchdog feature is enabled by the
bootloader. This is done by checking the watchdog timer value during
init, and set the WDOG_HW_RUNNING flag if the value differs from zero.

Signed-off-by: Martin Hundebøll <martin@geanix.com>
Acked-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20191021080838.2789-1-martin@geanix.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-pcf2127.c

index 02b069c..ba5baac 100644 (file)
@@ -417,6 +417,7 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
                        const char *name, bool has_nvmem)
 {
        struct pcf2127 *pcf2127;
+       u32 wdd_timeout;
        int ret = 0;
 
        dev_dbg(dev, "%s\n", __func__);
@@ -459,7 +460,6 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
        /*
         * Watchdog timer enabled and reset pin /RST activated when timed out.
         * Select 1Hz clock source for watchdog timer.
-        * Timer is not started until WD_VAL is loaded with a valid value.
         * Note: Countdown timer disabled and not available.
         */
        ret = regmap_update_bits(pcf2127->regmap, PCF2127_REG_WD_CTL,
@@ -475,6 +475,14 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
                return ret;
        }
 
+       /* Test if watchdog timer is started by bootloader */
+       ret = regmap_read(pcf2127->regmap, PCF2127_REG_WD_VAL, &wdd_timeout);
+       if (ret)
+               return ret;
+
+       if (wdd_timeout)
+               set_bit(WDOG_HW_RUNNING, &pcf2127->wdd.status);
+
 #ifdef CONFIG_WATCHDOG
        ret = devm_watchdog_register_device(dev, &pcf2127->wdd);
        if (ret)