diff options
author | Nishanth Menon <nm@ti.com> | 2012-02-23 17:28:06 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-06-20 10:27:21 +0800 |
commit | d224dafb7aefec1ad6e903b4b3e722d07a751a4e (patch) | |
tree | afee9d386cfd5654c618b1072cb4a228a03db74c | |
parent | 8906cc74fa557210c1be9af7492ac6149faaf458 (diff) |
OMAP4: PM: Refactor resume pd programing
Move the resume power domain programming into it's own
function as a staging for additional logic.
Signed-off-by: Nishanth Menon <nm@ti.com>
-rw-r--r-- | arch/arm/mach-omap2/pm44xx.c | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index c049ea2ece3..c5626fb2e26 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c @@ -214,10 +214,40 @@ void omap_pm_idle(u32 cpu_id, int state) } #ifdef CONFIG_SUSPEND -static int omap4_pm_suspend(void) +/** + * omap4_restore_pwdms_after_suspend() - Restore powerdomains after suspend + * + * Re-program all powerdomains to saved power domain states. + * + * returns 0 if all power domains hit targeted power state, -1 if any domain + * failed to hit targeted power state (status related to the actual restore + * is not returned). + */ +static int omap4_restore_pwdms_after_suspend(void) { struct power_state *pwrst; int state, ret = 0, logic_state; + + /* Restore next powerdomain state */ + list_for_each_entry(pwrst, &pwrst_list, node) { + state = pwrdm_read_prev_pwrst(pwrst->pwrdm); + if (state > pwrst->next_state) { + pr_info("Powerdomain (%s) didn't enter " + "target state %d\n", + pwrst->pwrdm->name, pwrst->next_state); + ret = -1; + } + omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); + pwrdm_set_logic_retst(pwrst->pwrdm, pwrst->saved_logic_state); + } + + return ret; +} + +static int omap4_pm_suspend(void) +{ + struct power_state *pwrst; + int ret = 0; u32 cpu_id = smp_processor_id(); /* @@ -266,18 +296,8 @@ static int omap4_pm_suspend(void) */ omap_enter_lowpower(cpu_id, PWRDM_POWER_OFF); - /* Restore next powerdomain state */ - list_for_each_entry(pwrst, &pwrst_list, node) { - state = pwrdm_read_prev_pwrst(pwrst->pwrdm); - if (state > pwrst->next_state) { - pr_info("Powerdomain (%s) didn't enter " - "target state %d\n", - pwrst->pwrdm->name, pwrst->next_state); - ret = -1; - } - omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); - pwrdm_set_logic_retst(pwrst->pwrdm, pwrst->saved_logic_state); - } + ret = omap4_restore_pwdms_after_suspend(); + if (ret) pr_crit("Could not enter target state in pm_suspend\n"); else |