diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
| -rw-r--r-- | arch/arm/kernel/process.c | 29 | 
1 files changed, 24 insertions, 5 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index a4a9cc88bec..2e2ec97cc50 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -29,6 +29,7 @@  #include <linux/utsname.h>  #include <linux/uaccess.h> +#include <asm/cacheflush.h>  #include <asm/leds.h>  #include <asm/processor.h>  #include <asm/system.h> @@ -84,10 +85,9 @@ __setup("hlt", hlt_setup);  void arm_machine_restart(char mode, const char *cmd)  { -	/* -	 * Clean and disable cache, and turn off interrupts -	 */ -	cpu_proc_fin(); +	/* Disable interrupts first */ +	local_irq_disable(); +	local_fiq_disable();  	/*  	 * Tell the mm system that we are going to reboot - @@ -96,6 +96,15 @@ void arm_machine_restart(char mode, const char *cmd)  	 */  	setup_mm_for_reboot(mode); +	/* Clean and invalidate caches */ +	flush_cache_all(); + +	/* Turn off caching */ +	cpu_proc_fin(); + +	/* Push out any further dirty data, and ensure cache is empty */ +	flush_cache_all(); +  	/*  	 * Now call the architecture specific reboot code.  	 */ @@ -189,19 +198,29 @@ int __init reboot_setup(char *str)  __setup("reboot=", reboot_setup); -void machine_halt(void) +void machine_shutdown(void)  { +#ifdef CONFIG_SMP +	smp_send_stop(); +#endif  } +void machine_halt(void) +{ +	machine_shutdown(); +	while (1); +}  void machine_power_off(void)  { +	machine_shutdown();  	if (pm_power_off)  		pm_power_off();  }  void machine_restart(char *cmd)  { +	machine_shutdown();  	arm_pm_restart(reboot_mode, cmd);  }  |