diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2008-12-17 15:06:03 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-07 10:00:12 -0800 |
commit | a0d4922da2e4ccb0973095d8d29f36f6b1b5f703 (patch) | |
tree | 511e023051c2d217c336c965bd384646108de100 /drivers/usb/core/hcd.h | |
parent | a81a81a25d3ecdab777abca87c5ddf484056103d (diff) | |
download | op-kernel-dev-a0d4922da2e4ccb0973095d8d29f36f6b1b5f703.zip op-kernel-dev-a0d4922da2e4ccb0973095d8d29f36f6b1b5f703.tar.gz |
USB: fix up suspend and resume for PCI host controllers
This patch (as1192) rearranges the USB PCI host controller suspend and
resume and resume routines:
Use pci_wake_from_d3() for enabling and disabling wakeup,
instead of pci_enable_wake().
Carry out the actual state change while interrupts are
disabled.
Change the order of the preparations to agree with the
general recommendation for PCI devices, instead of
messing around with the wakeup settings while the device
is in D3.
In .suspend:
Call the underlying driver to disable IRQ
generation;
pci_wake_from_d3(device_may_wakeup());
pci_disable_device();
In .suspend_late:
pci_save_state();
pci_set_power_state(D3hot);
(for PPC_PMAC) Disable ASIC clocks
In .resume_early:
(for PPC_PMAC) Enable ASIC clocks
pci_set_power_state(D0);
pci_restore_state();
In .resume:
pci_enable_device();
pci_set_master();
pci_wake_from_d3(0);
Call the underlying driver to reenable IRQ
generation
Add the necessary .suspend_late and .resume_early method
pointers to the PCI host controller drivers.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/hcd.h')
-rw-r--r-- | drivers/usb/core/hcd.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index aa5da82..572d2cf 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h @@ -256,7 +256,9 @@ extern int usb_hcd_pci_probe(struct pci_dev *dev, extern void usb_hcd_pci_remove(struct pci_dev *dev); #ifdef CONFIG_PM -extern int usb_hcd_pci_suspend(struct pci_dev *dev, pm_message_t state); +extern int usb_hcd_pci_suspend(struct pci_dev *dev, pm_message_t msg); +extern int usb_hcd_pci_suspend_late(struct pci_dev *dev, pm_message_t msg); +extern int usb_hcd_pci_resume_early(struct pci_dev *dev); extern int usb_hcd_pci_resume(struct pci_dev *dev); #endif /* CONFIG_PM */ |