diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 19:01:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 19:01:57 -0400 |
commit | 431bf99d26157d56689e5de65bd27ce9f077fc3f (patch) | |
tree | b15e357039956fcdd0e0e6177d2fc99bb3cfa822 /drivers/pci | |
parent | 72f96e0e38d7e29ba16dcfd824ecaebe38b8293e (diff) | |
parent | 7ae033cc0dfce68d8e0c83aca60837cf2bf0d2e6 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: (51 commits)
PM: Improve error code of pm_notifier_call_chain()
PM: Add "RTC" to PM trace time stamps to avoid confusion
PM / Suspend: Export suspend_set_ops, suspend_valid_only_mem
PM / Suspend: Add .suspend_again() callback to suspend_ops
PM / OPP: Introduce function to free cpufreq table
ARM / shmobile: Return -EBUSY from A4LC power off if A3RV is active
PM / Domains: Take .power_off() error code into account
ARM / shmobile: Use genpd_queue_power_off_work()
ARM / shmobile: Use pm_genpd_poweroff_unused()
PM / Domains: Introduce function to power off all unused PM domains
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 / Domains: Queue up power off work only if it is not pending
PM / Domains: Improve handling of wakeup devices during system suspend
PM / Domains: Do not restore all devices on power off error
PM / Domains: Allow callbacks to execute all runtime PM helpers
PM / Domains: Do not execute device callbacks under locks
...
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); |