Commit f8c905d3 authored by Ben Dooks's avatar Ben Dooks Committed by Russell King

[ARM] 3132/1: S3C2410 - reset on decompression error

Patch from Ben Dooks

Force a watchdog reset if the system fails to
decompress properly.
Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 4c18ad20
...@@ -283,8 +283,14 @@ void flush_window(void) ...@@ -283,8 +283,14 @@ void flush_window(void)
putstr("."); putstr(".");
} }
#ifndef arch_error
#define arch_error(x)
#endif
static void error(char *x) static void error(char *x)
{ {
arch_error(x);
putstr("\n\n"); putstr("\n\n");
putstr(x); putstr(x);
putstr("\n\n -- System halted"); putstr("\n\n -- System halted");
......
...@@ -121,6 +121,14 @@ config S3C2410_BOOT_WATCHDOG ...@@ -121,6 +121,14 @@ config S3C2410_BOOT_WATCHDOG
system resets depends on the value of PCLK. The timeout on an system resets depends on the value of PCLK. The timeout on an
200MHz s3c2410 should be about 30 seconds. 200MHz s3c2410 should be about 30 seconds.
config S3C2410_BOOT_ERROR_RESET
bool "S3C2410 Reboot on decompression error"
depends on ARCH_S3C2410
help
Say y here to use the watchdog to reset the system if the
kernel decompressor detects an error during decompression.
comment "S3C2410 Setup" comment "S3C2410 Setup"
config S3C2410_DMA config S3C2410_DMA
......
...@@ -116,6 +116,8 @@ putstr(const char *ptr) ...@@ -116,6 +116,8 @@ putstr(const char *ptr)
} }
} }
#define __raw_writel(d,ad) do { *((volatile unsigned int *)(ad)) = (d); } while(0)
/* CONFIG_S3C2410_BOOT_WATCHDOG /* CONFIG_S3C2410_BOOT_WATCHDOG
* *
* Simple boot-time watchdog setup, to reboot the system if there is * Simple boot-time watchdog setup, to reboot the system if there is
...@@ -126,8 +128,6 @@ putstr(const char *ptr) ...@@ -126,8 +128,6 @@ putstr(const char *ptr)
#define WDOG_COUNT (0xff00) #define WDOG_COUNT (0xff00)
#define __raw_writel(d,ad) do { *((volatile unsigned int *)(ad)) = (d); } while(0)
static inline void arch_decomp_wdog(void) static inline void arch_decomp_wdog(void)
{ {
__raw_writel(WDOG_COUNT, S3C2410_WTCNT); __raw_writel(WDOG_COUNT, S3C2410_WTCNT);
...@@ -145,6 +145,24 @@ static void arch_decomp_wdog_start(void) ...@@ -145,6 +145,24 @@ static void arch_decomp_wdog_start(void)
#define arch_decomp_wdog() #define arch_decomp_wdog()
#endif #endif
#ifdef CONFIG_S3C2410_BOOT_ERROR_RESET
static void arch_decomp_error(const char *x)
{
putstr("\n\n");
putstr(x);
putstr("\n\n -- System resetting\n");
__raw_writel(0x4000, S3C2410_WTDAT);
__raw_writel(0x4000, S3C2410_WTCNT);
__raw_writel(S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128 | S3C2410_WTCON_RSTEN | S3C2410_WTCON_PRESCALE(0x40), S3C2410_WTCON);
while(1);
}
#define arch_error arch_decomp_error
#endif
static void error(char *err); static void error(char *err);
static void static void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment