diff options
author | Fred Fan <r01011@freescale.com> | 2010-01-29 20:23:32 +0800 |
---|---|---|
committer | Alejandro Gonzalez <alex.gonzalez@digi.com> | 2010-05-25 11:13:35 +0200 |
commit | 8b08ff7bf6294fce86f093f65266ab97182260fc (patch) | |
tree | 0458b61b8fe8d113b30a167a3cae9abe7436cd25 | |
parent | 1c99e6ab90e0ce273c104ef1c63c894d52fee3e4 (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.c | 13 | ||||
-rw-r--r-- | arch/arm/plat-mxs/include/mach/system.h | 1 |
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__ */ |