Commit 52c4d051 authored by Ye Li's avatar Ye Li Committed by Wim Van Sebroeck
Browse files

watchdog: imx7ulp_wdt: Fix RCS timeout issue



According to measure on i.MX7ULP and i.MX8ULP, the RCS done needs
about 3400us and 6700us respectively. So current 20us timeout is
not enough. When reconfiguring is on-going, unlock and configure CS
will lead to unknown result.

Increase the wait timeout value to 10ms and check the return value
of RCS wait to fix the issue

Signed-off-by: default avatarYe Li <ye.li@nxp.com>
Signed-off-by: default avatarAlice Guo <alice.guo@nxp.com>
Reviewed-by: default avatarJacky Bai <ping.bai@nxp.com>
Acked-by: default avatarJason Liu <jason.hui.liu@nxp.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20220825083256.14565-5-alice.guo@oss.nxp.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
parent e809daec
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@
#define DEFAULT_TIMEOUT	60
#define MAX_TIMEOUT	128
#define WDOG_CLOCK_RATE	1000
#define WDOG_WAIT_TIMEOUT	20
#define WDOG_WAIT_TIMEOUT	10000

static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0000);
@@ -80,7 +80,7 @@ static int imx7ulp_wdt_enable(struct watchdog_device *wdog, bool enable)
		writel(val | WDOG_CS_EN, wdt->base + WDOG_CS);
	else
		writel(val & ~WDOG_CS_EN, wdt->base + WDOG_CS);
	imx7ulp_wdt_wait(wdt->base, WDOG_CS_RCS);
	ret = imx7ulp_wdt_wait(wdt->base, WDOG_CS_RCS);

enable_out:
	local_irq_enable();
@@ -127,7 +127,9 @@ static int imx7ulp_wdt_set_timeout(struct watchdog_device *wdog,
	if (ret)
		goto timeout_out;
	writel(val, wdt->base + WDOG_TOVAL);
	imx7ulp_wdt_wait(wdt->base, WDOG_CS_RCS);
	ret = imx7ulp_wdt_wait(wdt->base, WDOG_CS_RCS);
	if (ret)
		goto timeout_out;

	wdog->timeout = timeout;