summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/ec.c1
-rw-r--r--drivers/acpi/sleep.c15
-rw-r--r--drivers/platform/x86/intel-hid.c6
-rw-r--r--drivers/platform/x86/intel-vbtn.c6
4 files changed, 15 insertions, 13 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 58597ec813eb..da1e5c5ce150 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -1970,7 +1970,6 @@ void acpi_ec_set_gpe_wake_mask(u8 action)
if (pm_suspend_no_platform() && first_ec && !ec_no_wakeup)
acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action);
}
-EXPORT_SYMBOL_GPL(acpi_ec_set_gpe_wake_mask);
bool acpi_ec_dispatch_gpe(void)
{
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index c52ecbda863f..9fa77d72ef27 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -938,6 +938,13 @@ static int lps0_device_attach(struct acpi_device *adev,
if (mem_sleep_default > PM_SUSPEND_MEM && !acpi_sleep_default_s3)
mem_sleep_current = PM_SUSPEND_TO_IDLE;
+ /*
+ * Some LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U, require the
+ * EC GPE to be enabled while suspended for certain wakeup devices to
+ * work, so mark it as wakeup-capable.
+ */
+ acpi_ec_mark_gpe_for_wake();
+
return 0;
}
@@ -954,8 +961,10 @@ static int acpi_s2idle_begin(void)
static int acpi_s2idle_prepare(void)
{
- if (acpi_sci_irq_valid())
+ if (acpi_sci_irq_valid()) {
enable_irq_wake(acpi_sci_irq);
+ acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);
+ }
acpi_enable_wakeup_devices(ACPI_STATE_S0);
@@ -1034,8 +1043,10 @@ static void acpi_s2idle_restore(void)
acpi_disable_wakeup_devices(ACPI_STATE_S0);
- if (acpi_sci_irq_valid())
+ if (acpi_sci_irq_valid()) {
+ acpi_ec_set_gpe_wake_mask(ACPI_GPE_DISABLE);
disable_irq_wake(acpi_sci_irq);
+ }
}
static void acpi_s2idle_end(void)
diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c
index 18ac237114ff..ef6d4bd77b1a 100644
--- a/drivers/platform/x86/intel-hid.c
+++ b/drivers/platform/x86/intel-hid.c
@@ -257,7 +257,6 @@ static int intel_hid_pm_prepare(struct device *device)
struct intel_hid_priv *priv = dev_get_drvdata(device);
priv->wakeup_mode = true;
- acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);
}
return 0;
}
@@ -266,10 +265,7 @@ static void intel_hid_pm_complete(struct device *device)
{
struct intel_hid_priv *priv = dev_get_drvdata(device);
- if (priv->wakeup_mode) {
- acpi_ec_set_gpe_wake_mask(ACPI_GPE_DISABLE);
- priv->wakeup_mode = false;
- }
+ priv->wakeup_mode = false;
}
static int intel_hid_pl_suspend_handler(struct device *device)
diff --git a/drivers/platform/x86/intel-vbtn.c b/drivers/platform/x86/intel-vbtn.c
index b28e5519337e..b74932307d69 100644
--- a/drivers/platform/x86/intel-vbtn.c
+++ b/drivers/platform/x86/intel-vbtn.c
@@ -205,7 +205,6 @@ static int intel_vbtn_pm_prepare(struct device *dev)
struct intel_vbtn_priv *priv = dev_get_drvdata(dev);
priv->wakeup_mode = true;
- acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);
}
return 0;
}
@@ -214,10 +213,7 @@ static void intel_vbtn_pm_complete(struct device *dev)
{
struct intel_vbtn_priv *priv = dev_get_drvdata(dev);
- if (priv->wakeup_mode) {
- acpi_ec_set_gpe_wake_mask(ACPI_GPE_DISABLE);
- priv->wakeup_mode = false;
- }
+ priv->wakeup_mode = false;
}
static int intel_vbtn_pm_resume(struct device *dev)