aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChen Yu <yu.c.chen@intel.com>2015-10-24 13:02:46 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-10-25 23:39:26 -0400
commit8c01275e0cdf1959aa25c322fd5870c097733195 (patch)
tree3b667a834110739761d3f78d9ab7ce3640c7d3a9
parentefb1cf7d28b8aeacec53e9ba8f3f2809c5cb9686 (diff)
ACPI / PM: Fix incorrect wakeup IRQ setting during suspend-to-idle
For an ACPI compatible system, the SCI (ACPI System Control Interrupt) is used to wake the system up from suspend-to-idle. Once the CPU is woken up by the SCI, the interrupt handler will first check if the current IRQ has been configured for system wakeup, so irq_pm_check_wakeup() is invoked to validate the IRQ number. However, during suspend-to-idle, enable_irq_wake() is called for acpi_gbl_FADT.sci_interrupt, although the IRQ number that the SCI handler has been installed for should be passed to it instead. Thus, if acpi_gbl_FADT.sci_interrupt happens to be different from that number, ACPI interrupts will not be able to wake up the system from sleep. Fix this problem by passing the IRQ number returned by acpi_gsi_to_irq() to enable_irq_wake() instead of acpi_gbl_FADT.sci_interrupt. Cc: 3.18+ <stable@vger.kernel.org> # 3.18+ Acked-by: Lv Zheng <lv.zheng@intel.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/acpi/sleep.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 2f0d4db40a9e..3fe1fbec7677 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -632,14 +632,16 @@ static int acpi_freeze_prepare(void)
632 acpi_enable_wakeup_devices(ACPI_STATE_S0); 632 acpi_enable_wakeup_devices(ACPI_STATE_S0);
633 acpi_enable_all_wakeup_gpes(); 633 acpi_enable_all_wakeup_gpes();
634 acpi_os_wait_events_complete(); 634 acpi_os_wait_events_complete();
635 enable_irq_wake(acpi_gbl_FADT.sci_interrupt); 635 if (acpi_sci_irq_valid())
636 enable_irq_wake(acpi_sci_irq);
636 return 0; 637 return 0;
637} 638}
638 639
639static void acpi_freeze_restore(void) 640static void acpi_freeze_restore(void)
640{ 641{
641 acpi_disable_wakeup_devices(ACPI_STATE_S0); 642 acpi_disable_wakeup_devices(ACPI_STATE_S0);
642 disable_irq_wake(acpi_gbl_FADT.sci_interrupt); 643 if (acpi_sci_irq_valid())
644 disable_irq_wake(acpi_sci_irq);
643 acpi_enable_all_runtime_gpes(); 645 acpi_enable_all_runtime_gpes();
644} 646}
645 647