diff options
author | Loic Poulain <loic.poulain@intel.com> | 2015-09-09 21:04:15 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2015-09-17 13:20:06 +0200 |
commit | f755247379912f1b855f05cb44e3e2b11abdee11 (patch) | |
tree | 43aac7256f3c63336d3c27e5f8fd5dd3b46aecbb /drivers/bluetooth/hci_intel.c | |
parent | 30e945fb28a66bbbc00859540f79d08e76dec2e2 (diff) | |
download | linux-f755247379912f1b855f05cb44e3e2b11abdee11.tar.bz2 |
Bluetooth: hci_intel: Enable IRQ wake capability
We need to explicitly enable the IRQ wakeup mode to let the controller
wake the system from sleep states (like suspend-to-ram).
PM suspend/resume callbacks now call the generic intel device PM
functions after enabling/disabling IRQ wake.
Signed-off-by: Loic Poulain <loic.poulain@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth/hci_intel.c')
-rw-r--r-- | drivers/bluetooth/hci_intel.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c index 249e0963170d..49e25409de67 100644 --- a/drivers/bluetooth/hci_intel.c +++ b/drivers/bluetooth/hci_intel.c @@ -1184,12 +1184,10 @@ static int intel_acpi_probe(struct intel_device *idev) #endif #ifdef CONFIG_PM -static int intel_suspend(struct device *dev) +static int intel_suspend_device(struct device *dev) { struct intel_device *idev = dev_get_drvdata(dev); - dev_dbg(dev, "intel_suspend"); - mutex_lock(&idev->hu_lock); if (idev->hu) intel_lpm_suspend(idev->hu); @@ -1198,12 +1196,10 @@ static int intel_suspend(struct device *dev) return 0; } -static int intel_resume(struct device *dev) +static int intel_resume_device(struct device *dev) { struct intel_device *idev = dev_get_drvdata(dev); - dev_dbg(dev, "intel_resume"); - mutex_lock(&idev->hu_lock); if (idev->hu) intel_lpm_resume(idev->hu); @@ -1213,9 +1209,31 @@ static int intel_resume(struct device *dev) } #endif +#ifdef CONFIG_PM_SLEEP +static int intel_suspend(struct device *dev) +{ + struct intel_device *idev = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + enable_irq_wake(idev->irq); + + return intel_suspend_device(dev); +} + +static int intel_resume(struct device *dev) +{ + struct intel_device *idev = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + disable_irq_wake(idev->irq); + + return intel_resume_device(dev); +} +#endif + static const struct dev_pm_ops intel_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(intel_suspend, intel_resume) - SET_RUNTIME_PM_OPS(intel_suspend, intel_resume, NULL) + SET_RUNTIME_PM_OPS(intel_suspend_device, intel_resume_device, NULL) }; static int intel_probe(struct platform_device *pdev) |