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: Rajendra Nayak <rnayak@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
This commit is contained in:
parent
68b921ad7f
commit
5cd1937b6d
|
@ -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)
|
||||||
* 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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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)
|
||||||
* 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)
|
||||||
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)
|
||||||
* 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)
|
||||||
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);
|
||||||
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);
|
||||||
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)
|
||||||
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)
|
||||||
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 = {
|
||||||
.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 = {
|
||||||
.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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 @@ console_still_active:
|
||||||
|
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue