summaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci-driver.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2019-06-24 04:11:27 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2019-06-24 04:11:27 -0400
commit25bc694a8a086bfee6e5b9dd9e53f4de721b0acf (patch)
treea843d17b336c9ea7d4cad67843ebbf255d61ea1f /drivers/pci/pci-driver.c
parent3e26c5feed2add218046ecf91bab3cfa9bf762a6 (diff)
parent000dd5316e1c756a1c028f22e01d06a38249dd4d (diff)
Merge back PCI power management material for v5.3.
Diffstat (limited to 'drivers/pci/pci-driver.c')
-rw-r--r--drivers/pci/pci-driver.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 98af9ecd4a90..bd097ea5925c 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -678,6 +678,7 @@ static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
678static int pci_pm_prepare(struct device *dev) 678static int pci_pm_prepare(struct device *dev)
679{ 679{
680 struct device_driver *drv = dev->driver; 680 struct device_driver *drv = dev->driver;
681 struct pci_dev *pci_dev = to_pci_dev(dev);
681 682
682 if (drv && drv->pm && drv->pm->prepare) { 683 if (drv && drv->pm && drv->pm->prepare) {
683 int error = drv->pm->prepare(dev); 684 int error = drv->pm->prepare(dev);
@@ -687,7 +688,15 @@ static int pci_pm_prepare(struct device *dev)
687 if (!error && dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_PREPARE)) 688 if (!error && dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_PREPARE))
688 return 0; 689 return 0;
689 } 690 }
690 return pci_dev_keep_suspended(to_pci_dev(dev)); 691 if (pci_dev_need_resume(pci_dev))
692 return 0;
693
694 /*
695 * The PME setting needs to be adjusted here in case the direct-complete
696 * optimization is used with respect to this device.
697 */
698 pci_dev_adjust_pme(pci_dev);
699 return 1;
691} 700}
692 701
693static void pci_pm_complete(struct device *dev) 702static void pci_pm_complete(struct device *dev)
@@ -757,9 +766,11 @@ static int pci_pm_suspend(struct device *dev)
757 * better to resume the device from runtime suspend here. 766 * better to resume the device from runtime suspend here.
758 */ 767 */
759 if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) || 768 if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) ||
760 !pci_dev_keep_suspended(pci_dev)) { 769 pci_dev_need_resume(pci_dev)) {
761 pm_runtime_resume(dev); 770 pm_runtime_resume(dev);
762 pci_dev->state_saved = false; 771 pci_dev->state_saved = false;
772 } else {
773 pci_dev_adjust_pme(pci_dev);
763 } 774 }
764 775
765 if (pm->suspend) { 776 if (pm->suspend) {
@@ -1130,10 +1141,13 @@ static int pci_pm_poweroff(struct device *dev)
1130 1141
1131 /* The reason to do that is the same as in pci_pm_suspend(). */ 1142 /* The reason to do that is the same as in pci_pm_suspend(). */
1132 if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) || 1143 if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) ||
1133 !pci_dev_keep_suspended(pci_dev)) 1144 pci_dev_need_resume(pci_dev)) {
1134 pm_runtime_resume(dev); 1145 pm_runtime_resume(dev);
1146 pci_dev->state_saved = false;
1147 } else {
1148 pci_dev_adjust_pme(pci_dev);
1149 }
1135 1150
1136 pci_dev->state_saved = false;
1137 if (pm->poweroff) { 1151 if (pm->poweroff) {
1138 int error; 1152 int error;
1139 1153