return;
 
        device_set_wakeup_capable(dev, true);
+       /*
+        * For bridges that can do D3 we enable wake automatically (as
+        * we do for the power management itself in that case). The
+        * reason is that the bridge may have additional methods such as
+        * _DSW that need to be called.
+        */
+       if (pci_dev->bridge_d3)
+               device_wakeup_enable(dev);
+
        acpi_pci_wakeup(pci_dev, false);
 }
 
 static void pci_acpi_cleanup(struct device *dev)
 {
        struct acpi_device *adev = ACPI_COMPANION(dev);
+       struct pci_dev *pci_dev = to_pci_dev(dev);
 
        if (!adev)
                return;
 
        pci_acpi_remove_pm_notifier(adev);
-       if (adev->wakeup.flags.valid)
+       if (adev->wakeup.flags.valid) {
+               if (pci_dev->bridge_d3)
+                       device_wakeup_disable(dev);
+
                device_set_wakeup_capable(dev, false);
+       }
 }
 
 static bool pci_acpi_bus_match(struct device *dev)