diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2019-06-24 04:11:27 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2019-06-24 04:11:27 -0400 |
commit | 25bc694a8a086bfee6e5b9dd9e53f4de721b0acf (patch) | |
tree | a843d17b336c9ea7d4cad67843ebbf255d61ea1f /drivers/pci/pci-driver.c | |
parent | 3e26c5feed2add218046ecf91bab3cfa9bf762a6 (diff) | |
parent | 000dd5316e1c756a1c028f22e01d06a38249dd4d (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.c | 22 |
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) | |||
678 | static int pci_pm_prepare(struct device *dev) | 678 | static 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 | ||
693 | static void pci_pm_complete(struct device *dev) | 702 | static 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 | ||