lkml.org 
[lkml]   [2020]   [Jun]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 2/2] watchdog: rti: tweak min_hw_heartbeat_ms to match initial allowed window
Date
If the RTI watchdog has been started by someone (like bootloader) when
the driver probes, we must adjust the initial ping timeout to match the
currently running watchdog window to avoid generating watchdog reset.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
---
drivers/watchdog/rti_wdt.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)

diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
index d456dd72d99a..02ea2b2435f5 100644
--- a/drivers/watchdog/rti_wdt.c
+++ b/drivers/watchdog/rti_wdt.c
@@ -55,11 +55,13 @@ static int heartbeat;
* @base - base io address of WD device
* @freq - source clock frequency of WDT
* @wdd - hold watchdog device as is in WDT core
+ * @min_hw_heartbeat_save - save of the min hw heartbeat value
*/
struct rti_wdt_device {
void __iomem *base;
unsigned long freq;
struct watchdog_device wdd;
+ unsigned int min_hw_heartbeat_save;
};

static int rti_wdt_start(struct watchdog_device *wdd)
@@ -107,6 +109,11 @@ static int rti_wdt_ping(struct watchdog_device *wdd)
/* put watchdog in active state */
writel_relaxed(WDKEY_SEQ1, wdt->base + RTIWDKEY);

+ if (wdt->min_hw_heartbeat_save) {
+ wdd->min_hw_heartbeat_ms = wdt->min_hw_heartbeat_save;
+ wdt->min_hw_heartbeat_save = 0;
+ }
+
return 0;
}

@@ -201,6 +208,24 @@ static int rti_wdt_probe(struct platform_device *pdev)
goto err_iomap;
}

+ if (readl(wdt->base + RTIDWDCTRL) == WDENABLE_KEY) {
+ u32 time_left;
+ u32 heartbeat;
+
+ set_bit(WDOG_HW_RUNNING, &wdd->status);
+ time_left = rti_wdt_get_timeleft(wdd);
+ heartbeat = readl(wdt->base + RTIDWDPRLD);
+ heartbeat <<= WDT_PRELOAD_SHIFT;
+ heartbeat /= wdt->freq;
+ if (time_left < heartbeat / 2)
+ wdd->min_hw_heartbeat_ms = 0;
+ else
+ wdd->min_hw_heartbeat_ms =
+ (time_left - heartbeat / 2 + 1) * 1000;
+
+ wdt->min_hw_heartbeat_save = 11 * heartbeat * 1000 / 20;
+ }
+
ret = watchdog_register_device(wdd);
if (ret) {
dev_err(dev, "cannot register watchdog device\n");
--
2.17.1
--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

\
 
 \ /
  Last update: 2020-06-24 13:48    [W:0.077 / U:1.428 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site