Commit 5248051b9afb6684cd817b2fbdaefa5063761dab

Authored by Rafael J. Wysocki
1 parent e529192883

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)