Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1276819

[PATCH (v2) 7/10] watchdog: bcm63xx_wdt: Add get_timeleft function

From "Simon Arlott" <simon@fire.lp0.eu>
Newsgroups linux.kernel
Subject [PATCH (v2) 7/10] watchdog: bcm63xx_wdt: Add get_timeleft function
Date 2015-11-24 23:20 +0100
Message-ID <qyu6o-5EM-27@gated-at.bofh.it> (permalink)
References (2 earlier) <qxo30-2yb-3@gated-at.bofh.it> <qxocG-2BX-5@gated-at.bofh.it> <qxsJj-5JA-1@gated-at.bofh.it> <qxDv3-4PJ-3@gated-at.bofh.it> <qxDv3-4PJ-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Return the remaining time from the hardware control register.

Warn when the device is registered if the hardware watchdog is currently
running and report the remaining time left.

Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
---
Changed "if (timeleft > 0)" to "if (hw->running)" when checking if a
warning should be printed, in case the time left is truncated down to
0 seconds.

 drivers/watchdog/bcm63xx_wdt.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/drivers/watchdog/bcm63xx_wdt.c b/drivers/watchdog/bcm63xx_wdt.c
index 3c7667a..9d099e0 100644
--- a/drivers/watchdog/bcm63xx_wdt.c
+++ b/drivers/watchdog/bcm63xx_wdt.c
@@ -14,6 +14,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
@@ -75,6 +76,19 @@ static int bcm63xx_wdt_stop(struct watchdog_device *wdd)
 	return 0;
 }

+static unsigned int bcm63xx_wdt_get_timeleft(struct watchdog_device *wdd)
+{
+	struct bcm63xx_wdt_hw *hw = watchdog_get_drvdata(wdd);
+	unsigned long flags;
+	u32 val;
+
+	raw_spin_lock_irqsave(&hw->lock, flags);
+	val = __raw_readl(hw->regs + WDT_CTL_REG);
+	val /= hw->clock_hz;
+	raw_spin_unlock_irqrestore(&hw->lock, flags);
+	return val;
+}
+
 static int bcm63xx_wdt_set_timeout(struct watchdog_device *wdd,
 	unsigned int timeout)
 {
@@ -130,6 +144,7 @@ static struct watchdog_ops bcm63xx_wdt_ops = {
 	.owner = THIS_MODULE,
 	.start = bcm63xx_wdt_start,
 	.stop = bcm63xx_wdt_stop,
+	.get_timeleft = bcm63xx_wdt_get_timeleft,
 	.set_timeout = bcm63xx_wdt_set_timeout,
 };

@@ -144,6 +159,8 @@ static int bcm63xx_wdt_probe(struct platform_device *pdev)
 	struct bcm63xx_wdt_hw *hw;
 	struct watchdog_device *wdd;
 	struct resource *r;
+	u32 timeleft1, timeleft2;
+	unsigned int timeleft;
 	int ret;

 	hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL);
@@ -197,6 +214,23 @@ static int bcm63xx_wdt_probe(struct platform_device *pdev)
 	watchdog_init_timeout(wdd, 0, &pdev->dev);
 	watchdog_set_nowayout(wdd, nowayout);

+	/* Compare two reads of the time left value, 2 clock ticks apart */
+	rmb();
+	timeleft1 = __raw_readl(hw->regs + WDT_CTL_REG);
+	udelay(DIV_ROUND_UP(1000000, hw->clock_hz / 2));
+	/* Ensure the register is read twice */
+	rmb();
+	timeleft2 = __raw_readl(hw->regs + WDT_CTL_REG);
+
+	/* If the time left is changing, the watchdog is running */
+	if (timeleft1 != timeleft2) {
+		hw->running = true;
+		timeleft = bcm63xx_wdt_get_timeleft(wdd);
+	} else {
+		hw->running = false;
+		timeleft = 0;
+	}
+
 	ret = bcm63xx_timer_register(TIMER_WDT_ID, bcm63xx_wdt_isr, wdd);
 	if (ret < 0) {
 		dev_err(&pdev->dev, "failed to register wdt timer isr\n");
@@ -214,6 +248,8 @@ static int bcm63xx_wdt_probe(struct platform_device *pdev)
 		dev_name(wdd->dev), hw->regs,
 		wdd->timeout, wdd->max_timeout);

+	if (hw->running)
+		dev_alert(wdd->dev, "running, reboot in %us\n", timeleft);
 	return 0;

 unregister_timer:
@@ -255,6 +291,7 @@ module_platform_driver(bcm63xx_wdt_driver);

 MODULE_AUTHOR("Miguel Gaio <miguel.gaio@efixo.com>");
 MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
+MODULE_AUTHOR("Simon Arlott");
 MODULE_DESCRIPTION("Driver for the Broadcom BCM63xx SoC watchdog");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS("platform:bcm63xx-wdt");
-- 
2.1.4

-- 
Simon Arlott
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 1/4] clocksource: Add brcm,bcm6345-timer device tree binding Simon Arlott <simon@fire.lp0.eu> - 2015-11-21 20:10 +0100
  [PATCH 2/4] MIPS: bmips: Add bcm6345-l2-timer interrupt controller Simon Arlott <simon@fire.lp0.eu> - 2015-11-21 20:10 +0100
  [PATCH 4/4] MIPS: bmips: Convert bcm63xx_wdt to use WATCHDOG_CORE Simon Arlott <simon@fire.lp0.eu> - 2015-11-21 20:10 +0100
    Re: [PATCH 4/4] MIPS: bmips: Convert bcm63xx_wdt to use WATCHDOG_CORE Guenter Roeck <linux@roeck-us.net> - 2015-11-21 22:40 +0100
      Re: [PATCH 4/4] MIPS: bmips: Convert bcm63xx_wdt to use WATCHDOG_CORE Simon Arlott <simon@fire.lp0.eu> - 2015-11-21 22:50 +0100
        Re: [PATCH 4/4] MIPS: bmips: Convert bcm63xx_wdt to use WATCHDOG_CORE Guenter Roeck <linux@roeck-us.net> - 2015-11-22 03:40 +0100
          [PATCH 6/10] watchdog: bcm63xx_wdt: Obtain watchdog clock HZ from  "periph" clk Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:10 +0100
            Re: [PATCH 6/10] watchdog: bcm63xx_wdt: Obtain watchdog clock HZ from  "periph" clk Jonas Gorski <jogo@openwrt.org> - 2015-11-23 16:10 +0100
              Re: [PATCH 6/10] watchdog: bcm63xx_wdt: Obtain watchdog clock HZ  from "periph" clk Florian Fainelli <f.fainelli@gmail.com> - 2015-11-23 19:30 +0100
                Re: [PATCH 6/10] watchdog: bcm63xx_wdt: Obtain watchdog clock HZ from  "periph" clk Simon Arlott <simon@fire.lp0.eu> - 2015-11-23 20:10 +0100
            [PATCH (v2) 6/10] watchdog: bcm63xx_wdt: Obtain watchdog clock HZ  from "periph" clk "Simon Arlott" <simon@fire.lp0.eu> - 2015-11-24 23:20 +0100
              Re: [PATCH (v2) 6/10] watchdog: bcm63xx_wdt: Obtain watchdog clock  HZ from "periph" clk Florian Fainelli <f.fainelli@gmail.com> - 2015-11-24 23:50 +0100
                [PATCH (v3) 6/11] watchdog: bcm63xx_wdt: Obtain watchdog clock HZ  from "periph" clk Simon Arlott <simon@fire.lp0.eu> - 2015-11-25 23:50 +0100
          [PATCH 7/10] watchdog: bcm63xx_wdt: Add get_timeleft function Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:10 +0100
            [PATCH (v2) 7/10] watchdog: bcm63xx_wdt: Add get_timeleft function "Simon Arlott" <simon@fire.lp0.eu> - 2015-11-24 23:20 +0100
              Re: [PATCH (v2) 7/10] watchdog: bcm63xx_wdt: Add get_timeleft function Florian Fainelli <f.fainelli@gmail.com> - 2015-11-24 23:50 +0100
              Re: [PATCH (v2) 7/10] watchdog: bcm63xx_wdt: Add get_timeleft  function Guenter Roeck <linux@roeck-us.net> - 2015-11-25 04:00 +0100
                Re: [PATCH (v2) 7/10] watchdog: bcm63xx_wdt: Add get_timeleft  function Simon Arlott <simon@fire.lp0.eu> - 2015-11-25 09:20 +0100
                [PATCH (v4) 7/11] watchdog: bcm63xx_wdt: Add get_timeleft function Simon Arlott <simon@fire.lp0.eu> - 2015-11-26 00:00 +0100
                [PATCH (v4) 8/11] watchdog: bcm63xx_wdt: Warn if the watchdog is  currently running Simon Arlott <simon@fire.lp0.eu> - 2015-11-26 00:00 +0100
                [PATCH (v3) 7/11] watchdog: bcm63xx_wdt: Add get_timeleft function Simon Arlott <simon@fire.lp0.eu> - 2015-11-26 00:00 +0100
          Re: [PATCH 4/10] (Was: [PATCH 4/4]) MIPS: bmips: Convert bcm63xx_wdt  to use WATCHDOG_CORE Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:10 +0100
            [PATCH 5/10] watchdog: bcm63xx_wdt: Use WATCHDOG_CORE Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:10 +0100
              Re: [PATCH 5/10] watchdog: bcm63xx_wdt: Use WATCHDOG_CORE Guenter Roeck <linux@roeck-us.net> - 2015-11-25 03:50 +0100
                Re: [PATCH 5/10] watchdog: bcm63xx_wdt: Use WATCHDOG_CORE "Simon Arlott" <simon@fire.lp0.eu> - 2015-11-25 14:10 +0100
                Re: [PATCH 5/10] watchdog: bcm63xx_wdt: Use WATCHDOG_CORE Guenter Roeck <linux@roeck-us.net> - 2015-11-25 15:20 +0100
                Re: [PATCH 5/10] watchdog: bcm63xx_wdt: Use WATCHDOG_CORE Simon Arlott <simon@fire.lp0.eu> - 2015-11-25 20:50 +0100
                [PATCH (v3) 5/11] watchdog: bcm63xx_wdt: Use WATCHDOG_CORE Simon Arlott <simon@fire.lp0.eu> - 2015-11-25 23:50 +0100
            [PATCH 4/10] watchdog: bcm63xx_wdt: Handle hardware interrupt and  remove software timer Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:10 +0100
              Re: [PATCH 4/10] watchdog: bcm63xx_wdt: Handle hardware interrupt  and remove software timer Guenter Roeck <linux@roeck-us.net> - 2015-11-24 19:30 +0100
                Re: [PATCH 4/10] watchdog: bcm63xx_wdt: Handle hardware interrupt and  remove software timer Jonas Gorski <jogo@openwrt.org> - 2015-11-25 21:20 +0100
                Re: [PATCH 4/10] watchdog: bcm63xx_wdt: Handle hardware interrupt and  remove software timer Simon Arlott <simon@fire.lp0.eu> - 2015-11-25 21:30 +0100
              [PATCH (v2) 4/10] watchdog: bcm63xx_wdt: Handle hardware interrupt  and remove software timer Simon Arlott <simon@fire.lp0.eu> - 2015-11-25 23:40 +0100
            [PATCH 8/10] watchdog: bcm63xx_wdt: Remove dependency on mach-bcm63xx  functions/defines Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:20 +0100
            [PATCH 10/10] watchdog: bcm63xx_wdt: Use brcm,bcm6345-wdt device tree  binding Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:20 +0100
              [PATCH (v2) 11/11] watchdog: bcm63xx_wdt: Use brcm,bcm6345-wdt device  tree binding Simon Arlott <simon@fire.lp0.eu> - 2015-11-26 00:20 +0100
            [PATCH 9/10] watchdog: bcm63xx_wdt: Use bcm63xx_timer interrupt  directly Simon Arlott <simon@fire.lp0.eu> - 2015-11-22 15:20 +0100
              [PATCH (v2) 10/11] watchdog: bcm63xx_wdt: Use bcm63xx_timer interrupt  directly Simon Arlott <simon@fire.lp0.eu> - 2015-11-26 00:10 +0100
  [PATCH 3/4] watchdog: Add brcm,bcm6345-wdt device tree binding Simon Arlott <simon@fire.lp0.eu> - 2015-11-21 20:10 +0100
    Re: [PATCH 3/4] watchdog: Add brcm,bcm6345-wdt device tree binding Rob Herring <robh@kernel.org> - 2015-11-22 23:20 +0100
  Re: [PATCH 1/4] clocksource: Add brcm,bcm6345-timer device tree  binding Rob Herring <robh@kernel.org> - 2015-11-22 23:20 +0100
  Re: [PATCH 1/4] clocksource: Add brcm,bcm6345-timer device tree binding Jonas Gorski <jogo@openwrt.org> - 2015-11-23 16:40 +0100
    [PATCH (v2) 2/10] MIPS: bmips: Add bcm6345-l2-timer interrupt  controller Simon Arlott <simon@fire.lp0.eu> - 2015-11-23 20:00 +0100
      [PATCH (v3) 2/10] MIPS: bmips: Add bcm6345-l2-timer interrupt  controller "Simon Arlott" <simon@fire.lp0.eu> - 2015-11-24 23:20 +0100
        Re: [PATCH (v3) 2/10] MIPS: bmips: Add bcm6345-l2-timer interrupt  controller Florian Fainelli <f.fainelli@gmail.com> - 2015-11-24 23:40 +0100
          [PATCH (v4) 2/11] MIPS: bmips: Add bcm6345-l2-timer interrupt  controller Simon Arlott <simon@fire.lp0.eu> - 2015-11-26 23:40 +0100
            Re: [PATCH (v4) 2/11] MIPS: bmips: Add bcm6345-l2-timer interrupt  controller Thomas Gleixner <tglx@linutronix.de> - 2015-11-27 09:40 +0100
              [PATCH (v5) 3/11] MIPS: bmips: Add bcm6345-l2-timer interrupt  controller Simon Arlott <simon@fire.lp0.eu> - 2015-11-28 13:30 +0100
    [PATCH (v2) 1/10] clocksource: Add brcm,bcm6345-timer device tree  binding Simon Arlott <simon@fire.lp0.eu> - 2015-11-23 20:00 +0100
      Re: [PATCH (v2) 1/10] clocksource: Add brcm,bcm6345-timer device  tree binding Rob Herring <robh@kernel.org> - 2015-11-25 04:10 +0100

csiph-web