Example #1
0
static int pd_power_up_a3rv(struct generic_pm_domain *genpd)
{
	int ret = pd_power_up(genpd);

	/* force A4LC on after A3RV has been requested on */
	pm_genpd_poweron(&sh7372_a4lc.genpd);

	return ret;
}
Example #2
0
static int pd_power_down_a3rv(struct generic_pm_domain *genpd)
{
	int ret = pd_power_down(genpd);

	/* try to power down A4LC after A3RV is requested off */
	pm_genpd_poweron(&sh7372_a4lc.genpd);
	genpd_queue_power_off_work(&sh7372_a4lc.genpd);

	return ret;
}
Example #3
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.
 */
int pm_genpd_poweron(struct generic_pm_domain *genpd)
{
	struct generic_pm_domain *parent = genpd->parent;
	int ret = 0;

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

	if (genpd->status == GPD_STATE_ACTIVE
	    || (genpd->prepared_count > 0 && genpd->suspend_power_off))
		goto out;

	if (genpd->status != GPD_STATE_POWER_OFF) {
		genpd_set_active(genpd);
		goto out;
	}

	if (parent && parent->status != GPD_STATE_ACTIVE) {
		mutex_unlock(&genpd->lock);
		genpd_release_lock(parent);

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

		goto start;
	}

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

	genpd_set_active(genpd);
	if (parent)
		parent->sd_count++;

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

	return ret;
}