diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
| -rw-r--r-- | arch/arm/kernel/process.c | 34 | 
1 files changed, 18 insertions, 16 deletions
| diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 971d65c253a9..d3eca4524533 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -61,8 +61,6 @@ extern void setup_mm_for_reboot(void);  static volatile int hlt_counter; -#include <mach/system.h> -  void disable_hlt(void)  {  	hlt_counter++; @@ -181,13 +179,17 @@ void cpu_idle_wait(void)  EXPORT_SYMBOL_GPL(cpu_idle_wait);  /* - * This is our default idle handler.  We need to disable - * interrupts here to ensure we don't miss a wakeup call. + * This is our default idle handler.   */ + +void (*arm_pm_idle)(void); +  static void default_idle(void)  { -	if (!need_resched()) -		arch_idle(); +	if (arm_pm_idle) +		arm_pm_idle(); +	else +		cpu_do_idle();  	local_irq_enable();  } @@ -215,6 +217,10 @@ void cpu_idle(void)  				cpu_die();  #endif +			/* +			 * We need to disable interrupts here +			 * to ensure we don't miss a wakeup call. +			 */  			local_irq_disable();  #ifdef CONFIG_PL310_ERRATA_769419  			wmb(); @@ -222,26 +228,23 @@ void cpu_idle(void)  			if (hlt_counter) {  				local_irq_enable();  				cpu_relax(); -			} else { +			} else if (!need_resched()) {  				stop_critical_timings();  				if (cpuidle_idle_call())  					pm_idle();  				start_critical_timings();  				/* -				 * This will eventually be removed - pm_idle -				 * functions should always return with IRQs -				 * enabled. +				 * pm_idle functions must always +				 * return with IRQs enabled.  				 */  				WARN_ON(irqs_disabled()); +			} else  				local_irq_enable(); -			}  		}  		leds_event(led_idle_end);  		rcu_idle_exit();  		tick_nohz_idle_exit(); -		preempt_enable_no_resched(); -		schedule(); -		preempt_disable(); +		schedule_preempt_disabled();  	}  } @@ -535,8 +538,7 @@ int vectors_user_mapping(void)  	struct mm_struct *mm = current->mm;  	return install_special_mapping(mm, 0xffff0000, PAGE_SIZE,  				       VM_READ | VM_EXEC | -				       VM_MAYREAD | VM_MAYEXEC | -				       VM_ALWAYSDUMP | VM_RESERVED, +				       VM_MAYREAD | VM_MAYEXEC | VM_RESERVED,  				       NULL);  } | 
