Browse Source

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")
Rafael J. Wysocki 7 years ago
parent
commit
ef050374e1

+ 1 - 1
Documentation/admin-guide/pm/intel_pstate.rst

@@ -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.

+ 1 - 1
Documentation/admin-guide/pm/sleep-states.rst

@@ -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.
 
 

+ 27 - 10
drivers/pci/pci.c

@@ -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);
  * 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)
 
 
 	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);
  * 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
- * generating PME# from both D3_hot and D3_cold, and the platform is unable to
- * enable wake-up power for it.
+ * This function only returns error code if the device is not allowed to wake
+ * up the system from sleep or it is not capable of generating PME# from both
+ * 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)
 
 
 	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)
 {
 {
 	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;