Merge tag 'for-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
[~shefty/rdma-dev.git] / drivers / pci / pci-driver.c
index 099f46cd8e87a4ca823dc24f707458857f26eaa5..185be37033430adf53d8a390fd34a4c9dfd6e446 100644 (file)
@@ -459,16 +459,17 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev)
        return 0;
 }
 
+#endif
+
+#ifdef CONFIG_PM_SLEEP
+
 static void pci_pm_default_resume_early(struct pci_dev *pci_dev)
 {
-       pci_restore_standard_config(pci_dev);
+       pci_power_up(pci_dev);
+       pci_restore_state(pci_dev);
        pci_fixup_device(pci_fixup_resume_early, pci_dev);
 }
 
-#endif
-
-#ifdef CONFIG_PM_SLEEP
-
 /*
  * Default "suspend" method for devices that have no driver provided suspend,
  * or not even a driver at all (second part).
@@ -1031,10 +1032,13 @@ static int pci_pm_runtime_suspend(struct device *dev)
        if (!pm || !pm->runtime_suspend)
                return -ENOSYS;
 
+       pci_dev->no_d3cold = false;
        error = pm->runtime_suspend(dev);
        suspend_report_result(pm->runtime_suspend, error);
        if (error)
                return error;
+       if (!pci_dev->d3cold_allowed)
+               pci_dev->no_d3cold = true;
 
        pci_fixup_device(pci_fixup_suspend, pci_dev);
 
@@ -1056,17 +1060,23 @@ static int pci_pm_runtime_suspend(struct device *dev)
 
 static int pci_pm_runtime_resume(struct device *dev)
 {
+       int rc;
        struct pci_dev *pci_dev = to_pci_dev(dev);
        const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
 
        if (!pm || !pm->runtime_resume)
                return -ENOSYS;
 
-       pci_pm_default_resume_early(pci_dev);
+       pci_restore_standard_config(pci_dev);
+       pci_fixup_device(pci_fixup_resume_early, pci_dev);
        __pci_enable_wake(pci_dev, PCI_D0, true, false);
        pci_fixup_device(pci_fixup_resume, pci_dev);
 
-       return pm->runtime_resume(dev);
+       rc = pm->runtime_resume(dev);
+
+       pci_dev->runtime_d3cold = false;
+
+       return rc;
 }
 
 static int pci_pm_runtime_idle(struct device *dev)