aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-06-23 19:57:35 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-06-27 19:52:45 -0400
commit0847684cfc5f0e9f009919bfdcb041d60e19b856 (patch)
tree0a0593338927f228215feb19f938e71023607c24
parent8370c2dc4c7b91be7e1231130f0ae08b5aebecf4 (diff)
PCI / PM: Simplify device wakeup settings code
After previous changes it is not necessary to distinguish between device wakeup for run time and device wakeup from system sleep states any more, so rework the PCI device wakeup settings code accordingly. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r--drivers/pci/pci-acpi.c3
-rw-r--r--drivers/pci/pci-driver.c2
-rw-r--r--drivers/pci/pci-mid.c10
-rw-r--r--drivers/pci/pci.c36
-rw-r--r--drivers/pci/pci.h9
-rw-r--r--include/linux/pci.h9
6 files changed, 17 insertions, 52 deletions
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
index de255bc9736b..138a3c55d80e 100644
--- a/drivers/pci/pci-acpi.c
+++ b/drivers/pci/pci-acpi.c
@@ -615,8 +615,7 @@ static const struct pci_platform_pm_ops acpi_pci_platform_pm = {
615 .set_state = acpi_pci_set_power_state, 615 .set_state = acpi_pci_set_power_state,
616 .get_state = acpi_pci_get_power_state, 616 .get_state = acpi_pci_get_power_state,
617 .choose_state = acpi_pci_choose_state, 617 .choose_state = acpi_pci_choose_state,
618 .sleep_wake = acpi_pci_wakeup, 618 .set_wakeup = acpi_pci_wakeup,
619 .run_wake = acpi_pci_wakeup,
620 .need_resume = acpi_pci_need_resume, 619 .need_resume = acpi_pci_need_resume,
621}; 620};
622 621
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 192e7b681b96..ffe7d54d9328 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -1216,7 +1216,7 @@ static int pci_pm_runtime_resume(struct device *dev)
1216 1216
1217 pci_restore_standard_config(pci_dev); 1217 pci_restore_standard_config(pci_dev);
1218 pci_fixup_device(pci_fixup_resume_early, pci_dev); 1218 pci_fixup_device(pci_fixup_resume_early, pci_dev);
1219 __pci_enable_wake(pci_dev, PCI_D0, true, false); 1219 pci_enable_wake(pci_dev, PCI_D0, false);
1220 pci_fixup_device(pci_fixup_resume, pci_dev); 1220 pci_fixup_device(pci_fixup_resume, pci_dev);
1221 1221
1222 rc = pm->runtime_resume(dev); 1222 rc = pm->runtime_resume(dev);
diff --git a/drivers/pci/pci-mid.c b/drivers/pci/pci-mid.c
index 1c4af7227bca..a4ac940c7696 100644
--- a/drivers/pci/pci-mid.c
+++ b/drivers/pci/pci-mid.c
@@ -39,12 +39,7 @@ static pci_power_t mid_pci_choose_state(struct pci_dev *pdev)
39 return PCI_D3hot; 39 return PCI_D3hot;
40} 40}
41 41
42static int mid_pci_sleep_wake(struct pci_dev *dev, bool enable) 42static int mid_pci_wakeup(struct pci_dev *dev, bool enable)
43{
44 return 0;
45}
46
47static int mid_pci_run_wake(struct pci_dev *dev, bool enable)
48{ 43{
49 return 0; 44 return 0;
50} 45}
@@ -59,8 +54,7 @@ static const struct pci_platform_pm_ops mid_pci_platform_pm = {
59 .set_state = mid_pci_set_power_state, 54 .set_state = mid_pci_set_power_state,
60 .get_state = mid_pci_get_power_state, 55 .get_state = mid_pci_get_power_state,
61 .choose_state = mid_pci_choose_state, 56 .choose_state = mid_pci_choose_state,
62 .sleep_wake = mid_pci_sleep_wake, 57 .set_wakeup = mid_pci_wakeup,
63 .run_wake = mid_pci_run_wake,
64 .need_resume = mid_pci_need_resume, 58 .need_resume = mid_pci_need_resume,
65}; 59};
66 60
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 5641035e58fa..d378262d30e3 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -574,8 +574,7 @@ static const struct pci_platform_pm_ops *pci_platform_pm;
574int pci_set_platform_pm(const struct pci_platform_pm_ops *ops) 574int pci_set_platform_pm(const struct pci_platform_pm_ops *ops)
575{ 575{
576 if (!ops->is_manageable || !ops->set_state || !ops->get_state || 576 if (!ops->is_manageable || !ops->set_state || !ops->get_state ||
577 !ops->choose_state || !ops->sleep_wake || !ops->run_wake || 577 !ops->choose_state || !ops->set_wakeup || !ops->need_resume)
578 !ops->need_resume)
579 return -EINVAL; 578 return -EINVAL;
580 pci_platform_pm = ops; 579 pci_platform_pm = ops;
581 return 0; 580 return 0;
@@ -603,16 +602,10 @@ static inline pci_power_t platform_pci_choose_state(struct pci_dev *dev)
603 pci_platform_pm->choose_state(dev) : PCI_POWER_ERROR; 602 pci_platform_pm->choose_state(dev) : PCI_POWER_ERROR;
604} 603}
605 604
606static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable) 605static inline int platform_pci_set_wakeup(struct pci_dev *dev, bool enable)
607{ 606{
608 return pci_platform_pm ? 607 return pci_platform_pm ?
609 pci_platform_pm->sleep_wake(dev, enable) : -ENODEV; 608 pci_platform_pm->set_wakeup(dev, enable) : -ENODEV;
610}
611
612static inline int platform_pci_run_wake(struct pci_dev *dev, bool enable)
613{
614 return pci_platform_pm ?
615 pci_platform_pm->run_wake(dev, enable) : -ENODEV;
616} 609}
617 610
618static inline bool platform_pci_need_resume(struct pci_dev *dev) 611static inline bool platform_pci_need_resume(struct pci_dev *dev)
@@ -1889,10 +1882,9 @@ void pci_pme_active(struct pci_dev *dev, bool enable)
1889EXPORT_SYMBOL(pci_pme_active); 1882EXPORT_SYMBOL(pci_pme_active);
1890 1883
1891/** 1884/**
1892 * __pci_enable_wake - enable PCI device as wakeup event source 1885 * pci_enable_wake - enable PCI device as wakeup event source
1893 * @dev: PCI device affected 1886 * @dev: PCI device affected
1894 * @state: PCI state from which device will issue wakeup events 1887 * @state: PCI state from which device will issue wakeup events
1895 * @runtime: True if the events are to be generated at run time
1896 * @enable: True to enable event generation; false to disable 1888 * @enable: True to enable event generation; false to disable
1897 * 1889 *
1898 * This enables the device as a wakeup event source, or disables it. 1890 * This enables the device as a wakeup event source, or disables it.
@@ -1908,14 +1900,10 @@ EXPORT_SYMBOL(pci_pme_active);
1908 * Error code depending on the platform is returned if both the platform and 1900 * Error code depending on the platform is returned if both the platform and
1909 * the native mechanism fail to enable the generation of wake-up events 1901 * the native mechanism fail to enable the generation of wake-up events
1910 */ 1902 */
1911int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, 1903int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable)
1912 bool runtime, bool enable)
1913{ 1904{
1914 int ret = 0; 1905 int ret = 0;
1915 1906
1916 if (enable && !runtime && !device_may_wakeup(&dev->dev))
1917 return -EINVAL;
1918
1919 /* 1907 /*
1920 * Don't do the same thing twice in a row for one device, but restore 1908 * Don't do the same thing twice in a row for one device, but restore
1921 * PME Enable in case it has been updated by config space restoration. 1909 * PME Enable in case it has been updated by config space restoration.
@@ -1938,24 +1926,20 @@ int __pci_enable_wake(struct pci_dev *dev, pci_power_t state,
1938 pci_pme_active(dev, true); 1926 pci_pme_active(dev, true);
1939 else 1927 else
1940 ret = 1; 1928 ret = 1;
1941 error = runtime ? platform_pci_run_wake(dev, true) : 1929 error = platform_pci_set_wakeup(dev, true);
1942 platform_pci_sleep_wake(dev, true);
1943 if (ret) 1930 if (ret)
1944 ret = error; 1931 ret = error;
1945 if (!ret) 1932 if (!ret)
1946 dev->wakeup_prepared = true; 1933 dev->wakeup_prepared = true;
1947 } else { 1934 } else {
1948 if (runtime) 1935 platform_pci_set_wakeup(dev, false);
1949 platform_pci_run_wake(dev, false);
1950 else
1951 platform_pci_sleep_wake(dev, false);
1952 pci_pme_active(dev, false); 1936 pci_pme_active(dev, false);
1953 dev->wakeup_prepared = false; 1937 dev->wakeup_prepared = false;
1954 } 1938 }
1955 1939
1956 return ret; 1940 return ret;
1957} 1941}
1958EXPORT_SYMBOL(__pci_enable_wake); 1942EXPORT_SYMBOL(pci_enable_wake);
1959 1943
1960/** 1944/**
1961 * pci_wake_from_d3 - enable/disable device to wake up from D3_hot or D3_cold 1945 * pci_wake_from_d3 - enable/disable device to wake up from D3_hot or D3_cold
@@ -2097,12 +2081,12 @@ int pci_finish_runtime_suspend(struct pci_dev *dev)
2097 2081
2098 dev->runtime_d3cold = target_state == PCI_D3cold; 2082 dev->runtime_d3cold = target_state == PCI_D3cold;
2099 2083
2100 __pci_enable_wake(dev, target_state, true, pci_dev_run_wake(dev)); 2084 pci_enable_wake(dev, target_state, pci_dev_run_wake(dev));
2101 2085
2102 error = pci_set_power_state(dev, target_state); 2086 error = pci_set_power_state(dev, target_state);
2103 2087
2104 if (error) { 2088 if (error) {
2105 __pci_enable_wake(dev, target_state, true, false); 2089 pci_enable_wake(dev, target_state, false);
2106 dev->runtime_d3cold = false; 2090 dev->runtime_d3cold = false;
2107 } 2091 }
2108 2092
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index f8113e5b9812..240b2c0fed4b 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -47,11 +47,7 @@ int pci_probe_reset_function(struct pci_dev *dev);
47 * platform; to be used during system-wide transitions from a 47 * platform; to be used during system-wide transitions from a
48 * sleeping state to the working state and vice versa 48 * sleeping state to the working state and vice versa
49 * 49 *
50 * @sleep_wake: enables/disables the system wake up capability of given device 50 * @set_wakeup: enables/disables wakeup capability for the device
51 *
52 * @run_wake: enables/disables the platform to generate run-time wake-up events
53 * for given device (the device's wake-up capability has to be
54 * enabled by @sleep_wake for this feature to work)
55 * 51 *
56 * @need_resume: returns 'true' if the given device (which is currently 52 * @need_resume: returns 'true' if the given device (which is currently
57 * suspended) needs to be resumed to be configured for system 53 * suspended) needs to be resumed to be configured for system
@@ -65,8 +61,7 @@ struct pci_platform_pm_ops {
65 int (*set_state)(struct pci_dev *dev, pci_power_t state); 61 int (*set_state)(struct pci_dev *dev, pci_power_t state);
66 pci_power_t (*get_state)(struct pci_dev *dev); 62 pci_power_t (*get_state)(struct pci_dev *dev);
67 pci_power_t (*choose_state)(struct pci_dev *dev); 63 pci_power_t (*choose_state)(struct pci_dev *dev);
68 int (*sleep_wake)(struct pci_dev *dev, bool enable); 64 int (*set_wakeup)(struct pci_dev *dev, bool enable);
69 int (*run_wake)(struct pci_dev *dev, bool enable);
70 bool (*need_resume)(struct pci_dev *dev); 65 bool (*need_resume)(struct pci_dev *dev);
71}; 66};
72 67
diff --git a/include/linux/pci.h b/include/linux/pci.h
index d3d5bca82b43..ff200c84240b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1097,8 +1097,7 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
1097pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state); 1097pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
1098bool pci_pme_capable(struct pci_dev *dev, pci_power_t state); 1098bool pci_pme_capable(struct pci_dev *dev, pci_power_t state);
1099void pci_pme_active(struct pci_dev *dev, bool enable); 1099void pci_pme_active(struct pci_dev *dev, bool enable);
1100int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, 1100int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable);
1101 bool runtime, bool enable);
1102int pci_wake_from_d3(struct pci_dev *dev, bool enable); 1101int pci_wake_from_d3(struct pci_dev *dev, bool enable);
1103int pci_prepare_to_sleep(struct pci_dev *dev); 1102int pci_prepare_to_sleep(struct pci_dev *dev);
1104int pci_back_from_sleep(struct pci_dev *dev); 1103int pci_back_from_sleep(struct pci_dev *dev);
@@ -1108,12 +1107,6 @@ void pci_pme_wakeup_bus(struct pci_bus *bus);
1108void pci_d3cold_enable(struct pci_dev *dev); 1107void pci_d3cold_enable(struct pci_dev *dev);
1109void pci_d3cold_disable(struct pci_dev *dev); 1108void pci_d3cold_disable(struct pci_dev *dev);
1110 1109
1111static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state,
1112 bool enable)
1113{
1114 return __pci_enable_wake(dev, state, false, enable);
1115}
1116
1117/* PCI Virtual Channel */ 1110/* PCI Virtual Channel */
1118int pci_save_vc_state(struct pci_dev *dev); 1111int pci_save_vc_state(struct pci_dev *dev);
1119void pci_restore_vc_state(struct pci_dev *dev); 1112void pci_restore_vc_state(struct pci_dev *dev);