ar71xx: avoid spurious restarts caused by the watchdog on AR934x
authorGabor Juhos <juhosg@openwrt.org>
Sat, 12 Apr 2014 10:21:04 +0000 (10:21 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Sat, 12 Apr 2014 10:21:04 +0000 (10:21 +0000)
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 40465

target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch [new file with mode: 0644]
target/linux/ar71xx/patches-3.10/611-MIPS-ath79-wdt-timeout.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 (file)
index 0000000..c7bf066
--- /dev/null
@@ -0,0 +1,48 @@
+From 2ff030d44672d745c5327b72463af43f5103e99b Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+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 <juhosg@openwrt.org>
+Cc: <stable@vger.kernel.org>
+---
+ 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 <linux/bitops.h>
++#include <linux/delay.h>
+ #include <linux/errno.h>
+ #include <linux/fs.h>
+ #include <linux/init.h>
+@@ -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);
index 08972afee04334468352c0f8e9c859912af90d01..0927d5a977047ee1ca0d49246574f1a2bec8935b 100644 (file)
@@ -6,7 +6,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
 
 --- 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)
  {