diff options
Diffstat (limited to 'drivers/platform/x86/intel-vbtn.c')
| -rw-r--r-- | drivers/platform/x86/intel-vbtn.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/platform/x86/intel-vbtn.c b/drivers/platform/x86/intel-vbtn.c index a0d0cecff55f..b74932307d69 100644 --- a/drivers/platform/x86/intel-vbtn.c +++ b/drivers/platform/x86/intel-vbtn.c @@ -176,6 +176,12 @@ static int intel_vbtn_probe(struct platform_device *device)  		return -EBUSY;  	device_init_wakeup(&device->dev, true); +	/* +	 * In order for system wakeup to work, the EC GPE has to be marked as +	 * a wakeup one, so do that here (this setting will persist, but it has +	 * no effect until the wakeup mask is set for the EC GPE). +	 */ +	acpi_ec_mark_gpe_for_wake();  	return 0;  } @@ -195,22 +201,30 @@ static int intel_vbtn_remove(struct platform_device *device)  static int intel_vbtn_pm_prepare(struct device *dev)  { -	struct intel_vbtn_priv *priv = dev_get_drvdata(dev); +	if (device_may_wakeup(dev)) { +		struct intel_vbtn_priv *priv = dev_get_drvdata(dev); -	priv->wakeup_mode = true; +		priv->wakeup_mode = true; +	}  	return 0;  } -static int intel_vbtn_pm_resume(struct device *dev) +static void intel_vbtn_pm_complete(struct device *dev)  {  	struct intel_vbtn_priv *priv = dev_get_drvdata(dev);  	priv->wakeup_mode = false; +} + +static int intel_vbtn_pm_resume(struct device *dev) +{ +	intel_vbtn_pm_complete(dev);  	return 0;  }  static const struct dev_pm_ops intel_vbtn_pm_ops = {  	.prepare = intel_vbtn_pm_prepare, +	.complete = intel_vbtn_pm_complete,  	.resume = intel_vbtn_pm_resume,  	.restore = intel_vbtn_pm_resume,  	.thaw = intel_vbtn_pm_resume,  |