diff options
Diffstat (limited to 'target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch')
-rw-r--r-- | target/linux/ar71xx/patches-3.10/104-watchdog-ath79-wdt-avoid-spurious-restarts-on-AR934x.patch | 48 |
1 files changed, 48 insertions, 0 deletions
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 <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); |