From fe9f8ca2941e795cd5433c115ec0bd65d4dcf213 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 12 Apr 2014 10:21:04 +0000 Subject: [PATCH] ar71xx: avoid spurious restarts caused by the watchdog on AR934x Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@40465 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...dt-avoid-spurious-restarts-on-AR934x.patch | 48 +++++++++++++++++++ .../611-MIPS-ath79-wdt-timeout.patch | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch diff --git a/target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch b/target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch new file mode 100644 index 0000000000..c7bf06656e --- /dev/null +++ b/target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch @@ -0,0 +1,48 @@ +From 2ff030d44672d745c5327b72463af43f5103e99b Mon Sep 17 00:00:00 2001 +From: Gabor Juhos +Date: Tue, 25 Mar 2014 17:07:46 +0100 +Subject: [PATCH] watchdog: ath79-wdt: avoid spurious restarts on AR934x + +On some AR934x based systems, where the frequency of +the AHB bus is relatively high, the built-in watchdog +causes a spurious restart when it gets enabled. + +The possible cause of these restarts is that the timeout +value written into the TIMER register does not reaches +the hardware in time. + +Add an explicit delay into the ath79_wdt_enable function +to avoid the spurious restarts. + +Signed-off-by: Gabor Juhos +Cc: +--- + drivers/watchdog/ath79_wdt.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/watchdog/ath79_wdt.c ++++ b/drivers/watchdog/ath79_wdt.c +@@ -20,6 +20,7 @@ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + + #include ++#include + #include + #include + #include +@@ -91,6 +92,15 @@ static inline void ath79_wdt_keepalive(v + static inline void ath79_wdt_enable(void) + { + ath79_wdt_keepalive(); ++ ++ /* ++ * Updating the TIMER register requires a few microseconds ++ * on the AR934x SoCs at least. Use a small delay to ensure ++ * that the TIMER register is updated within the hardware ++ * before enabling the watchdog. ++ */ ++ udelay(2); ++ + ath79_wdt_wr(WDOG_REG_CTRL, WDOG_CTRL_ACTION_FCR); + /* flush write */ + ath79_wdt_rr(WDOG_REG_CTRL); diff --git a/target/linux/ar71xx/patches-3.10/611-MIPS-ath79-wdt-timeout.patch b/target/linux/ar71xx/patches-3.10/611-MIPS-ath79-wdt-timeout.patch index 08972afee0..0927d5a977 100644 --- a/target/linux/ar71xx/patches-3.10/611-MIPS-ath79-wdt-timeout.patch +++ b/target/linux/ar71xx/patches-3.10/611-MIPS-ath79-wdt-timeout.patch @@ -6,7 +6,7 @@ Signed-off-by: John Crispin --- a/drivers/watchdog/ath79_wdt.c +++ b/drivers/watchdog/ath79_wdt.c -@@ -105,10 +105,14 @@ static inline void ath79_wdt_disable(voi +@@ -115,10 +115,14 @@ static inline void ath79_wdt_disable(voi static int ath79_wdt_set_timeout(int val) { -- 2.30.2