summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Fan <r01011@freescale.com>2010-01-29 20:23:32 +0800
committerAlejandro Gonzalez <alex.gonzalez@digi.com>2010-05-25 11:13:35 +0200
commit8b08ff7bf6294fce86f093f65266ab97182260fc (patch)
tree0458b61b8fe8d113b30a167a3cae9abe7436cd25
parent1c99e6ab90e0ce273c104ef1c63c894d52fee3e4 (diff)
ENGR00120562 i.MX28 Linux reboot support
Use watchdog to reset CPU. Signed-off-by: Fred.fan <r01011@freescale.com> Signed-off-by: Alejandro Gonzalez <alex.gonzalez@digi.com>
-rw-r--r--arch/arm/plat-mxs/core.c13
-rw-r--r--arch/arm/plat-mxs/include/mach/system.h1
2 files changed, 13 insertions, 1 deletions
diff --git a/arch/arm/plat-mxs/core.c b/arch/arm/plat-mxs/core.c
index 7f91808e6c66..b804a579397c 100644
--- a/arch/arm/plat-mxs/core.c
+++ b/arch/arm/plat-mxs/core.c
@@ -23,7 +23,10 @@
#include <asm/proc-fns.h>
-static void (*machine_arch_reset) (char mode, const char *cmd);
+#include <mach/hardware.h>
+#include <mach/regs-rtc.h>
+
+void (*machine_arch_reset) (char mode, const char *cmd);
void arch_idle(void)
{
@@ -34,6 +37,14 @@ void arch_reset(char mode, const char *cmd)
{
if (machine_arch_reset)
machine_arch_reset(mode, cmd);
+ else {
+ void *base = IO_ADDRESS(RTC_PHYS_ADDR);
+
+ __raw_writel(1, base + HW_RTC_WATCHDOG);
+ __raw_writel(0x80000000, base + HW_RTC_PERSISTENT1_SET);
+ __raw_writel(BM_RTC_CTRL_WATCHDOGEN, base + HW_RTC_CTRL_SET);
+ }
+ cpu_reset(0);
}
static int __mxs_reset_block(void __iomem *hwreg, int just_enable)
diff --git a/arch/arm/plat-mxs/include/mach/system.h b/arch/arm/plat-mxs/include/mach/system.h
index d777723fedf3..63604de8d74a 100644
--- a/arch/arm/plat-mxs/include/mach/system.h
+++ b/arch/arm/plat-mxs/include/mach/system.h
@@ -23,6 +23,7 @@
extern void arch_idle(void);
void arch_reset(char mode, const char *cmd);
+extern void (*machine_arch_reset)(char mode, const char *cmd);
int mxs_reset_block(void __iomem *hwreg, int just_enable);
#endif /* __ASM_ARCH_SYSTEM_H__ */