|
@@ -762,19 +762,33 @@ static void pci_acpi_setup(struct device *dev)
|
|
|
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)
|