OMAP: PM: Add closures to clkdm_for_each and pwrdm_for_each.
Add some infrastructure to easily iterate over clock and power domains. Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
This commit is contained in:
committed by
Kevin Hilman
parent
fe617af716
commit
a23456e9b0
@@ -299,7 +299,8 @@ struct clockdomain *clkdm_lookup(const char *name)
|
|||||||
* anything else to indicate failure; or -EINVAL if the function pointer
|
* anything else to indicate failure; or -EINVAL if the function pointer
|
||||||
* is null.
|
* is null.
|
||||||
*/
|
*/
|
||||||
int clkdm_for_each(int (*fn)(struct clockdomain *clkdm))
|
int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
|
||||||
|
void *user)
|
||||||
{
|
{
|
||||||
struct clockdomain *clkdm;
|
struct clockdomain *clkdm;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -309,7 +310,7 @@ int clkdm_for_each(int (*fn)(struct clockdomain *clkdm))
|
|||||||
|
|
||||||
mutex_lock(&clkdm_mutex);
|
mutex_lock(&clkdm_mutex);
|
||||||
list_for_each_entry(clkdm, &clkdm_list, node) {
|
list_for_each_entry(clkdm, &clkdm_list, node) {
|
||||||
ret = (*fn)(clkdm);
|
ret = (*fn)(clkdm, user);
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -333,7 +333,7 @@ static struct platform_suspend_ops omap_pm_ops = {
|
|||||||
.valid = suspend_valid_only_mem,
|
.valid = suspend_valid_only_mem,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int _pm_clkdm_enable_hwsup(struct clockdomain *clkdm)
|
static int _pm_clkdm_enable_hwsup(struct clockdomain *clkdm, void *unused)
|
||||||
{
|
{
|
||||||
omap2_clkdm_allow_idle(clkdm);
|
omap2_clkdm_allow_idle(clkdm);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -385,7 +385,7 @@ static void __init prcm_setup_regs(void)
|
|||||||
omap2_clkdm_sleep(gfx_clkdm);
|
omap2_clkdm_sleep(gfx_clkdm);
|
||||||
|
|
||||||
/* Enable clockdomain hardware-supervised control for all clkdms */
|
/* Enable clockdomain hardware-supervised control for all clkdms */
|
||||||
clkdm_for_each(_pm_clkdm_enable_hwsup);
|
clkdm_for_each(_pm_clkdm_enable_hwsup, NULL);
|
||||||
|
|
||||||
/* Enable clock autoidle for all domains */
|
/* Enable clock autoidle for all domains */
|
||||||
cm_write_mod_reg(OMAP24XX_AUTO_CAM |
|
cm_write_mod_reg(OMAP24XX_AUTO_CAM |
|
||||||
|
@@ -664,7 +664,7 @@ static void __init prcm_setup_regs(void)
|
|||||||
omap3_d2d_idle();
|
omap3_d2d_idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init pwrdms_setup(struct powerdomain *pwrdm)
|
static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
|
||||||
{
|
{
|
||||||
struct power_state *pwrst;
|
struct power_state *pwrst;
|
||||||
|
|
||||||
@@ -689,7 +689,7 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm)
|
|||||||
* supported. Initiate sleep transition for other clockdomains, if
|
* supported. Initiate sleep transition for other clockdomains, if
|
||||||
* they are not used
|
* they are not used
|
||||||
*/
|
*/
|
||||||
static int __init clkdms_setup(struct clockdomain *clkdm)
|
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);
|
omap2_clkdm_allow_idle(clkdm);
|
||||||
@@ -722,13 +722,13 @@ static int __init omap3_pm_init(void)
|
|||||||
goto err1;
|
goto err1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pwrdm_for_each(pwrdms_setup);
|
ret = pwrdm_for_each(pwrdms_setup, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk(KERN_ERR "Failed to setup powerdomains\n");
|
printk(KERN_ERR "Failed to setup powerdomains\n");
|
||||||
goto err2;
|
goto err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) clkdm_for_each(clkdms_setup);
|
(void) clkdm_for_each(clkdms_setup, NULL);
|
||||||
|
|
||||||
mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
|
mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
|
||||||
if (mpu_pwrdm == NULL) {
|
if (mpu_pwrdm == NULL) {
|
||||||
|
@@ -95,7 +95,8 @@ int clkdm_register(struct clockdomain *clkdm);
|
|||||||
int clkdm_unregister(struct clockdomain *clkdm);
|
int clkdm_unregister(struct clockdomain *clkdm);
|
||||||
struct clockdomain *clkdm_lookup(const char *name);
|
struct clockdomain *clkdm_lookup(const char *name);
|
||||||
|
|
||||||
int clkdm_for_each(int (*fn)(struct clockdomain *clkdm));
|
int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
|
||||||
|
void *user);
|
||||||
struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm);
|
struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm);
|
||||||
|
|
||||||
void omap2_clkdm_allow_idle(struct clockdomain *clkdm);
|
void omap2_clkdm_allow_idle(struct clockdomain *clkdm);
|
||||||
|
@@ -128,7 +128,8 @@ int pwrdm_register(struct powerdomain *pwrdm);
|
|||||||
int pwrdm_unregister(struct powerdomain *pwrdm);
|
int pwrdm_unregister(struct powerdomain *pwrdm);
|
||||||
struct powerdomain *pwrdm_lookup(const char *name);
|
struct powerdomain *pwrdm_lookup(const char *name);
|
||||||
|
|
||||||
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm));
|
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
|
||||||
|
void *user);
|
||||||
|
|
||||||
int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
|
int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
|
||||||
int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
|
int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
|
||||||
|
Reference in New Issue
Block a user