Commit eb9c39d0 authored by Jesse Barnes's avatar Jesse Barnes

PCI: set device wakeup capable flag if platform support is present

When PCI devices are initialized, we check whether they support PCI PM
caps and set the device can_wakeup flag if so.  However, some devices
may have platform provided wakeup events rather than PCI PME signals, so
we need to set can_wakeup in that case too.  Doing so should allow
wakeups from many more devices, especially on cost constrained systems.
Reported-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Tested-by: default avatarJoseph Chan <JosephChan@via.com.tw>
Acked-by: default avatar"Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 876e501a
...@@ -1285,6 +1285,26 @@ void pci_pm_init(struct pci_dev *dev) ...@@ -1285,6 +1285,26 @@ void pci_pm_init(struct pci_dev *dev)
} }
} }
/**
* platform_pci_wakeup_init - init platform wakeup if present
* @dev: PCI device
*
* Some devices don't have PCI PM caps but can still generate wakeup
* events through platform methods (like ACPI events). If @dev supports
* platform wakeup events, set the device flag to indicate as much. This
* may be redundant if the device also supports PCI PM caps, but double
* initialization should be safe in that case.
*/
void platform_pci_wakeup_init(struct pci_dev *dev)
{
if (!platform_pci_can_wakeup(dev))
return;
device_set_wakeup_capable(&dev->dev, true);
device_set_wakeup_enable(&dev->dev, false);
platform_pci_sleep_wake(dev, false);
}
/** /**
* pci_add_save_buffer - allocate buffer for saving given capability registers * pci_add_save_buffer - allocate buffer for saving given capability registers
* @dev: the PCI device * @dev: the PCI device
......
...@@ -45,6 +45,7 @@ struct pci_platform_pm_ops { ...@@ -45,6 +45,7 @@ struct pci_platform_pm_ops {
extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops); extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops);
extern void pci_pm_init(struct pci_dev *dev); extern void pci_pm_init(struct pci_dev *dev);
extern void platform_pci_wakeup_init(struct pci_dev *dev);
extern void pci_allocate_cap_save_buffers(struct pci_dev *dev); extern void pci_allocate_cap_save_buffers(struct pci_dev *dev);
extern int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val); extern int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val);
......
...@@ -965,6 +965,7 @@ static void pci_init_capabilities(struct pci_dev *dev) ...@@ -965,6 +965,7 @@ static void pci_init_capabilities(struct pci_dev *dev)
/* Power Management */ /* Power Management */
pci_pm_init(dev); pci_pm_init(dev);
platform_pci_wakeup_init(dev);
/* Vital Product Data */ /* Vital Product Data */
pci_vpd_pci22_init(dev); pci_vpd_pci22_init(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment