Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5248051b authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

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: default avatarRafael J. Wysocki <rjw@sisk.pl>
Reviewed-by: default avatarKevin Hilman <khilman@ti.com>
parent e5291928
Loading
Loading
Loading
Loading
+65 −55
Original line number Diff line number Diff line
@@ -14,7 +14,15 @@
#include <linux/slab.h>
#include <linux/err.h>

#ifdef CONFIG_PM_RUNTIME
#ifdef CONFIG_PM

static struct generic_pm_domain *dev_to_genpd(struct device *dev)
{
	if (IS_ERR_OR_NULL(dev->pm_domain))
		return ERR_PTR(-EINVAL);

	return container_of(dev->pm_domain, struct generic_pm_domain, domain);
}

static void genpd_sd_counter_dec(struct generic_pm_domain *genpd)
{
@@ -22,6 +30,58 @@ static void genpd_sd_counter_dec(struct generic_pm_domain *genpd)
			genpd->sd_count--;
}

/**
 * pm_genpd_poweron - Restore power to a given PM domain and its parents.
 * @genpd: PM domain to power up.
 *
 * Restore power to @genpd and all of its parents so that it is possible to
 * resume a device belonging to it.
 */
static int pm_genpd_poweron(struct generic_pm_domain *genpd)
{
	int ret = 0;

 start:
	if (genpd->parent)
		mutex_lock(&genpd->parent->lock);
	mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING);

	if (!genpd->power_is_off)
		goto out;

	if (genpd->parent && genpd->parent->power_is_off) {
		mutex_unlock(&genpd->lock);
		mutex_unlock(&genpd->parent->lock);

		ret = pm_genpd_poweron(genpd->parent);
		if (ret)
			return ret;

		goto start;
	}

	if (genpd->power_on) {
		int ret = genpd->power_on(genpd);
		if (ret)
			goto out;
	}

	genpd->power_is_off = false;
	if (genpd->parent)
		genpd->parent->sd_count++;

 out:
	mutex_unlock(&genpd->lock);
	if (genpd->parent)
		mutex_unlock(&genpd->parent->lock);

	return ret;
}

#endif /* CONFIG_PM */

#ifdef CONFIG_PM_RUNTIME

/**
 * __pm_genpd_save_device - Save the pre-suspend state of a device.
 * @dle: Device list entry of the device to save the state of.
@@ -174,11 +234,10 @@ static int pm_genpd_runtime_suspend(struct device *dev)

	dev_dbg(dev, "%s()\n", __func__);

	if (IS_ERR_OR_NULL(dev->pm_domain))
	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

	genpd = container_of(dev->pm_domain, struct generic_pm_domain, domain);

	if (genpd->parent)
		mutex_lock(&genpd->parent->lock);
	mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING);
@@ -200,54 +259,6 @@ static int pm_genpd_runtime_suspend(struct device *dev)
	return 0;
}

/**
 * pm_genpd_poweron - Restore power to a given PM domain and its parents.
 * @genpd: PM domain to power up.
 *
 * Restore power to @genpd and all of its parents so that it is possible to
 * resume a device belonging to it.
 */
static int pm_genpd_poweron(struct generic_pm_domain *genpd)
{
	int ret = 0;

 start:
	if (genpd->parent)
		mutex_lock(&genpd->parent->lock);
	mutex_lock_nested(&genpd->lock, SINGLE_DEPTH_NESTING);

	if (!genpd->power_is_off)
		goto out;

	if (genpd->parent && genpd->parent->power_is_off) {
		mutex_unlock(&genpd->lock);
		mutex_unlock(&genpd->parent->lock);

		ret = pm_genpd_poweron(genpd->parent);
		if (ret)
			return ret;

		goto start;
	}

	if (genpd->power_on) {
		int ret = genpd->power_on(genpd);
		if (ret)
			goto out;
	}

	genpd->power_is_off = false;
	if (genpd->parent)
		genpd->parent->sd_count++;

 out:
	mutex_unlock(&genpd->lock);
	if (genpd->parent)
		mutex_unlock(&genpd->parent->lock);

	return ret;
}

/**
 * pm_genpd_runtime_resume - Resume a device belonging to I/O PM domain.
 * @dev: Device to resume.
@@ -264,11 +275,10 @@ static int pm_genpd_runtime_resume(struct device *dev)

	dev_dbg(dev, "%s()\n", __func__);

	if (IS_ERR_OR_NULL(dev->pm_domain))
	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

	genpd = container_of(dev->pm_domain, struct generic_pm_domain, domain);

	ret = pm_genpd_poweron(genpd);
	if (ret)
		return ret;