]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI/PM: Replace pci_set_power_state() in pci_pm_thaw_noirq()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 5 May 2022 18:18:09 +0000 (20:18 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 5 May 2022 19:19:49 +0000 (14:19 -0500)
Calling pci_set_power_state() to put the given device into D0 in
pci_pm_thaw_noirq() may cause it to restore the device's BARs, which is
redundant before calling pci_restore_state(), so replace it with a direct
pci_power_up() call followed by pci_update_current_state() if it returns a
nonzero value, in analogy with pci_pm_default_resume_early().

Avoid code duplication by introducing a wrapper function to contain the
repeating pattern and calling it in both places.

Link: https://lore.kernel.org/r/3639079.MHq7AAxBmi@kreacher
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci-driver.c

index d76fab66a9c965339e0e5b2373480386a6b8f33e..2f3b69adfc9eb771909d89c172b751345ec248e3 100644 (file)
@@ -556,10 +556,15 @@ static void pci_pm_default_resume(struct pci_dev *pci_dev)
        pci_enable_wake(pci_dev, PCI_D0, false);
 }
 
-static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
+static void pci_pm_power_up_and_verify_state(struct pci_dev *pci_dev)
 {
        pci_power_up(pci_dev);
        pci_update_current_state(pci_dev, PCI_D0);
+}
+
+static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
+{
+       pci_pm_power_up_and_verify_state(pci_dev);
        pci_restore_state(pci_dev);
        pci_pme_restore(pci_dev);
 }
@@ -1084,7 +1089,7 @@ static int pci_pm_thaw_noirq(struct device *dev)
         * in case the driver's "freeze" callbacks put it into a low-power
         * state.
         */
-       pci_set_power_state(pci_dev, PCI_D0);
+       pci_pm_power_up_and_verify_state(pci_dev);
        pci_restore_state(pci_dev);
 
        if (pci_has_legacy_pm_support(pci_dev))