diff options
Diffstat (limited to 'drivers/acpi/sleep.c')
| -rw-r--r-- | drivers/acpi/sleep.c | 24 | 
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 4ca667251272..f32570f72b90 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c @@ -636,11 +636,19 @@ static int acpi_suspend_enter(suspend_state_t pm_state)  	}  	/* -	 * Disable and clear GPE status before interrupt is enabled. Some GPEs -	 * (like wakeup GPE) haven't handler, this can avoid such GPE misfire. -	 * acpi_leave_sleep_state will reenable specific GPEs later +	 * Disable all GPE and clear their status bits before interrupts are +	 * enabled. Some GPEs (like wakeup GPEs) have no handlers and this can +	 * prevent them from producing spurious interrups. +	 * +	 * acpi_leave_sleep_state() will reenable specific GPEs later. +	 * +	 * Because this code runs on one CPU with disabled interrupts (all of +	 * the other CPUs are offline at this time), it need not acquire any +	 * sleeping locks which may trigger an implicit preemption point even +	 * if there is no contention, so avoid doing that by using a low-level +	 * library routine here.  	 */ -	acpi_disable_all_gpes(); +	acpi_hw_disable_all_gpes();  	/* Allow EC transactions to happen. */  	acpi_ec_unblock_transactions(); @@ -714,7 +722,13 @@ int acpi_s2idle_begin(void)  int acpi_s2idle_prepare(void)  {  	if (acpi_sci_irq_valid()) { -		enable_irq_wake(acpi_sci_irq); +		int error; + +		error = enable_irq_wake(acpi_sci_irq); +		if (error) +			pr_warn("Warning: Failed to enable wakeup from IRQ %d: %d\n", +				acpi_sci_irq, error); +  		acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);  	}  |