From: 黄涛 Date: Tue, 21 Jun 2011 03:49:07 +0000 (+0800) Subject: rk29: reset: support reboot to loader X-Git-Tag: firefly_0821_release~10176^2~5 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=db83b54a2eb178b816e6b75f96b3d2934176e9f4;p=firefly-linux-kernel-4.4.55.git rk29: reset: support reboot to loader --- diff --git a/arch/arm/mach-rk29/reset.c b/arch/arm/mach-rk29/reset.c index ed869c63c866..d586d474ab62 100755 --- a/arch/arm/mach-rk29/reset.c +++ b/arch/arm/mach-rk29/reset.c @@ -38,7 +38,7 @@ static void pwm2gpiodefault(void) extern void __rb( void* ); -void rb( void ) +static void rb( void ) { void(*cb)(void* ) ; @@ -52,9 +52,11 @@ void rb( void ) cb( uart_base ); } +static volatile u32 __sramdata reboot_reason = 0; static void __sramfunc __noreturn rk29_rb_with_softreset(void) { u32 reg; + u32 reason = __raw_readl((u32)&reboot_reason - SRAM_CODE_OFFSET + 0x10130000); asm volatile ( "mrc p15, 0, %0, c1, c0, 0\n\t" @@ -95,6 +97,11 @@ static void __sramfunc __noreturn rk29_rb_with_softreset(void) dsb(); LOOP(10 * LOOPS_PER_USEC); + if (reason) { + __raw_writel(0, RK29_TIMER0_PHYS + 0x8); + __raw_writel(reason, RK29_TIMER0_PHYS + 0x0); + } + asm volatile ( "b 1f\n\t" ".align 5\n\t" @@ -106,10 +113,15 @@ static void __sramfunc __noreturn rk29_rb_with_softreset(void) while (1); } -void rk29_arch_reset(int mode, const char *cmd) +void rk29_arch_reset(int mode, const char *cmd) { void (*rb2)(void); + if (cmd) { + if (!strcmp(cmd, "loader")) + reboot_reason = 0x1888AAFF; + } + rb2 = (void(*)(void))((u32)rk29_rb_with_softreset - SRAM_CODE_OFFSET + 0x10130000); local_irq_disable();