ar71xx: avoid spurious restarts caused by the watchdog on AR934x
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 40465
This commit is contained in:
parent
fd53cfa31b
commit
cd75606712
|
@ -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);
|
|
@ -6,7 +6,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||||
|
|
||||||
--- a/drivers/watchdog/ath79_wdt.c
|
--- a/drivers/watchdog/ath79_wdt.c
|
||||||
+++ b/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)
|
static int ath79_wdt_set_timeout(int val)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user