Commit 5cd1937b authored by Rajendra Nayak's avatar Rajendra Nayak Committed by Paul Walmsley

OMAP: clockdomain: Arch specific funcs for hwsup control of clkdm

Define the following architecture specific funtions for omap2/3/4
.clkdm_allow_idle
.clkdm_deny_idle

Convert the platform-independent framework to call these functions.
Also rename the api's by removing the omap2_ preamble.
Hence call omap2_clkdm_allow_idle as clkdm_allow_idle and
omap2_clkdm_deny_idle as clkdm_deny_idle.

Make the _clkdm_add_autodeps and _clkdm_del_autodeps as non-static
so they can be accessed from OMAP2/3 platform specific code.
Signed-off-by: default avatarRajendra Nayak <rnayak@ti.com>
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
parent 68b921ad
...@@ -178,7 +178,7 @@ static void _autodep_lookup(struct clkdm_autodep *autodep) ...@@ -178,7 +178,7 @@ static void _autodep_lookup(struct clkdm_autodep *autodep)
* XXX autodeps are deprecated and should be removed at the earliest * XXX autodeps are deprecated and should be removed at the earliest
* opportunity * opportunity
*/ */
static void _clkdm_add_autodeps(struct clockdomain *clkdm) void _clkdm_add_autodeps(struct clockdomain *clkdm)
{ {
struct clkdm_autodep *autodep; struct clkdm_autodep *autodep;
...@@ -212,7 +212,7 @@ static void _clkdm_add_autodeps(struct clockdomain *clkdm) ...@@ -212,7 +212,7 @@ static void _clkdm_add_autodeps(struct clockdomain *clkdm)
* XXX autodeps are deprecated and should be removed at the earliest * XXX autodeps are deprecated and should be removed at the earliest
* opportunity * opportunity
*/ */
static void _clkdm_del_autodeps(struct clockdomain *clkdm) void _clkdm_del_autodeps(struct clockdomain *clkdm)
{ {
struct clkdm_autodep *autodep; struct clkdm_autodep *autodep;
...@@ -357,7 +357,7 @@ void clkdm_init(struct clockdomain **clkdms, ...@@ -357,7 +357,7 @@ void clkdm_init(struct clockdomain **clkdms,
if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
clkdm_wakeup(clkdm); clkdm_wakeup(clkdm);
else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO) else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO)
omap2_clkdm_deny_idle(clkdm); clkdm_deny_idle(clkdm);
_resolve_clkdm_deps(clkdm, clkdm->wkdep_srcs); _resolve_clkdm_deps(clkdm, clkdm->wkdep_srcs);
clkdm_clear_all_wkdeps(clkdm); clkdm_clear_all_wkdeps(clkdm);
...@@ -821,7 +821,7 @@ int clkdm_wakeup(struct clockdomain *clkdm) ...@@ -821,7 +821,7 @@ int clkdm_wakeup(struct clockdomain *clkdm)
} }
/** /**
* omap2_clkdm_allow_idle - enable hwsup idle transitions for clkdm * clkdm_allow_idle - enable hwsup idle transitions for clkdm
* @clkdm: struct clockdomain * * @clkdm: struct clockdomain *
* *
* Allow the hardware to automatically switch the clockdomain @clkdm into * Allow the hardware to automatically switch the clockdomain @clkdm into
...@@ -830,7 +830,7 @@ int clkdm_wakeup(struct clockdomain *clkdm) ...@@ -830,7 +830,7 @@ int clkdm_wakeup(struct clockdomain *clkdm)
* framework, wkdep/sleepdep autodependencies are added; this is so * framework, wkdep/sleepdep autodependencies are added; this is so
* device drivers can read and write to the device. No return value. * device drivers can read and write to the device. No return value.
*/ */
void omap2_clkdm_allow_idle(struct clockdomain *clkdm) void clkdm_allow_idle(struct clockdomain *clkdm)
{ {
if (!clkdm) if (!clkdm)
return; return;
...@@ -841,27 +841,18 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm) ...@@ -841,27 +841,18 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
return; return;
} }
if (!arch_clkdm || !arch_clkdm->clkdm_allow_idle)
return;
pr_debug("clockdomain: enabling automatic idle transitions for %s\n", pr_debug("clockdomain: enabling automatic idle transitions for %s\n",
clkdm->name); clkdm->name);
/* arch_clkdm->clkdm_allow_idle(clkdm);
* XXX This should be removed once TI adds wakeup/sleep
* dependency code and data for OMAP4.
*/
if (cpu_is_omap44xx()) {
pr_err("clockdomain: %s: OMAP4 wakeup/sleep dependency support: not yet implemented\n", clkdm->name);
} else {
if (atomic_read(&clkdm->usecount) > 0)
_clkdm_add_autodeps(clkdm);
}
_enable_hwsup(clkdm);
pwrdm_clkdm_state_switch(clkdm); pwrdm_clkdm_state_switch(clkdm);
} }
/** /**
* omap2_clkdm_deny_idle - disable hwsup idle transitions for clkdm * clkdm_deny_idle - disable hwsup idle transitions for clkdm
* @clkdm: struct clockdomain * * @clkdm: struct clockdomain *
* *
* Prevent the hardware from automatically switching the clockdomain * Prevent the hardware from automatically switching the clockdomain
...@@ -869,7 +860,7 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm) ...@@ -869,7 +860,7 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
* downstream clocks enabled in the clock framework, wkdep/sleepdep * downstream clocks enabled in the clock framework, wkdep/sleepdep
* autodependencies are removed. No return value. * autodependencies are removed. No return value.
*/ */
void omap2_clkdm_deny_idle(struct clockdomain *clkdm) void clkdm_deny_idle(struct clockdomain *clkdm)
{ {
if (!clkdm) if (!clkdm)
return; return;
...@@ -880,21 +871,13 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm) ...@@ -880,21 +871,13 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
return; return;
} }
if (!arch_clkdm || !arch_clkdm->clkdm_deny_idle)
return;
pr_debug("clockdomain: disabling automatic idle transitions for %s\n", pr_debug("clockdomain: disabling automatic idle transitions for %s\n",
clkdm->name); clkdm->name);
_disable_hwsup(clkdm); arch_clkdm->clkdm_deny_idle(clkdm);
/*
* XXX This should be removed once TI adds wakeup/sleep
* dependency code and data for OMAP4.
*/
if (cpu_is_omap44xx()) {
pr_err("clockdomain: %s: OMAP4 wakeup/sleep dependency support: not yet implemented\n", clkdm->name);
} else {
if (atomic_read(&clkdm->usecount) > 0)
_clkdm_del_autodeps(clkdm);
}
} }
......
...@@ -167,8 +167,8 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); ...@@ -167,8 +167,8 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm);
void omap2_clkdm_allow_idle(struct clockdomain *clkdm); void clkdm_allow_idle(struct clockdomain *clkdm);
void omap2_clkdm_deny_idle(struct clockdomain *clkdm); void clkdm_deny_idle(struct clockdomain *clkdm);
int clkdm_wakeup(struct clockdomain *clkdm); int clkdm_wakeup(struct clockdomain *clkdm);
int clkdm_sleep(struct clockdomain *clkdm); int clkdm_sleep(struct clockdomain *clkdm);
...@@ -179,6 +179,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); ...@@ -179,6 +179,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk);
extern void __init omap2xxx_clockdomains_init(void); extern void __init omap2xxx_clockdomains_init(void);
extern void __init omap3xxx_clockdomains_init(void); extern void __init omap3xxx_clockdomains_init(void);
extern void __init omap44xx_clockdomains_init(void); extern void __init omap44xx_clockdomains_init(void);
extern void _clkdm_add_autodeps(struct clockdomain *clkdm);
extern void _clkdm_del_autodeps(struct clockdomain *clkdm);
extern struct clkdm_ops omap2_clkdm_operations; extern struct clkdm_ops omap2_clkdm_operations;
extern struct clkdm_ops omap3_clkdm_operations; extern struct clkdm_ops omap3_clkdm_operations;
......
...@@ -128,6 +128,24 @@ static int omap2_clkdm_wakeup(struct clockdomain *clkdm) ...@@ -128,6 +128,24 @@ static int omap2_clkdm_wakeup(struct clockdomain *clkdm)
return 0; return 0;
} }
static void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
{
if (atomic_read(&clkdm->usecount) > 0)
_clkdm_add_autodeps(clkdm);
omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
clkdm->clktrctrl_mask);
}
static void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
{
omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
clkdm->clktrctrl_mask);
if (atomic_read(&clkdm->usecount) > 0)
_clkdm_del_autodeps(clkdm);
}
static int omap3_clkdm_sleep(struct clockdomain *clkdm) static int omap3_clkdm_sleep(struct clockdomain *clkdm)
{ {
omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs,
...@@ -142,6 +160,24 @@ static int omap3_clkdm_wakeup(struct clockdomain *clkdm) ...@@ -142,6 +160,24 @@ static int omap3_clkdm_wakeup(struct clockdomain *clkdm)
return 0; return 0;
} }
static void omap3_clkdm_allow_idle(struct clockdomain *clkdm)
{
if (atomic_read(&clkdm->usecount) > 0)
_clkdm_add_autodeps(clkdm);
omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
clkdm->clktrctrl_mask);
}
static void omap3_clkdm_deny_idle(struct clockdomain *clkdm)
{
omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
clkdm->clktrctrl_mask);
if (atomic_read(&clkdm->usecount) > 0)
_clkdm_del_autodeps(clkdm);
}
struct clkdm_ops omap2_clkdm_operations = { struct clkdm_ops omap2_clkdm_operations = {
.clkdm_add_wkdep = omap2_clkdm_add_wkdep, .clkdm_add_wkdep = omap2_clkdm_add_wkdep,
.clkdm_del_wkdep = omap2_clkdm_del_wkdep, .clkdm_del_wkdep = omap2_clkdm_del_wkdep,
...@@ -149,6 +185,8 @@ struct clkdm_ops omap2_clkdm_operations = { ...@@ -149,6 +185,8 @@ struct clkdm_ops omap2_clkdm_operations = {
.clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps, .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps,
.clkdm_sleep = omap2_clkdm_sleep, .clkdm_sleep = omap2_clkdm_sleep,
.clkdm_wakeup = omap2_clkdm_wakeup, .clkdm_wakeup = omap2_clkdm_wakeup,
.clkdm_allow_idle = omap2_clkdm_allow_idle,
.clkdm_deny_idle = omap2_clkdm_deny_idle,
}; };
struct clkdm_ops omap3_clkdm_operations = { struct clkdm_ops omap3_clkdm_operations = {
...@@ -162,4 +200,6 @@ struct clkdm_ops omap3_clkdm_operations = { ...@@ -162,4 +200,6 @@ struct clkdm_ops omap3_clkdm_operations = {
.clkdm_clear_all_sleepdeps = omap3_clkdm_clear_all_sleepdeps, .clkdm_clear_all_sleepdeps = omap3_clkdm_clear_all_sleepdeps,
.clkdm_sleep = omap3_clkdm_sleep, .clkdm_sleep = omap3_clkdm_sleep,
.clkdm_wakeup = omap3_clkdm_wakeup, .clkdm_wakeup = omap3_clkdm_wakeup,
.clkdm_allow_idle = omap3_clkdm_allow_idle,
.clkdm_deny_idle = omap3_clkdm_deny_idle,
}; };
...@@ -29,7 +29,21 @@ static int omap4_clkdm_wakeup(struct clockdomain *clkdm) ...@@ -29,7 +29,21 @@ static int omap4_clkdm_wakeup(struct clockdomain *clkdm)
return 0; return 0;
} }
static void omap4_clkdm_allow_idle(struct clockdomain *clkdm)
{
omap4_cminst_clkdm_enable_hwsup(clkdm->prcm_partition,
clkdm->cm_inst, clkdm->clkdm_offs);
}
static void omap4_clkdm_deny_idle(struct clockdomain *clkdm)
{
omap4_cminst_clkdm_disable_hwsup(clkdm->prcm_partition,
clkdm->cm_inst, clkdm->clkdm_offs);
}
struct clkdm_ops omap4_clkdm_operations = { struct clkdm_ops omap4_clkdm_operations = {
.clkdm_sleep = omap4_clkdm_sleep, .clkdm_sleep = omap4_clkdm_sleep,
.clkdm_wakeup = omap4_clkdm_wakeup, .clkdm_wakeup = omap4_clkdm_wakeup,
.clkdm_allow_idle = omap4_clkdm_allow_idle,
.clkdm_deny_idle = omap4_clkdm_deny_idle,
}; };
...@@ -99,14 +99,14 @@ static int omap3_idle_bm_check(void) ...@@ -99,14 +99,14 @@ static int omap3_idle_bm_check(void)
static int _cpuidle_allow_idle(struct powerdomain *pwrdm, static int _cpuidle_allow_idle(struct powerdomain *pwrdm,
struct clockdomain *clkdm) struct clockdomain *clkdm)
{ {
omap2_clkdm_allow_idle(clkdm); clkdm_allow_idle(clkdm);
return 0; return 0;
} }
static int _cpuidle_deny_idle(struct powerdomain *pwrdm, static int _cpuidle_deny_idle(struct powerdomain *pwrdm,
struct clockdomain *clkdm) struct clockdomain *clkdm)
{ {
omap2_clkdm_deny_idle(clkdm); clkdm_deny_idle(clkdm);
return 0; return 0;
} }
......
...@@ -140,7 +140,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state) ...@@ -140,7 +140,7 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
switch (sleep_switch) { switch (sleep_switch) {
case FORCEWAKEUP_SWITCH: case FORCEWAKEUP_SWITCH:
if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO) if (pwrdm->pwrdm_clkdms[0]->flags & CLKDM_CAN_ENABLE_AUTO)
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
else else
clkdm_sleep(pwrdm->pwrdm_clkdms[0]); clkdm_sleep(pwrdm->pwrdm_clkdms[0]);
break; break;
......
...@@ -367,7 +367,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) ...@@ -367,7 +367,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
clkdm_clear_all_sleepdeps(clkdm); clkdm_clear_all_sleepdeps(clkdm);
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
omap2_clkdm_allow_idle(clkdm); clkdm_allow_idle(clkdm);
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
atomic_read(&clkdm->usecount) == 0) atomic_read(&clkdm->usecount) == 0)
clkdm_sleep(clkdm); clkdm_sleep(clkdm);
......
...@@ -496,7 +496,7 @@ void omap_sram_idle(void) ...@@ -496,7 +496,7 @@ void omap_sram_idle(void)
pwrdm_post_transition(); pwrdm_post_transition();
omap2_clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]); clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
} }
int omap3_can_sleep(void) int omap3_can_sleep(void)
...@@ -990,7 +990,7 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) ...@@ -990,7 +990,7 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
{ {
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
omap2_clkdm_allow_idle(clkdm); clkdm_allow_idle(clkdm);
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
atomic_read(&clkdm->usecount) == 0) atomic_read(&clkdm->usecount) == 0)
clkdm_sleep(clkdm); clkdm_sleep(clkdm);
......
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