Commit ef050374 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'pm-pci' and 'pm-docs'

* pm-pci:
  PCI / PM: Check device_may_wakeup() in pci_enable_wake()
  PCI / PM: Always check PME wakeup capability for runtime wakeup support

* pm-docs:
  PM: docs: intel_pstate: fix Active Mode w/o HWP paragraph
  PM: docs: sleep-states: Fix a typo ("includig")
...@@ -145,7 +145,7 @@ feature enabled.] ...@@ -145,7 +145,7 @@ feature enabled.]
In this mode ``intel_pstate`` registers utilization update callbacks with the In this mode ``intel_pstate`` registers utilization update callbacks with the
CPU scheduler in order to run a P-state selection algorithm, either CPU scheduler in order to run a P-state selection algorithm, either
``powersave`` or ``performance``, depending on the ``scaling_cur_freq`` policy ``powersave`` or ``performance``, depending on the ``scaling_governor`` policy
setting in ``sysfs``. The current CPU frequency information to be made setting in ``sysfs``. The current CPU frequency information to be made
available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is
periodically updated by those utilization update callbacks too. periodically updated by those utilization update callbacks too.
......
...@@ -15,7 +15,7 @@ Sleep States That Can Be Supported ...@@ -15,7 +15,7 @@ Sleep States That Can Be Supported
================================== ==================================
Depending on its configuration and the capabilities of the platform it runs on, Depending on its configuration and the capabilities of the platform it runs on,
the Linux kernel can support up to four system sleep states, includig the Linux kernel can support up to four system sleep states, including
hibernation and up to three variants of system suspend. The sleep states that hibernation and up to three variants of system suspend. The sleep states that
can be supported by the kernel are listed below. can be supported by the kernel are listed below.
......
...@@ -1910,7 +1910,7 @@ void pci_pme_active(struct pci_dev *dev, bool enable) ...@@ -1910,7 +1910,7 @@ void pci_pme_active(struct pci_dev *dev, bool enable)
EXPORT_SYMBOL(pci_pme_active); EXPORT_SYMBOL(pci_pme_active);
/** /**
* pci_enable_wake - enable PCI device as wakeup event source * __pci_enable_wake - enable PCI device as wakeup event source
* @dev: PCI device affected * @dev: PCI device affected
* @state: PCI state from which device will issue wakeup events * @state: PCI state from which device will issue wakeup events
* @enable: True to enable event generation; false to disable * @enable: True to enable event generation; false to disable
...@@ -1928,7 +1928,7 @@ EXPORT_SYMBOL(pci_pme_active); ...@@ -1928,7 +1928,7 @@ EXPORT_SYMBOL(pci_pme_active);
* Error code depending on the platform is returned if both the platform and * Error code depending on the platform is returned if both the platform and
* the native mechanism fail to enable the generation of wake-up events * the native mechanism fail to enable the generation of wake-up events
*/ */
int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) static int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable)
{ {
int ret = 0; int ret = 0;
...@@ -1969,6 +1969,23 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) ...@@ -1969,6 +1969,23 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable)
return ret; return ret;
} }
/**
* pci_enable_wake - change wakeup settings for a PCI device
* @pci_dev: Target device
* @state: PCI state from which device will issue wakeup events
* @enable: Whether or not to enable event generation
*
* If @enable is set, check device_may_wakeup() for the device before calling
* __pci_enable_wake() for it.
*/
int pci_enable_wake(struct pci_dev *pci_dev, pci_power_t state, bool enable)
{
if (enable && !device_may_wakeup(&pci_dev->dev))
return -EINVAL;
return __pci_enable_wake(pci_dev, state, enable);
}
EXPORT_SYMBOL(pci_enable_wake); EXPORT_SYMBOL(pci_enable_wake);
/** /**
...@@ -1981,9 +1998,9 @@ EXPORT_SYMBOL(pci_enable_wake); ...@@ -1981,9 +1998,9 @@ EXPORT_SYMBOL(pci_enable_wake);
* should not be called twice in a row to enable wake-up due to PCI PM vs ACPI * should not be called twice in a row to enable wake-up due to PCI PM vs ACPI
* ordering constraints. * ordering constraints.
* *
* This function only returns error code if the device is not capable of * This function only returns error code if the device is not allowed to wake
* generating PME# from both D3_hot and D3_cold, and the platform is unable to * up the system from sleep or it is not capable of generating PME# from both
* enable wake-up power for it. * D3_hot and D3_cold and the platform is unable to enable wake-up power for it.
*/ */
int pci_wake_from_d3(struct pci_dev *dev, bool enable) int pci_wake_from_d3(struct pci_dev *dev, bool enable)
{ {
...@@ -2114,7 +2131,7 @@ int pci_finish_runtime_suspend(struct pci_dev *dev) ...@@ -2114,7 +2131,7 @@ int pci_finish_runtime_suspend(struct pci_dev *dev)
dev->runtime_d3cold = target_state == PCI_D3cold; dev->runtime_d3cold = target_state == PCI_D3cold;
pci_enable_wake(dev, target_state, pci_dev_run_wake(dev)); __pci_enable_wake(dev, target_state, pci_dev_run_wake(dev));
error = pci_set_power_state(dev, target_state); error = pci_set_power_state(dev, target_state);
...@@ -2138,16 +2155,16 @@ bool pci_dev_run_wake(struct pci_dev *dev) ...@@ -2138,16 +2155,16 @@ bool pci_dev_run_wake(struct pci_dev *dev)
{ {
struct pci_bus *bus = dev->bus; struct pci_bus *bus = dev->bus;
if (device_can_wakeup(&dev->dev))
return true;
if (!dev->pme_support) if (!dev->pme_support)
return false; return false;
/* PME-capable in principle, but not from the target power state */ /* PME-capable in principle, but not from the target power state */
if (!pci_pme_capable(dev, pci_target_state(dev, false))) if (!pci_pme_capable(dev, pci_target_state(dev, true)))
return false; return false;
if (device_can_wakeup(&dev->dev))
return true;
while (bus->parent) { while (bus->parent) {
struct pci_dev *bridge = bus->self; struct pci_dev *bridge = bus->self;
......
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