Commit 5248051b9afb6684cd817b2fbdaefa5063761dab
1 parent
e529192883
Exists in
master
and in
6 other branches
PM / Domains: Move code from under #ifdef CONFIG_PM_RUNTIME (v2)
There is some code in drivers/base/power/domain.c that will be useful for both runtime PM and system-wide power transitions, so make it depend on CONFIG_PM instead of CONFIG_PM_RUNTIME. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Kevin Hilman <khilman@ti.com>
Showing 1 changed file with 65 additions and 55 deletions Side-by-side Diff
drivers/base/power/domain.c
... | ... | @@ -14,8 +14,16 @@ |
14 | 14 | #include <linux/slab.h> |
15 | 15 | #include <linux/err.h> |
16 | 16 | |
17 | -#ifdef CONFIG_PM_RUNTIME | |
17 | +#ifdef CONFIG_PM | |
18 | 18 | |
19 | +static struct generic_pm_domain *dev_to_genpd(struct device *dev) | |
20 | +{ | |
21 | + if (IS_ERR_OR_NULL(dev->pm_domain)) | |
22 | + return ERR_PTR(-EINVAL); | |
23 | + | |
24 | + return container_of(dev->pm_domain, struct generic_pm_domain, domain); | |
25 | +} | |
26 | + | |
19 | 27 | static void genpd_sd_counter_dec(struct generic_pm_domain *genpd) |
20 | 28 | { |
21 | 29 | if (!WARN_ON(genpd->sd_count == 0)) |
... | ... | @@ -23,6 +31,58 @@ |
23 | 31 | } |
24 | 32 | |
25 | 33 | /** |
34 | + * pm_genpd_poweron - Restore power to a given PM domain and its parents. | |
35 | + * @genpd: PM domain to power up. | |
36 | + * | |
37 | + * Restore power to @genpd and all of its parents so that it is possible to | |
38 | + * resume a device belonging to it. | |
39 | + */ | |
40 | +static int pm_genpd_poweron(struct generic_pm_domain *genpd) | |
41 | +{ | |
42 | + int ret = 0; | |
43 | + | |
44 | + start: | |
45 | + if (genpd->parent) | |
46 | + mutex_lock(&genpd->parent->lock); | |
47 | + mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING); | |
48 | + | |
49 | + if (!genpd->power_is_off) | |
50 | + goto out; | |
51 | + | |
52 | + if (genpd->parent && genpd->parent->power_is_off) { | |
53 | + mutex_unlock(&genpd->lock); | |
54 | + mutex_unlock(&genpd->parent->lock); | |
55 | + | |
56 | + ret = pm_genpd_poweron(genpd->parent); | |
57 | + if (ret) | |
58 | + return ret; | |
59 | + | |
60 | + goto start; | |
61 | + } | |
62 | + | |
63 | + if (genpd->power_on) { | |
64 | + int ret = genpd->power_on(genpd); | |
65 | + if (ret) | |
66 | + goto out; | |
67 | + } | |
68 | + | |
69 | + genpd->power_is_off = false; | |
70 | + if (genpd->parent) | |
71 | + genpd->parent->sd_count++; | |
72 | + | |
73 | + out: | |
74 | + mutex_unlock(&genpd->lock); | |
75 | + if (genpd->parent) | |
76 | + mutex_unlock(&genpd->parent->lock); | |
77 | + | |
78 | + return ret; | |
79 | +} | |
80 | + | |
81 | +#endif /* CONFIG_PM */ | |
82 | + | |
83 | +#ifdef CONFIG_PM_RUNTIME | |
84 | + | |
85 | +/** | |
26 | 86 | * __pm_genpd_save_device - Save the pre-suspend state of a device. |
27 | 87 | * @dle: Device list entry of the device to save the state of. |
28 | 88 | * @genpd: PM domain the device belongs to. |
29 | 89 | |
... | ... | @@ -174,11 +234,10 @@ |
174 | 234 | |
175 | 235 | dev_dbg(dev, "%s()\n", __func__); |
176 | 236 | |
177 | - if (IS_ERR_OR_NULL(dev->pm_domain)) | |
237 | + genpd = dev_to_genpd(dev); | |
238 | + if (IS_ERR(genpd)) | |
178 | 239 | return -EINVAL; |
179 | 240 | |
180 | - genpd = container_of(dev->pm_domain, struct generic_pm_domain, domain); | |
181 | - | |
182 | 241 | if (genpd->parent) |
183 | 242 | mutex_lock(&genpd->parent->lock); |
184 | 243 | mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING); |
... | ... | @@ -201,54 +260,6 @@ |
201 | 260 | } |
202 | 261 | |
203 | 262 | /** |
204 | - * pm_genpd_poweron - Restore power to a given PM domain and its parents. | |
205 | - * @genpd: PM domain to power up. | |
206 | - * | |
207 | - * Restore power to @genpd and all of its parents so that it is possible to | |
208 | - * resume a device belonging to it. | |
209 | - */ | |
210 | -static int pm_genpd_poweron(struct generic_pm_domain *genpd) | |
211 | -{ | |
212 | - int ret = 0; | |
213 | - | |
214 | - start: | |
215 | - if (genpd->parent) | |
216 | - mutex_lock(&genpd->parent->lock); | |
217 | - mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING); | |
218 | - | |
219 | - if (!genpd->power_is_off) | |
220 | - goto out; | |
221 | - | |
222 | - if (genpd->parent && genpd->parent->power_is_off) { | |
223 | - mutex_unlock(&genpd->lock); | |
224 | - mutex_unlock(&genpd->parent->lock); | |
225 | - | |
226 | - ret = pm_genpd_poweron(genpd->parent); | |
227 | - if (ret) | |
228 | - return ret; | |
229 | - | |
230 | - goto start; | |
231 | - } | |
232 | - | |
233 | - if (genpd->power_on) { | |
234 | - int ret = genpd->power_on(genpd); | |
235 | - if (ret) | |
236 | - goto out; | |
237 | - } | |
238 | - | |
239 | - genpd->power_is_off = false; | |
240 | - if (genpd->parent) | |
241 | - genpd->parent->sd_count++; | |
242 | - | |
243 | - out: | |
244 | - mutex_unlock(&genpd->lock); | |
245 | - if (genpd->parent) | |
246 | - mutex_unlock(&genpd->parent->lock); | |
247 | - | |
248 | - return ret; | |
249 | -} | |
250 | - | |
251 | -/** | |
252 | 263 | * pm_genpd_runtime_resume - Resume a device belonging to I/O PM domain. |
253 | 264 | * @dev: Device to resume. |
254 | 265 | * |
255 | 266 | |
... | ... | @@ -264,10 +275,9 @@ |
264 | 275 | |
265 | 276 | dev_dbg(dev, "%s()\n", __func__); |
266 | 277 | |
267 | - if (IS_ERR_OR_NULL(dev->pm_domain)) | |
278 | + genpd = dev_to_genpd(dev); | |
279 | + if (IS_ERR(genpd)) | |
268 | 280 | return -EINVAL; |
269 | - | |
270 | - genpd = container_of(dev->pm_domain, struct generic_pm_domain, domain); | |
271 | 281 | |
272 | 282 | ret = pm_genpd_poweron(genpd); |
273 | 283 | if (ret) |