watchdog: rti_wdt: Set min_hw_heartbeat_ms to accommodate a safety margin
commit cae58516534e110f4a8558d48aa4435e15519121 upstream.
On AM62x, the watchdog is pet before the valid window is open. Fix
min_hw_heartbeat and accommodate a 2% + static offset safety margin.
The static offset accounts for max hardware error.
Remove the hack in the driver which shifts the open window boundary,
since it is no longer necessary due to the fix mentioned above.
cc: stable@vger.kernel.org
Fixes: 5527483f8f
("watchdog: rti-wdt: attach to running watchdog during probe")
Signed-off-by: Judith Mendez <jm@ti.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20240417205700.3947408-1-jm@ti.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7669752383
commit
8b732150f2
|
@ -59,6 +59,8 @@
|
||||||
#define PON_REASON_EOF_NUM 0xCCCCBBBB
|
#define PON_REASON_EOF_NUM 0xCCCCBBBB
|
||||||
#define RESERVED_MEM_MIN_SIZE 12
|
#define RESERVED_MEM_MIN_SIZE 12
|
||||||
|
|
||||||
|
#define MAX_HW_ERROR 250
|
||||||
|
|
||||||
static int heartbeat = DEFAULT_HEARTBEAT;
|
static int heartbeat = DEFAULT_HEARTBEAT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -97,7 +99,7 @@ static int rti_wdt_start(struct watchdog_device *wdd)
|
||||||
* to be 50% or less than that; we obviouly want to configure the open
|
* to be 50% or less than that; we obviouly want to configure the open
|
||||||
* window as large as possible so we select the 50% option.
|
* window as large as possible so we select the 50% option.
|
||||||
*/
|
*/
|
||||||
wdd->min_hw_heartbeat_ms = 500 * wdd->timeout;
|
wdd->min_hw_heartbeat_ms = 520 * wdd->timeout + MAX_HW_ERROR;
|
||||||
|
|
||||||
/* Generate NMI when wdt expires */
|
/* Generate NMI when wdt expires */
|
||||||
writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL);
|
writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL);
|
||||||
|
@ -131,31 +133,33 @@ static int rti_wdt_setup_hw_hb(struct watchdog_device *wdd, u32 wsize)
|
||||||
* be petted during the open window; not too early or not too late.
|
* be petted during the open window; not too early or not too late.
|
||||||
* The HW configuration options only allow for the open window size
|
* The HW configuration options only allow for the open window size
|
||||||
* to be 50% or less than that.
|
* to be 50% or less than that.
|
||||||
|
* To avoid any glitches, we accommodate 2% + max hardware error
|
||||||
|
* safety margin.
|
||||||
*/
|
*/
|
||||||
switch (wsize) {
|
switch (wsize) {
|
||||||
case RTIWWDSIZE_50P:
|
case RTIWWDSIZE_50P:
|
||||||
/* 50% open window => 50% min heartbeat */
|
/* 50% open window => 52% min heartbeat */
|
||||||
wdd->min_hw_heartbeat_ms = 500 * heartbeat;
|
wdd->min_hw_heartbeat_ms = 520 * heartbeat + MAX_HW_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTIWWDSIZE_25P:
|
case RTIWWDSIZE_25P:
|
||||||
/* 25% open window => 75% min heartbeat */
|
/* 25% open window => 77% min heartbeat */
|
||||||
wdd->min_hw_heartbeat_ms = 750 * heartbeat;
|
wdd->min_hw_heartbeat_ms = 770 * heartbeat + MAX_HW_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTIWWDSIZE_12P5:
|
case RTIWWDSIZE_12P5:
|
||||||
/* 12.5% open window => 87.5% min heartbeat */
|
/* 12.5% open window => 89.5% min heartbeat */
|
||||||
wdd->min_hw_heartbeat_ms = 875 * heartbeat;
|
wdd->min_hw_heartbeat_ms = 895 * heartbeat + MAX_HW_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTIWWDSIZE_6P25:
|
case RTIWWDSIZE_6P25:
|
||||||
/* 6.5% open window => 93.5% min heartbeat */
|
/* 6.5% open window => 95.5% min heartbeat */
|
||||||
wdd->min_hw_heartbeat_ms = 935 * heartbeat;
|
wdd->min_hw_heartbeat_ms = 955 * heartbeat + MAX_HW_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTIWWDSIZE_3P125:
|
case RTIWWDSIZE_3P125:
|
||||||
/* 3.125% open window => 96.9% min heartbeat */
|
/* 3.125% open window => 98.9% min heartbeat */
|
||||||
wdd->min_hw_heartbeat_ms = 969 * heartbeat;
|
wdd->min_hw_heartbeat_ms = 989 * heartbeat + MAX_HW_ERROR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -233,14 +237,6 @@ static int rti_wdt_probe(struct platform_device *pdev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* If watchdog is running at 32k clock, it is not accurate.
|
|
||||||
* Adjust frequency down in this case so that we don't pet
|
|
||||||
* the watchdog too often.
|
|
||||||
*/
|
|
||||||
if (wdt->freq < 32768)
|
|
||||||
wdt->freq = wdt->freq * 9 / 10;
|
|
||||||
|
|
||||||
pm_runtime_enable(dev);
|
pm_runtime_enable(dev);
|
||||||
ret = pm_runtime_resume_and_get(dev);
|
ret = pm_runtime_resume_and_get(dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
Loading…
Reference in New Issue