Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@xxxxxxxxx> --- arch/arm/mach-omap2/powerdomain.c | 48 +++++++++++++++++++++++++++++- include/asm-arm/arch-omap/powerdomain.h | 9 +++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 7615f9d..721f73c 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -102,6 +102,27 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm, return pd->pwrdm; } +static int pwr_domain_save_state_cb(struct powerdomain *pwrdm, void *user) +{ + pwrdm_save_state(pwrdm); + + return 0; +} + +static int pwr_domain_count_off_mode_cb(struct powerdomain *pwrdm, void *user) +{ + int prev; + + prev = pwrdm_read_prev_pwrst(pwrdm); + + if (prev != PWRDM_POWER_OFF && pwrdm->state != prev) + pwrdm->offstate_count++; + + pwrdm->state = pwrdm_read_pwrst(pwrdm); + + return 0; +} + /* Public functions */ @@ -217,7 +238,7 @@ struct powerdomain *pwrdm_lookup(const char *name) * anything else to indicate failure; or -EINVAL if the function * pointer is null. */ -int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm)) +int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), void *user) { struct powerdomain *temp_pwrdm; unsigned long flags; @@ -228,7 +249,7 @@ int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm)) read_lock_irqsave(&pwrdm_rwlock, flags); list_for_each_entry(temp_pwrdm, &pwrdm_list, node) { - ret = (*fn)(temp_pwrdm); + ret = (*fn)(temp_pwrdm, user); if (ret) break; } @@ -1110,4 +1131,27 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm) return 0; } +void pwrdm_save_state(struct powerdomain *pwrdm) +{ + pwrdm->state = pwrdm_read_pwrst(pwrdm); +} + +void pwrdm_check_off_mode(struct powerdomain *pwrdm) +{ + int state; + + state = pwrdm_read_pwrst(pwrdm); + if (pwrdm->state == PWRDM_POWER_OFF && state == PWRDM_POWER_ON) + pwrdm->offstate_count++; +} + +void pwrdm_save_state_all(void) +{ + pwrdm_for_each(pwr_domain_save_state_cb, NULL); +} + +void pwrdm_count_off_mode(void) +{ + pwrdm_for_each(pwr_domain_count_off_mode_cb, NULL); +} diff --git a/include/asm-arm/arch-omap/powerdomain.h b/include/asm-arm/arch-omap/powerdomain.h index 1cd8942..19ad6fd 100644 --- a/include/asm-arm/arch-omap/powerdomain.h +++ b/include/asm-arm/arch-omap/powerdomain.h @@ -117,6 +117,8 @@ struct powerdomain { struct list_head node; + int state; + u32 offstate_count; }; @@ -126,7 +128,8 @@ int pwrdm_register(struct powerdomain *pwrdm); int pwrdm_unregister(struct powerdomain *pwrdm); 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_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); @@ -165,4 +168,8 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm); int pwrdm_wait_transition(struct powerdomain *pwrdm); +void pwrdm_save_state(struct powerdomain *pwrdm); +void pwrdm_check_off_mode(struct powerdomain *pwrdm); +void pwrdm_save_state_all(void); +void pwrdm_count_off_mode(void); #endif -- 1.5.6.3 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html