mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 20:56:23 +00:00
sh: Use internal watchdog timer to perform reset
This patches will trigger a reboot using the watchdog timer instead of double fault. Unlike the previous method, this one actually works in 32 bit mode. Reset should also be cleaner. Signed-off-by: Jon Frosdick <jon.frosdick@st.com> Signed-off-by: Carl Shaw <carl.shaw@st.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
27a30f53bb
commit
b46373e0d4
1 changed files with 20 additions and 0 deletions
|
@ -32,15 +32,35 @@
|
|||
#include <asm/ubc.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/syscalls.h>
|
||||
#include <asm/watchdog.h>
|
||||
|
||||
int ubc_usercnt = 0;
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
static void watchdog_trigger_immediate(void)
|
||||
{
|
||||
sh_wdt_write_cnt(0xFF);
|
||||
sh_wdt_write_csr(0xC2);
|
||||
}
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
||||
/* Use watchdog timer to trigger reset */
|
||||
watchdog_trigger_immediate();
|
||||
|
||||
while (1)
|
||||
cpu_sleep();
|
||||
}
|
||||
#else
|
||||
void machine_restart(char * __unused)
|
||||
{
|
||||
/* SR.BL=1 and invoke address error to let CPU reset (manual reset) */
|
||||
asm volatile("ldc %0, sr\n\t"
|
||||
"mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001));
|
||||
}
|
||||
#endif
|
||||
|
||||
void machine_halt(void)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue