aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r--drivers/pci/pci.c36
1 files changed, 10 insertions, 26 deletions
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