diff options
Diffstat (limited to 'drivers/base/power')
-rw-r--r-- | drivers/base/power/generic_ops.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/drivers/base/power/generic_ops.c b/drivers/base/power/generic_ops.c index 265a0ee3b49e..1b878b955c8a 100644 --- a/drivers/base/power/generic_ops.c +++ b/drivers/base/power/generic_ops.c | |||
@@ -97,16 +97,16 @@ int pm_generic_prepare(struct device *dev) | |||
97 | * @event: PM transition of the system under way. | 97 | * @event: PM transition of the system under way. |
98 | * @bool: Whether or not this is the "noirq" stage. | 98 | * @bool: Whether or not this is the "noirq" stage. |
99 | * | 99 | * |
100 | * If the device has not been suspended at run time, execute the | 100 | * Execute the suspend/freeze/poweroff/thaw callback provided by the driver of |
101 | * suspend/freeze/poweroff/thaw callback provided by its driver, if defined, and | 101 | * @dev, if defined, and return its error code. Return 0 if the callback is |
102 | * return its error code. Otherwise, return zero. | 102 | * not present. |
103 | */ | 103 | */ |
104 | static int __pm_generic_call(struct device *dev, int event, bool noirq) | 104 | static int __pm_generic_call(struct device *dev, int event, bool noirq) |
105 | { | 105 | { |
106 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; | 106 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
107 | int (*callback)(struct device *); | 107 | int (*callback)(struct device *); |
108 | 108 | ||
109 | if (!pm || pm_runtime_suspended(dev)) | 109 | if (!pm) |
110 | return 0; | 110 | return 0; |
111 | 111 | ||
112 | switch (event) { | 112 | switch (event) { |
@@ -217,14 +217,12 @@ EXPORT_SYMBOL_GPL(pm_generic_thaw); | |||
217 | * @bool: Whether or not this is the "noirq" stage. | 217 | * @bool: Whether or not this is the "noirq" stage. |
218 | * | 218 | * |
219 | * Execute the resume/resotre callback provided by the @dev's driver, if | 219 | * Execute the resume/resotre callback provided by the @dev's driver, if |
220 | * defined. If it returns 0, change the device's runtime PM status to 'active'. | 220 | * defined, and return its error code. Return 0 if the callback is not present. |
221 | * Return the callback's error code. | ||
222 | */ | 221 | */ |
223 | static int __pm_generic_resume(struct device *dev, int event, bool noirq) | 222 | static int __pm_generic_resume(struct device *dev, int event, bool noirq) |
224 | { | 223 | { |
225 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; | 224 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
226 | int (*callback)(struct device *); | 225 | int (*callback)(struct device *); |
227 | int ret; | ||
228 | 226 | ||
229 | if (!pm) | 227 | if (!pm) |
230 | return 0; | 228 | return 0; |
@@ -241,17 +239,7 @@ static int __pm_generic_resume(struct device *dev, int event, bool noirq) | |||
241 | break; | 239 | break; |
242 | } | 240 | } |
243 | 241 | ||
244 | if (!callback) | 242 | return callback ? callback(dev) : 0; |
245 | return 0; | ||
246 | |||
247 | ret = callback(dev); | ||
248 | if (!ret && !noirq && pm_runtime_enabled(dev)) { | ||
249 | pm_runtime_disable(dev); | ||
250 | pm_runtime_set_active(dev); | ||
251 | pm_runtime_enable(dev); | ||
252 | } | ||
253 | |||
254 | return ret; | ||
255 | } | 243 | } |
256 | 244 | ||
257 | /** | 245 | /** |