diff options
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 36 |
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; | |||
574 | int pci_set_platform_pm(const struct pci_platform_pm_ops *ops) | 574 | int 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 | ||
606 | static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable) | 605 | static 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 | |||
612 | static 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 | ||
618 | static inline bool platform_pci_need_resume(struct pci_dev *dev) | 611 | static inline bool platform_pci_need_resume(struct pci_dev *dev) |
@@ -1889,10 +1882,9 @@ void pci_pme_active(struct pci_dev *dev, bool enable) | |||
1889 | EXPORT_SYMBOL(pci_pme_active); | 1882 | EXPORT_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 | */ |
1911 | int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, | 1903 | int 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 | } |
1958 | EXPORT_SYMBOL(__pci_enable_wake); | 1942 | EXPORT_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 | ||