Patchwork [v2,1/5] ARM: ep93xx: use more reliable CPLD watchdog for reset on ts72xx

login
register
mail settings
Submitter Petr Štetiar
Date June 12, 2011, 3:04 p.m.
Message ID <1307891100-31123-2-git-send-email-ynezz@true.cz>
Download mbox | patch
Permalink /patch/100101/
State New
Headers show

Comments

Petr Štetiar - June 12, 2011, 3:04 p.m.
On all ep93xx based boards from Technologic Systems, there's CPLD watchdog
available, so use this one to reset the board instead of the soft reset in
CPU.  I've seen some weird lockups with the soft reset on ep93xx in the past,
while the reset via CPLD watchdog seems to be rock solid (tm) and works fine
so far.

Cc: Ryan Mallon <ryan@bluewatersys.com>
Tested-by: Mika Westerberg <mika.westerberg@iki.fi>
Acked-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Petr Štetiar <ynezz@true.cz>
---
 arch/arm/mach-ep93xx/include/mach/system.h |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)
hartleys - June 13, 2011, 5:39 p.m.
On Sunday, June 12, 2011 8:05 AM, Petr Štetiar wrote:
>

> On all ep93xx based boards from Technologic Systems, there's CPLD watchdog

> available, so use this one to reset the board instead of the soft reset in

> CPU.  I've seen some weird lockups with the soft reset on ep93xx in the past,

> while the reset via CPLD watchdog seems to be rock solid (tm) and works fine

> so far.

>

> Cc: Ryan Mallon <ryan@bluewatersys.com>

> Tested-by: Mika Westerberg <mika.westerberg@iki.fi>

> Acked-by: H Hartley Sweeten <hsweeten@visionengravers.com>

> Signed-off-by: Petr Štetiar <ynezz@true.cz>


Please submit to Russell's Patch Tracker.

Regards,
Hartley

Patch

diff --git a/arch/arm/mach-ep93xx/include/mach/system.h b/arch/arm/mach-ep93xx/include/mach/system.h
index 6d661fe..67ec430 100644
--- a/arch/arm/mach-ep93xx/include/mach/system.h
+++ b/arch/arm/mach-ep93xx/include/mach/system.h
@@ -2,7 +2,10 @@ 
  * arch/arm/mach-ep93xx/include/mach/system.h
  */
 
+#include <linux/io.h>
+
 #include <mach/hardware.h>
+#include <mach/ts72xx.h>
 
 static inline void arch_idle(void)
 {
@@ -13,11 +16,16 @@  static inline void arch_reset(char mode, const char *cmd)
 {
 	local_irq_disable();
 
-	/*
-	 * Set then clear the SWRST bit to initiate a software reset
-	 */
-	ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST);
-	ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST);
+	if (board_is_ts7200() || board_is_ts7250() || board_is_ts7260() ||
+	    board_is_ts7300() || board_is_ts7400()) {
+		/* We use more reliable CPLD watchdog to perform the reset */
+		__raw_writeb(0x5, TS72XX_WDT_FEED_PHYS_BASE);
+		__raw_writeb(0x1, TS72XX_WDT_CONTROL_PHYS_BASE);
+	} else {
+		/* Set then clear the SWRST bit to initiate a software reset */
+		ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST);
+		ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST);
+	}
 
 	while (1)
 		;