PCI: Add pci_fixup_suspend_late quirk pass
Add pci_fixup_suspend_late as a new pci_fixup_pass. The pass is called from suspend_noirq and poweroff_noirq. Using the same pass for suspend and hibernate is consistent with resume_early which is called by resume_noirq and restore_noirq. The new quirk pass is required for Thunderbolt support on Apple hardware. Signed-off-by: Andreas Noever <andreas.noever@gmail.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
3364f0c127
commit
7d2a01b87f
@@ -582,7 +582,7 @@ static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
|
||||
WARN_ONCE(pci_dev->current_state != prev,
|
||||
"PCI PM: Device state not saved by %pF\n",
|
||||
drv->suspend_late);
|
||||
return 0;
|
||||
goto Fixup;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -591,6 +591,9 @@ static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
|
||||
|
||||
pci_pm_set_unknown_state(pci_dev);
|
||||
|
||||
Fixup:
|
||||
pci_fixup_device(pci_fixup_suspend_late, pci_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -734,7 +737,7 @@ static int pci_pm_suspend_noirq(struct device *dev)
|
||||
|
||||
if (!pm) {
|
||||
pci_save_state(pci_dev);
|
||||
return 0;
|
||||
goto Fixup;
|
||||
}
|
||||
|
||||
if (pm->suspend_noirq) {
|
||||
@@ -751,7 +754,7 @@ static int pci_pm_suspend_noirq(struct device *dev)
|
||||
WARN_ONCE(pci_dev->current_state != prev,
|
||||
"PCI PM: State of device not saved by %pF\n",
|
||||
pm->suspend_noirq);
|
||||
return 0;
|
||||
goto Fixup;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -775,6 +778,9 @@ static int pci_pm_suspend_noirq(struct device *dev)
|
||||
if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
|
||||
pci_write_config_word(pci_dev, PCI_COMMAND, 0);
|
||||
|
||||
Fixup:
|
||||
pci_fixup_device(pci_fixup_suspend_late, pci_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -999,8 +1005,10 @@ static int pci_pm_poweroff_noirq(struct device *dev)
|
||||
if (pci_has_legacy_pm_support(to_pci_dev(dev)))
|
||||
return pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
|
||||
|
||||
if (!drv || !drv->pm)
|
||||
if (!drv || !drv->pm) {
|
||||
pci_fixup_device(pci_fixup_suspend_late, pci_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (drv->pm->poweroff_noirq) {
|
||||
int error;
|
||||
@@ -1021,6 +1029,8 @@ static int pci_pm_poweroff_noirq(struct device *dev)
|
||||
if (pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)
|
||||
pci_write_config_word(pci_dev, PCI_COMMAND, 0);
|
||||
|
||||
pci_fixup_device(pci_fixup_suspend_late, pci_dev);
|
||||
|
||||
if (pcibios_pm_ops.poweroff_noirq)
|
||||
return pcibios_pm_ops.poweroff_noirq(dev);
|
||||
|
||||
|
Reference in New Issue
Block a user