diff options
Diffstat (limited to 'drivers/acpi/wakeup.c')
| -rw-r--r-- | drivers/acpi/wakeup.c | 84 | 
1 files changed, 29 insertions, 55 deletions
diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c index e0ee0c036f5a..4b9d339a6e28 100644 --- a/drivers/acpi/wakeup.c +++ b/drivers/acpi/wakeup.c @@ -21,12 +21,12 @@  ACPI_MODULE_NAME("wakeup_devices")  /** - * acpi_enable_wakeup_device_prep - prepare wakeup devices - *	@sleep_state:	ACPI state - * Enable all wakup devices power if the devices' wakeup level - * is higher than requested sleep level + * acpi_enable_wakeup_device_prep - Prepare wake-up devices. + * @sleep_state: ACPI system sleep state. + * + * Enable all wake-up devices' power, unless the requested system sleep state is + * too deep.   */ -  void acpi_enable_wakeup_device_prep(u8 sleep_state)  {  	struct list_head *node, *next; @@ -36,9 +36,8 @@ void acpi_enable_wakeup_device_prep(u8 sleep_state)  						       struct acpi_device,  						       wakeup_list); -		if (!dev->wakeup.flags.valid || -		    !dev->wakeup.state.enabled || -		    (sleep_state > (u32) dev->wakeup.sleep_state)) +		if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled +		    || (sleep_state > (u32) dev->wakeup.sleep_state))  			continue;  		acpi_enable_wakeup_device_power(dev, sleep_state); @@ -46,9 +45,12 @@ void acpi_enable_wakeup_device_prep(u8 sleep_state)  }  /** - * acpi_enable_wakeup_device - enable wakeup devices - *	@sleep_state:	ACPI state - * Enable all wakup devices's GPE + * acpi_enable_wakeup_device - Enable wake-up device GPEs. + * @sleep_state: ACPI system sleep state. + * + * Enable all wake-up devices' GPEs, with the assumption that + * acpi_disable_all_gpes() was executed before, so we don't need to disable any + * GPEs here.   */  void acpi_enable_wakeup_device(u8 sleep_state)  { @@ -65,29 +67,22 @@ void acpi_enable_wakeup_device(u8 sleep_state)  		if (!dev->wakeup.flags.valid)  			continue; -		/* If users want to disable run-wake GPE, -		 * we only disable it for wake and leave it for runtime -		 */  		if ((!dev->wakeup.state.enabled && !dev->wakeup.prepare_count) -		    || sleep_state > (u32) dev->wakeup.sleep_state) { -			if (dev->wakeup.flags.run_wake) { -				/* set_gpe_type will disable GPE, leave it like that */ -				acpi_set_gpe_type(dev->wakeup.gpe_device, -						  dev->wakeup.gpe_number, -						  ACPI_GPE_TYPE_RUNTIME); -			} +		    || sleep_state > (u32) dev->wakeup.sleep_state)  			continue; -		} -		if (!dev->wakeup.flags.run_wake) -			acpi_enable_gpe(dev->wakeup.gpe_device, -					dev->wakeup.gpe_number); + +		/* The wake-up power should have been enabled already. */ +		acpi_set_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, +				ACPI_GPE_ENABLE);  	}  }  /** - * acpi_disable_wakeup_device - disable devices' wakeup capability - *	@sleep_state:	ACPI state - * Disable all wakup devices's GPE and wakeup capability + * acpi_disable_wakeup_device - Disable devices' wakeup capability. + * @sleep_state: ACPI system sleep state. + * + * This function only affects devices with wakeup.state.enabled set, which means + * that it reverses the changes made by acpi_enable_wakeup_device_prep().   */  void acpi_disable_wakeup_device(u8 sleep_state)  { @@ -97,30 +92,11 @@ void acpi_disable_wakeup_device(u8 sleep_state)  		struct acpi_device *dev =  			container_of(node, struct acpi_device, wakeup_list); -		if (!dev->wakeup.flags.valid) -			continue; - -		if ((!dev->wakeup.state.enabled && !dev->wakeup.prepare_count) -		    || sleep_state > (u32) dev->wakeup.sleep_state) { -			if (dev->wakeup.flags.run_wake) { -				acpi_set_gpe_type(dev->wakeup.gpe_device, -						  dev->wakeup.gpe_number, -						  ACPI_GPE_TYPE_WAKE_RUN); -				/* Re-enable it, since set_gpe_type will disable it */ -				acpi_enable_gpe(dev->wakeup.gpe_device, -						dev->wakeup.gpe_number); -			} +		if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled +		    || (sleep_state > (u32) dev->wakeup.sleep_state))  			continue; -		}  		acpi_disable_wakeup_device_power(dev); -		/* Never disable run-wake GPE */ -		if (!dev->wakeup.flags.run_wake) { -			acpi_disable_gpe(dev->wakeup.gpe_device, -					 dev->wakeup.gpe_number); -			acpi_clear_gpe(dev->wakeup.gpe_device, -				       dev->wakeup.gpe_number, ACPI_NOT_ISR); -		}  	}  } @@ -134,13 +110,11 @@ int __init acpi_wakeup_device_init(void)  						       struct acpi_device,  						       wakeup_list);  		/* In case user doesn't load button driver */ -		if (!dev->wakeup.flags.run_wake || dev->wakeup.state.enabled) +		if (!dev->wakeup.flags.always_enabled || +		    dev->wakeup.state.enabled)  			continue; -		acpi_set_gpe_type(dev->wakeup.gpe_device, -				  dev->wakeup.gpe_number, -				  ACPI_GPE_TYPE_WAKE_RUN); -		acpi_enable_gpe(dev->wakeup.gpe_device, -				dev->wakeup.gpe_number); + 		acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, + 				ACPI_GPE_TYPE_WAKE);  		dev->wakeup.state.enabled = 1;  	}  	mutex_unlock(&acpi_device_lock);  | 
