diff options
Diffstat (limited to 'drivers/idle/intel_idle.c')
| -rw-r--r-- | drivers/idle/intel_idle.c | 32 | 
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index b9bb94bd0f67..424ef470223d 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -115,6 +115,18 @@ static unsigned int mwait_substates __initdata;  #define flg2MWAIT(flags) (((flags) >> 24) & 0xFF)  #define MWAIT2flg(eax) ((eax & 0xFF) << 24) +static __always_inline int __intel_idle(struct cpuidle_device *dev, +					struct cpuidle_driver *drv, int index) +{ +	struct cpuidle_state *state = &drv->states[index]; +	unsigned long eax = flg2MWAIT(state->flags); +	unsigned long ecx = 1; /* break on interrupt flag */ + +	mwait_idle_with_hints(eax, ecx); + +	return index; +} +  /**   * intel_idle - Ask the processor to enter the given idle state.   * @dev: cpuidle device of the target CPU. @@ -132,16 +144,19 @@ static unsigned int mwait_substates __initdata;  static __cpuidle int intel_idle(struct cpuidle_device *dev,  				struct cpuidle_driver *drv, int index)  { -	struct cpuidle_state *state = &drv->states[index]; -	unsigned long eax = flg2MWAIT(state->flags); -	unsigned long ecx = 1; /* break on interrupt flag */ +	return __intel_idle(dev, drv, index); +} -	if (state->flags & CPUIDLE_FLAG_IRQ_ENABLE) -		local_irq_enable(); +static __cpuidle int intel_idle_irq(struct cpuidle_device *dev, +				    struct cpuidle_driver *drv, int index) +{ +	int ret; -	mwait_idle_with_hints(eax, ecx); +	raw_local_irq_enable(); +	ret = __intel_idle(dev, drv, index); +	raw_local_irq_disable(); -	return index; +	return ret;  }  /** @@ -1801,6 +1816,9 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)  		/* Structure copy. */  		drv->states[drv->state_count] = cpuidle_state_table[cstate]; +		if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_IRQ_ENABLE) +			drv->states[drv->state_count].enter = intel_idle_irq; +  		if ((disabled_states_mask & BIT(drv->state_count)) ||  		    ((icpu->use_acpi || force_use_acpi) &&  		     intel_idle_off_by_default(mwait_hint) &&  | 
