diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-07-15 17:59:25 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-07-15 17:59:25 -0400 |
commit | 7ae033cc0dfce68d8e0c83aca60837cf2bf0d2e6 (patch) | |
tree | 91bb3b8ae2790c7fef06b1832a7df61ae496a77a /drivers/pci | |
parent | ba1389d74f34c0c6e95cc135a332cd29c29d9c20 (diff) | |
parent | c8c9fda5069456eb9e0e403c19764b2e257802e1 (diff) |
Merge branch 'pm-runtime' into for-linus
* pm-runtime:
OMAP: PM: disable idle on suspend for GPIO and UART
OMAP: PM: omap_device: add API to disable idle on suspend
OMAP: PM: omap_device: add system PM methods for PM domain handling
OMAP: PM: omap_device: conditionally use PM domain runtime helpers
PM / Runtime: Add new helper function: pm_runtime_status_suspended()
PM / Runtime: Consistent utilization of deferred_resume
PM / Runtime: Prevent runtime_resume from racing with probe
PM / Runtime: Replace "run-time" with "runtime" in documentation
PM / Runtime: Improve documentation of enable, disable and barrier
PM: Limit race conditions between runtime PM and system sleep (v2)
PCI / PM: Detect early wakeup in pci_pm_prepare()
PM / Runtime: Return special error code if runtime PM is disabled
PM / Runtime: Update documentation of interactions with system sleep
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pci-driver.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 46767c53917a..12d1e81a8abe 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
19 | #include <linux/cpu.h> | 19 | #include <linux/cpu.h> |
20 | #include <linux/pm_runtime.h> | 20 | #include <linux/pm_runtime.h> |
21 | #include <linux/suspend.h> | ||
21 | #include "pci.h" | 22 | #include "pci.h" |
22 | 23 | ||
23 | struct pci_dynid { | 24 | struct pci_dynid { |
@@ -616,6 +617,21 @@ static int pci_pm_prepare(struct device *dev) | |||
616 | int error = 0; | 617 | int error = 0; |
617 | 618 | ||
618 | /* | 619 | /* |
620 | * If a PCI device configured to wake up the system from sleep states | ||
621 | * has been suspended at run time and there's a resume request pending | ||
622 | * for it, this is equivalent to the device signaling wakeup, so the | ||
623 | * system suspend operation should be aborted. | ||
624 | */ | ||
625 | pm_runtime_get_noresume(dev); | ||
626 | if (pm_runtime_barrier(dev) && device_may_wakeup(dev)) | ||
627 | pm_wakeup_event(dev, 0); | ||
628 | |||
629 | if (pm_wakeup_pending()) { | ||
630 | pm_runtime_put_sync(dev); | ||
631 | return -EBUSY; | ||
632 | } | ||
633 | |||
634 | /* | ||
619 | * PCI devices suspended at run time need to be resumed at this | 635 | * PCI devices suspended at run time need to be resumed at this |
620 | * point, because in general it is necessary to reconfigure them for | 636 | * point, because in general it is necessary to reconfigure them for |
621 | * system suspend. Namely, if the device is supposed to wake up the | 637 | * system suspend. Namely, if the device is supposed to wake up the |
@@ -624,7 +640,7 @@ static int pci_pm_prepare(struct device *dev) | |||
624 | * system from the sleep state, we'll have to prevent it from signaling | 640 | * system from the sleep state, we'll have to prevent it from signaling |
625 | * wake-up. | 641 | * wake-up. |
626 | */ | 642 | */ |
627 | pm_runtime_get_sync(dev); | 643 | pm_runtime_resume(dev); |
628 | 644 | ||
629 | if (drv && drv->pm && drv->pm->prepare) | 645 | if (drv && drv->pm && drv->pm->prepare) |
630 | error = drv->pm->prepare(dev); | 646 | error = drv->pm->prepare(dev); |