struct pci_dev *pci_dev = to_pci_dev(dev);
        const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
 
+       pci_dev->skip_bus_pm = false;
+
        if (pci_has_legacy_pm_support(pci_dev))
                return pci_legacy_suspend(dev, PMSG_SUSPEND);
 
                }
        }
 
-       if (!pci_dev->state_saved) {
+       if (pci_dev->skip_bus_pm) {
+               /*
+                * The function is running for the second time in a row without
+                * going through full resume, which is possible only during
+                * suspend-to-idle in a spurious wakeup case.  Moreover, the
+                * device was originally left in D0, so its power state should
+                * not be changed here and the device register values saved
+                * originally should be restored on resume again.
+                */
+               pci_dev->state_saved = true;
+       } else if (pci_dev->state_saved) {
+               if (pci_dev->current_state == PCI_D0)
+                       pci_dev->skip_bus_pm = true;
+       } else {
                pci_save_state(pci_dev);
                if (pci_power_manageable(pci_dev))
                        pci_prepare_to_sleep(pci_dev);
 
                                                   D3cold, not set for devices
                                                   powered on/off by the
                                                   corresponding bridge */
+       unsigned int    skip_bus_pm:1;  /* Internal: Skip bus-level PM */
        unsigned int    ignore_hotplug:1;       /* Ignore hotplug events */
        unsigned int    hotplug_user_indicators:1; /* SlotCtl indicators
                                                      controlled exclusively by