Commit 0ce2f385 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-4.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI fixes from Rafael Wysocki:
 "These are two fixups for the suspend-to-idle handling in the ACPI
  subsystem after recent changes in that area and two simple fixes of
  the ACPI NUMA code.

  Specifics:

   - Add an ACPI module parameter to allow users to override the new
     default behavior on some systems where the EC GPE is not disabled
     during suspend-to-idle in case the EC on their systems generates
     excessive wakeup events and they want to sacrifice some
     functionality (like power button wakeups) for extra battery life
     while suspended (Rafael Wysocki).

   - Fix flushing of the outstanding EC work in the ACPI core
     suspend-to-idle code (Rafael Wysocki).

   - Add a missing include and fix a messed-up comment in the ACPI NUMA
     code (Ross Zwisler)"

* tag 'acpi-4.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: NUMA: Fix typo in the full name of SRAT
  ACPI: NUMA: add missing include in acpi_numa.h
  ACPI / PM / EC: Flush all EC work in acpi_freeze_sync()
  ACPI / EC: Add parameter to force disable the GPE on suspend
parents 36cb531d f6248dd8
...@@ -151,6 +151,10 @@ static bool ec_freeze_events __read_mostly = false; ...@@ -151,6 +151,10 @@ static bool ec_freeze_events __read_mostly = false;
module_param(ec_freeze_events, bool, 0644); module_param(ec_freeze_events, bool, 0644);
MODULE_PARM_DESC(ec_freeze_events, "Disabling event handling during suspend/resume"); MODULE_PARM_DESC(ec_freeze_events, "Disabling event handling during suspend/resume");
static bool ec_no_wakeup __read_mostly;
module_param(ec_no_wakeup, bool, 0644);
MODULE_PARM_DESC(ec_no_wakeup, "Do not wake up from suspend-to-idle");
struct acpi_ec_query_handler { struct acpi_ec_query_handler {
struct list_head node; struct list_head node;
acpi_ec_query_func func; acpi_ec_query_func func;
...@@ -535,6 +539,14 @@ static void acpi_ec_disable_event(struct acpi_ec *ec) ...@@ -535,6 +539,14 @@ static void acpi_ec_disable_event(struct acpi_ec *ec)
spin_unlock_irqrestore(&ec->lock, flags); spin_unlock_irqrestore(&ec->lock, flags);
__acpi_ec_flush_event(ec); __acpi_ec_flush_event(ec);
} }
void acpi_ec_flush_work(void)
{
if (first_ec)
__acpi_ec_flush_event(first_ec);
flush_scheduled_work();
}
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */
static bool acpi_ec_guard_event(struct acpi_ec *ec) static bool acpi_ec_guard_event(struct acpi_ec *ec)
...@@ -1880,6 +1892,32 @@ static int acpi_ec_suspend(struct device *dev) ...@@ -1880,6 +1892,32 @@ static int acpi_ec_suspend(struct device *dev)
return 0; return 0;
} }
static int acpi_ec_suspend_noirq(struct device *dev)
{
struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
/*
* The SCI handler doesn't run at this point, so the GPE can be
* masked at the low level without side effects.
*/
if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
ec->reference_count >= 1)
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
return 0;
}
static int acpi_ec_resume_noirq(struct device *dev)
{
struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
ec->reference_count >= 1)
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
return 0;
}
static int acpi_ec_resume(struct device *dev) static int acpi_ec_resume(struct device *dev)
{ {
struct acpi_ec *ec = struct acpi_ec *ec =
...@@ -1891,6 +1929,7 @@ static int acpi_ec_resume(struct device *dev) ...@@ -1891,6 +1929,7 @@ static int acpi_ec_resume(struct device *dev)
#endif #endif
static const struct dev_pm_ops acpi_ec_pm = { static const struct dev_pm_ops acpi_ec_pm = {
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend_noirq, acpi_ec_resume_noirq)
SET_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend, acpi_ec_resume) SET_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend, acpi_ec_resume)
}; };
......
...@@ -193,6 +193,10 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, ...@@ -193,6 +193,10 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
void *data); void *data);
void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit); void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit);
#ifdef CONFIG_PM_SLEEP
void acpi_ec_flush_work(void);
#endif
/*-------------------------------------------------------------------------- /*--------------------------------------------------------------------------
Suspend/Resume Suspend/Resume
......
...@@ -443,7 +443,7 @@ int __init acpi_numa_init(void) ...@@ -443,7 +443,7 @@ int __init acpi_numa_init(void)
* So go over all cpu entries in SRAT to get apicid to node mapping. * So go over all cpu entries in SRAT to get apicid to node mapping.
*/ */
/* SRAT: Static Resource Affinity Table */ /* SRAT: System Resource Affinity Table */
if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) { if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
struct acpi_subtable_proc srat_proc[3]; struct acpi_subtable_proc srat_proc[3];
......
...@@ -777,11 +777,11 @@ static void acpi_freeze_sync(void) ...@@ -777,11 +777,11 @@ static void acpi_freeze_sync(void)
/* /*
* Process all pending events in case there are any wakeup ones. * Process all pending events in case there are any wakeup ones.
* *
* The EC driver uses the system workqueue, so that one needs to be * The EC driver uses the system workqueue and an additional special
* flushed too. * one, so those need to be flushed too.
*/ */
acpi_ec_flush_work();
acpi_os_wait_events_complete(); acpi_os_wait_events_complete();
flush_scheduled_work();
s2idle_wakeup = false; s2idle_wakeup = false;
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/numa.h>
/* Proximity bitmap length */ /* Proximity bitmap length */
#if MAX_NUMNODES > 256 #if MAX_NUMNODES > 256
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment