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; }
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; }
/** * 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; }