Merge branch 'parisc-4.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[cascardo/linux.git] / drivers / pci / pci-driver.c
index e39a67c..1ccce1c 100644 (file)
@@ -466,7 +466,6 @@ static void pci_device_shutdown(struct device *dev)
        pci_msi_shutdown(pci_dev);
        pci_msix_shutdown(pci_dev);
 
-#ifdef CONFIG_KEXEC_CORE
        /*
         * If this is a kexec reboot, turn off Bus Master bit on the
         * device to tell it to not continue to do DMA. Don't touch
@@ -476,7 +475,6 @@ static void pci_device_shutdown(struct device *dev)
         */
        if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot))
                pci_clear_master(pci_dev);
-#endif
 }
 
 #ifdef CONFIG_PM
@@ -684,8 +682,19 @@ static int pci_pm_prepare(struct device *dev)
 
 static void pci_pm_complete(struct device *dev)
 {
-       pci_dev_complete_resume(to_pci_dev(dev));
-       pm_complete_with_resume_check(dev);
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+
+       pci_dev_complete_resume(pci_dev);
+       pm_generic_complete(dev);
+
+       /* Resume device if platform firmware has put it in reset-power-on */
+       if (dev->power.direct_complete && pm_resume_via_firmware()) {
+               pci_power_t pre_sleep_state = pci_dev->current_state;
+
+               pci_update_current_state(pci_dev, pci_dev->current_state);
+               if (pci_dev->current_state < pre_sleep_state)
+                       pm_request_resume(dev);
+       }
 }
 
 #else /* !CONFIG_PM_SLEEP */