Commit c7e678df authored by Tero Kristo's avatar Tero Kristo Committed by Tony Lindgren

PM: Fixed clockdomain state control for OMAP3

Hardware supervised control for clockdomain power state transitions now
enabled in omap3_pm_init(). Also fixed set_pwrdm_state() to allow state
changes between sleep states (i.e. RET<->OFF.)
Signed-off-by: default avatarTero Kristo <tero.kristo@nokia.com>
Acked-by: default avatarPaul Walmsley <paul@pwsan.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent b59bedb5
...@@ -227,28 +227,13 @@ static int omap3_can_sleep(void) ...@@ -227,28 +227,13 @@ static int omap3_can_sleep(void)
return 1; return 1;
} }
/* _clkdm_deny_idle - private callback function used by set_pwrdm_state() */
static int _clkdm_deny_idle(struct powerdomain *pwrdm,
struct clockdomain *clkdm)
{
omap2_clkdm_deny_idle(clkdm);
return 0;
}
/* _clkdm_allow_idle - private callback function used by set_pwrdm_state() */
static int _clkdm_allow_idle(struct powerdomain *pwrdm,
struct clockdomain *clkdm)
{
omap2_clkdm_allow_idle(clkdm);
return 0;
}
/* This sets pwrdm state (other than mpu & core. Currently only ON & /* This sets pwrdm state (other than mpu & core. Currently only ON &
* RET are supported. Function is assuming that clkdm doesn't have * RET are supported. Function is assuming that clkdm doesn't have
* hw_sup mode enabled. */ * hw_sup mode enabled. */
static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state) static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
{ {
u32 cur_state; u32 cur_state;
int sleep_switch = 0;
int ret = 0; int ret = 0;
if (pwrdm == NULL || IS_ERR(pwrdm)) if (pwrdm == NULL || IS_ERR(pwrdm))
...@@ -259,7 +244,11 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state) ...@@ -259,7 +244,11 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
if (cur_state == state) if (cur_state == state)
return ret; return ret;
pwrdm_for_each_clkdm(pwrdm, _clkdm_deny_idle); if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) {
omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
sleep_switch = 1;
pwrdm_wait_transition(pwrdm);
}
ret = pwrdm_set_next_pwrst(pwrdm, state); ret = pwrdm_set_next_pwrst(pwrdm, state);
if (ret) { if (ret) {
...@@ -268,7 +257,10 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state) ...@@ -268,7 +257,10 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
goto err; goto err;
} }
pwrdm_for_each_clkdm(pwrdm, _clkdm_allow_idle); if (sleep_switch) {
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
pwrdm_wait_transition(pwrdm);
}
err: err:
return ret; return ret;
...@@ -540,6 +532,12 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm) ...@@ -540,6 +532,12 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm)
return set_pwrdm_state(pwrst->pwrdm, pwrst->next_state); return set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
} }
static int __init clkdms_setup(struct clockdomain *clkdm)
{
omap2_clkdm_allow_idle(clkdm);
return 0;
}
int __init omap3_pm_init(void) int __init omap3_pm_init(void)
{ {
struct power_state *pwrst; struct power_state *pwrst;
...@@ -566,6 +564,8 @@ int __init omap3_pm_init(void) ...@@ -566,6 +564,8 @@ int __init omap3_pm_init(void)
goto err2; goto err2;
} }
(void) clkdm_for_each(clkdms_setup);
mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
if (mpu_pwrdm == NULL) { if (mpu_pwrdm == NULL) {
printk(KERN_ERR "Failed to get mpu_pwrdm\n"); printk(KERN_ERR "Failed to get mpu_pwrdm\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment