static int pci_pm_prepare(struct device *dev)
 {
        struct device_driver *drv = dev->driver;
+       struct pci_dev *pci_dev = to_pci_dev(dev);
 
        if (drv && drv->pm && drv->pm->prepare) {
                int error = drv->pm->prepare(dev);
                if (!error && dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_PREPARE))
                        return 0;
        }
-       return pci_dev_keep_suspended(to_pci_dev(dev));
+       if (pci_dev_need_resume(pci_dev))
+               return 0;
+
+       /*
+        * The PME setting needs to be adjusted here in case the direct-complete
+        * optimization is used with respect to this device.
+        */
+       pci_dev_adjust_pme(pci_dev);
+       return 1;
 }
 
 static void pci_pm_complete(struct device *dev)
         * better to resume the device from runtime suspend here.
         */
        if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) ||
-           !pci_dev_keep_suspended(pci_dev)) {
+           pci_dev_need_resume(pci_dev)) {
                pm_runtime_resume(dev);
                pci_dev->state_saved = false;
+       } else {
+               pci_dev_adjust_pme(pci_dev);
        }
 
        if (pm->suspend) {
 
        /* The reason to do that is the same as in pci_pm_suspend(). */
        if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) ||
-           !pci_dev_keep_suspended(pci_dev))
+           pci_dev_need_resume(pci_dev)) {
                pm_runtime_resume(dev);
+               pci_dev->state_saved = false;
+       } else {
+               pci_dev_adjust_pme(pci_dev);
+       }
 
-       pci_dev->state_saved = false;
        if (pm->poweroff) {
                int error;
 
 
 EXPORT_SYMBOL_GPL(pci_dev_run_wake);
 
 /**
- * pci_dev_keep_suspended - Check if the device can stay in the suspended state.
+ * pci_dev_need_resume - Check if it is necessary to resume the device.
  * @pci_dev: Device to check.
  *
- * Return 'true' if the device is runtime-suspended, it doesn't have to be
+ * Return 'true' if the device is not runtime-suspended or it has to be
  * reconfigured due to wakeup settings difference between system and runtime
- * suspend and the current power state of it is suitable for the upcoming
- * (system) transition.
- *
- * If the device is not configured for system wakeup, disable PME for it before
- * returning 'true' to prevent it from waking up the system unnecessarily.
+ * suspend, or the current power state of it is not suitable for the upcoming
+ * (system-wide) transition.
  */
-bool pci_dev_keep_suspended(struct pci_dev *pci_dev)
+bool pci_dev_need_resume(struct pci_dev *pci_dev)
 {
        struct device *dev = &pci_dev->dev;
-       bool wakeup = device_may_wakeup(dev);
        pci_power_t target_state;
 
        if (!pm_runtime_suspended(dev) || platform_pci_need_resume(pci_dev))
-               return false;
+               return true;
 
-       target_state = pci_target_state(pci_dev, wakeup);
+       target_state = pci_target_state(pci_dev, device_may_wakeup(dev));
 
        /*
         * If the earlier platform check has not triggered, D3cold is just power
         * removal on top of D3hot, so no need to resume the device in that
         * case.
         */
-       if (target_state != pci_dev->current_state &&
-           target_state != PCI_D3cold && pci_dev->current_state != PCI_D3hot)
-               return false;
+       return target_state != pci_dev->current_state &&
+               target_state != PCI_D3cold &&
+               pci_dev->current_state != PCI_D3hot;
+}
+
+/**
+ * pci_dev_adjust_pme - Adjust PME setting for a suspended device.
+ * @pci_dev: Device to check.
+ *
+ * If the device is suspended and it is not configured for system wakeup,
+ * disable PME for it to prevent it from waking up the system unnecessarily.
+ *
+ * Note that if the device's power state is D3cold and the platform check in
+ * pci_dev_need_resume() has not triggered, the device's configuration need not
+ * be changed.
+ */
+void pci_dev_adjust_pme(struct pci_dev *pci_dev)
+{
+       struct device *dev = &pci_dev->dev;
 
-       /*
-        * At this point the device is good to go unless it's been configured
-        * to generate PME at the runtime suspend time, but it is not supposed
-        * to wake up the system.  In that case, simply disable PME for it
-        * (it will have to be re-enabled on exit from system resume).
-        *
-        * If the device's power state is D3cold and the platform check above
-        * hasn't triggered, the device's configuration is suitable and we don't
-        * need to manipulate it at all.
-        */
        spin_lock_irq(&dev->power.lock);
 
-       if (pm_runtime_suspended(dev) && pci_dev->current_state < PCI_D3cold &&
-           !wakeup)
+       if (pm_runtime_suspended(dev) && !device_may_wakeup(dev) &&
+           pci_dev->current_state < PCI_D3cold)
                __pci_pme_active(pci_dev, false);
 
        spin_unlock_irq(&dev->power.lock);
-       return true;
 }
 
 /**