summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2012-02-23 17:28:06 +0800
committerAndy Green <andy.green@linaro.org>2012-06-20 10:27:21 +0800
commitd224dafb7aefec1ad6e903b4b3e722d07a751a4e (patch)
treeafee9d386cfd5654c618b1072cb4a228a03db74c
parent8906cc74fa557210c1be9af7492ac6149faaf458 (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.c46
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