* [PATCH 0/2] PM counters
@ 2008-09-26 14:12 Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 1/1] Hook into " Peter 'p2' De Schrijver
0 siblings, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-09-26 14:12 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
This patch introduces counters for the various PM states in OMAP3.
Peter 'p2' De Schrijver (2):
PM counter infrastructure.
Hook into PM counters
arch/arm/mach-omap2/clock.c | 2 +
arch/arm/mach-omap2/clockdomain.c | 4 +
arch/arm/mach-omap2/pm34xx.c | 6 ++
arch/arm/mach-omap2/powerdomain.c | 94 +++++++++++++++++++++++++
arch/arm/plat-omap/include/mach/powerdomain.h | 7 ++
5 files changed, 113 insertions(+), 0 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/1] Hook into PM counters
2008-09-26 14:12 [PATCH 0/2] PM counters Peter 'p2' De Schrijver
@ 2008-09-26 14:12 ` Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
2008-09-26 14:18 ` [PATCH 1/1] " Peter 'p2' De Schrijver
0 siblings, 2 replies; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-09-26 14:12 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/clock.c | 2 ++
arch/arm/mach-omap2/clockdomain.c | 4 ++++
arch/arm/mach-omap2/pm34xx.c | 6 ++++++
3 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index c3af24e..dbbc7c8 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -1013,5 +1013,7 @@ void omap2_clk_disable_unused(struct clk *clk)
printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
_omap2_clk_disable(clk);
+ if (clk->clkdm.ptr != NULL)
+ pwrdm_clkdm_state_switch(clk->clkdm.ptr);
}
#endif
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
index fa62f14..5249fe8 100644
--- a/arch/arm/mach-omap2/clockdomain.c
+++ b/arch/arm/mach-omap2/clockdomain.c
@@ -567,6 +567,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_wakeup(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
@@ -618,6 +620,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_sleep(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index a828db6..5913c4d 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -170,6 +170,8 @@ static void omap_sram_idle(void)
disable_smartreflex(SR1);
disable_smartreflex(SR2);
+ pwrdm_pre_suspend();
+
omap2_gpio_prepare_for_retention();
_omap_sram_idle(NULL, save_state);
@@ -179,6 +181,9 @@ static void omap_sram_idle(void)
/* Enable smartreflex after WFI */
enable_smartreflex(SR1);
enable_smartreflex(SR2);
+
+ pwrdm_post_suspend();
+
}
/*
@@ -260,6 +265,7 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
if (sleep_switch) {
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
pwrdm_wait_transition(pwrdm);
+ pwrdm_state_switch(pwrdm);
}
err:
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 1/2] PM counter infrastructure.
2008-09-26 14:12 ` [PATCH 1/1] Hook into " Peter 'p2' De Schrijver
@ 2008-09-26 14:12 ` Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
2008-09-26 14:18 ` [PATCH 1/1] " Peter 'p2' De Schrijver
1 sibling, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-09-26 14:12 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/powerdomain.c | 94 +++++++++++++++++++++++++
arch/arm/plat-omap/include/mach/powerdomain.h | 7 ++
2 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 73e2971..7107eb9 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -35,6 +35,11 @@
#include <mach/powerdomain.h>
#include <mach/clockdomain.h>
+enum {
+ PWRDM_STATE_NOW = 0,
+ PWRDM_STATE_PREV,
+};
+
/* pwrdm_list contains all registered struct powerdomains */
static LIST_HEAD(pwrdm_list);
@@ -102,6 +107,63 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm,
return pd->pwrdm;
}
+static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
+{
+
+ int prev;
+ int state;
+
+ if (pwrdm == NULL)
+ return -EINVAL;
+
+ state = pwrdm_read_pwrst(pwrdm);
+
+ switch (flag) {
+ case PWRDM_STATE_NOW:
+ prev = pwrdm->state;
+ break;
+ case PWRDM_STATE_PREV:
+ prev = pwrdm_read_prev_pwrst(pwrdm);
+ if (pwrdm->state != prev)
+ pwrdm->state_counter[prev]++;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (state != prev)
+ pwrdm->state_counter[state]++;
+
+ pwrdm->state = state;
+
+ return 0;
+}
+
+static int _pwrdm_pre_suspend_cb(struct powerdomain *pwrdm)
+{
+ pwrdm_clear_all_prev_pwrst(pwrdm);
+ _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
+ return 0;
+}
+
+static int _pwrdm_post_suspend_cb(struct powerdomain *pwrdm)
+{
+ _pwrdm_state_switch(pwrdm, PWRDM_STATE_PREV);
+ return 0;
+}
+
+static __init void _pwrdm_setup(struct powerdomain *pwrdm)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ pwrdm->state_counter[i] = 0;
+
+ pwrdm_wait_transition(pwrdm);
+ pwrdm->state = pwrdm_read_pwrst(pwrdm);
+ pwrdm->state_counter[pwrdm->state] = 1;
+
+}
/* Public functions */
@@ -1110,4 +1172,36 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
return 0;
}
+int pwrdm_state_switch(struct powerdomain *pwrdm)
+{
+ return _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
+}
+
+int pwrdm_clkdm_state_switch(struct clockdomain *clkdm)
+{
+ if (clkdm != NULL && clkdm->pwrdm.ptr != NULL) {
+ pwrdm_wait_transition(clkdm->pwrdm.ptr);
+ return pwrdm_state_switch(clkdm->pwrdm.ptr);
+ }
+
+ return -EINVAL;
+}
+int pwrdm_clk_state_switch(struct clk *clk)
+{
+ if (clk != NULL && clk->clkdm.ptr != NULL)
+ return pwrdm_clkdm_state_switch(clk->clkdm.ptr);
+ return -EINVAL;
+}
+
+int pwrdm_pre_suspend(void)
+{
+ pwrdm_for_each(_pwrdm_pre_suspend_cb);
+ return 0;
+}
+
+int pwrdm_post_suspend(void)
+{
+ pwrdm_for_each(_pwrdm_post_suspend_cb);
+ return 0;
+}
diff --git a/arch/arm/plat-omap/include/mach/powerdomain.h b/arch/arm/plat-omap/include/mach/powerdomain.h
index 69c9e67..d80ad4a 100644
--- a/arch/arm/plat-omap/include/mach/powerdomain.h
+++ b/arch/arm/plat-omap/include/mach/powerdomain.h
@@ -117,6 +117,8 @@ struct powerdomain {
struct list_head node;
+ int state;
+ unsigned state_counter[4];
};
@@ -164,4 +166,9 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);
int pwrdm_wait_transition(struct powerdomain *pwrdm);
+int pwrdm_state_switch(struct powerdomain *pwrdm);
+int pwrdm_clkdm_state_switch(struct clockdomain *clkdm);
+int pwrdm_pre_suspend(void);
+int pwrdm_post_suspend(void);
+
#endif
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] Hook into PM counters
2008-09-26 14:12 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
@ 2008-09-26 14:12 ` Peter 'p2' De Schrijver
2008-10-01 11:36 ` Kevin Hilman
0 siblings, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-09-26 14:12 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/clock.c | 2 ++
arch/arm/mach-omap2/clockdomain.c | 4 ++++
arch/arm/mach-omap2/pm34xx.c | 6 ++++++
3 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index c3af24e..dbbc7c8 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -1013,5 +1013,7 @@ void omap2_clk_disable_unused(struct clk *clk)
printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
_omap2_clk_disable(clk);
+ if (clk->clkdm.ptr != NULL)
+ pwrdm_clkdm_state_switch(clk->clkdm.ptr);
}
#endif
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
index fa62f14..5249fe8 100644
--- a/arch/arm/mach-omap2/clockdomain.c
+++ b/arch/arm/mach-omap2/clockdomain.c
@@ -567,6 +567,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_wakeup(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
@@ -618,6 +620,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_sleep(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index a828db6..5913c4d 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -170,6 +170,8 @@ static void omap_sram_idle(void)
disable_smartreflex(SR1);
disable_smartreflex(SR2);
+ pwrdm_pre_suspend();
+
omap2_gpio_prepare_for_retention();
_omap_sram_idle(NULL, save_state);
@@ -179,6 +181,9 @@ static void omap_sram_idle(void)
/* Enable smartreflex after WFI */
enable_smartreflex(SR1);
enable_smartreflex(SR2);
+
+ pwrdm_post_suspend();
+
}
/*
@@ -260,6 +265,7 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
if (sleep_switch) {
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
pwrdm_wait_transition(pwrdm);
+ pwrdm_state_switch(pwrdm);
}
err:
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 2/2] Hook into PM counters
2008-09-26 14:12 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
@ 2008-10-01 11:36 ` Kevin Hilman
0 siblings, 0 replies; 8+ messages in thread
From: Kevin Hilman @ 2008-10-01 11:36 UTC (permalink / raw)
To: Peter 'p2' De Schrijver; +Cc: linux-omap
"Peter 'p2' De Schrijver" <peter.de-schrijver@nokia.com> writes:
> Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
> ---
> arch/arm/mach-omap2/clock.c | 2 ++
> arch/arm/mach-omap2/clockdomain.c | 4 ++++
> arch/arm/mach-omap2/pm34xx.c | 6 ++++++
> 3 files changed, 12 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
> index c3af24e..dbbc7c8 100644
> --- a/arch/arm/mach-omap2/clock.c
> +++ b/arch/arm/mach-omap2/clock.c
> @@ -1013,5 +1013,7 @@ void omap2_clk_disable_unused(struct clk *clk)
>
> printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
> _omap2_clk_disable(clk);
> + if (clk->clkdm.ptr != NULL)
> + pwrdm_clkdm_state_switch(clk->clkdm.ptr);
> }
> #endif
> diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
> index fa62f14..5249fe8 100644
> --- a/arch/arm/mach-omap2/clockdomain.c
> +++ b/arch/arm/mach-omap2/clockdomain.c
> @@ -567,6 +567,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
> else
> omap2_clkdm_wakeup(clkdm);
>
> + pwrdm_clkdm_state_switch(clkdm);
> +
> return 0;
> }
>
> @@ -618,6 +620,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
> else
> omap2_clkdm_sleep(clkdm);
>
> + pwrdm_clkdm_state_switch(clkdm);
> +
> return 0;
> }
>
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index a828db6..5913c4d 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -170,6 +170,8 @@ static void omap_sram_idle(void)
> disable_smartreflex(SR1);
> disable_smartreflex(SR2);
>
> + pwrdm_pre_suspend();
> +
Maybe these hooks shouldn't be called "suspend" since they happen for
idle and for suspend. Maybe pwrdm_pre_transition() ?
> omap2_gpio_prepare_for_retention();
>
> _omap_sram_idle(NULL, save_state);
> @@ -179,6 +181,9 @@ static void omap_sram_idle(void)
> /* Enable smartreflex after WFI */
> enable_smartreflex(SR1);
> enable_smartreflex(SR2);
> +
> + pwrdm_post_suspend();
> +
ditto.
> }
>
> /*
> @@ -260,6 +265,7 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
> if (sleep_switch) {
> omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
> pwrdm_wait_transition(pwrdm);
> + pwrdm_state_switch(pwrdm);
> }
>
> err:
> --
> 1.5.6.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/1] Hook into PM counters
2008-09-26 14:12 ` [PATCH 1/1] Hook into " Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
@ 2008-09-26 14:18 ` Peter 'p2' De Schrijver
1 sibling, 0 replies; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-09-26 14:18 UTC (permalink / raw)
To: linux-omap
This seems to be duplicate. You can ignore it.
Cheers,
Peter.
>
> Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
> ---
> arch/arm/mach-omap2/clock.c | 2 ++
> arch/arm/mach-omap2/clockdomain.c | 4 ++++
> arch/arm/mach-omap2/pm34xx.c | 6 ++++++
> 3 files changed, 12 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
> index c3af24e..dbbc7c8 100644
> --- a/arch/arm/mach-omap2/clock.c
> +++ b/arch/arm/mach-omap2/clock.c
> @@ -1013,5 +1013,7 @@ void omap2_clk_disable_unused(struct clk *clk)
>
> printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
> _omap2_clk_disable(clk);
> + if (clk->clkdm.ptr != NULL)
> + pwrdm_clkdm_state_switch(clk->clkdm.ptr);
> }
> #endif
> diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
> index fa62f14..5249fe8 100644
> --- a/arch/arm/mach-omap2/clockdomain.c
> +++ b/arch/arm/mach-omap2/clockdomain.c
> @@ -567,6 +567,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
> else
> omap2_clkdm_wakeup(clkdm);
>
> + pwrdm_clkdm_state_switch(clkdm);
> +
> return 0;
> }
>
> @@ -618,6 +620,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
> else
> omap2_clkdm_sleep(clkdm);
>
> + pwrdm_clkdm_state_switch(clkdm);
> +
> return 0;
> }
>
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index a828db6..5913c4d 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -170,6 +170,8 @@ static void omap_sram_idle(void)
> disable_smartreflex(SR1);
> disable_smartreflex(SR2);
>
> + pwrdm_pre_suspend();
> +
> omap2_gpio_prepare_for_retention();
>
> _omap_sram_idle(NULL, save_state);
> @@ -179,6 +181,9 @@ static void omap_sram_idle(void)
> /* Enable smartreflex after WFI */
> enable_smartreflex(SR1);
> enable_smartreflex(SR2);
> +
> + pwrdm_post_suspend();
> +
> }
>
> /*
> @@ -260,6 +265,7 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
> if (sleep_switch) {
> omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
> pwrdm_wait_transition(pwrdm);
> + pwrdm_state_switch(pwrdm);
> }
>
> err:
> --
> 1.5.6.3
>
--
goa is a state of mind
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 0/2] PM counters
@ 2008-10-01 15:48 Peter 'p2' De Schrijver
2008-10-01 15:48 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
0 siblings, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:48 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
This patch introduces counters for the various PM states in OMAP3.
Peter 'p2' De Schrijver (2):
PM counter infrastructure.
Hook into PM counters
arch/arm/mach-omap2/clock.c | 2 +
arch/arm/mach-omap2/clockdomain.c | 4 +
arch/arm/mach-omap2/pm34xx.c | 6 ++
arch/arm/mach-omap2/powerdomain.c | 94 +++++++++++++++++++++++++
arch/arm/plat-omap/include/mach/powerdomain.h | 7 ++
5 files changed, 113 insertions(+), 0 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] PM counter infrastructure.
2008-10-01 15:48 [PATCH 0/2] " Peter 'p2' De Schrijver
@ 2008-10-01 15:48 ` Peter 'p2' De Schrijver
2008-10-01 15:48 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
0 siblings, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:48 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/powerdomain.c | 94 +++++++++++++++++++++++++
arch/arm/plat-omap/include/mach/powerdomain.h | 7 ++
2 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 73e2971..349b7ab 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -35,6 +35,11 @@
#include <mach/powerdomain.h>
#include <mach/clockdomain.h>
+enum {
+ PWRDM_STATE_NOW = 0,
+ PWRDM_STATE_PREV,
+};
+
/* pwrdm_list contains all registered struct powerdomains */
static LIST_HEAD(pwrdm_list);
@@ -102,6 +107,63 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm,
return pd->pwrdm;
}
+static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
+{
+
+ int prev;
+ int state;
+
+ if (pwrdm == NULL)
+ return -EINVAL;
+
+ state = pwrdm_read_pwrst(pwrdm);
+
+ switch (flag) {
+ case PWRDM_STATE_NOW:
+ prev = pwrdm->state;
+ break;
+ case PWRDM_STATE_PREV:
+ prev = pwrdm_read_prev_pwrst(pwrdm);
+ if (pwrdm->state != prev)
+ pwrdm->state_counter[prev]++;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (state != prev)
+ pwrdm->state_counter[state]++;
+
+ pwrdm->state = state;
+
+ return 0;
+}
+
+static int _pwrdm_pre_transition_cb(struct powerdomain *pwrdm)
+{
+ pwrdm_clear_all_prev_pwrst(pwrdm);
+ _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
+ return 0;
+}
+
+static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm)
+{
+ _pwrdm_state_switch(pwrdm, PWRDM_STATE_PREV);
+ return 0;
+}
+
+static __init void _pwrdm_setup(struct powerdomain *pwrdm)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ pwrdm->state_counter[i] = 0;
+
+ pwrdm_wait_transition(pwrdm);
+ pwrdm->state = pwrdm_read_pwrst(pwrdm);
+ pwrdm->state_counter[pwrdm->state] = 1;
+
+}
/* Public functions */
@@ -1110,4 +1172,36 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
return 0;
}
+int pwrdm_state_switch(struct powerdomain *pwrdm)
+{
+ return _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
+}
+
+int pwrdm_clkdm_state_switch(struct clockdomain *clkdm)
+{
+ if (clkdm != NULL && clkdm->pwrdm.ptr != NULL) {
+ pwrdm_wait_transition(clkdm->pwrdm.ptr);
+ return pwrdm_state_switch(clkdm->pwrdm.ptr);
+ }
+
+ return -EINVAL;
+}
+int pwrdm_clk_state_switch(struct clk *clk)
+{
+ if (clk != NULL && clk->clkdm.ptr != NULL)
+ return pwrdm_clkdm_state_switch(clk->clkdm.ptr);
+ return -EINVAL;
+}
+
+int pwrdm_pre_transition(void)
+{
+ pwrdm_for_each(_pwrdm_pre_transition_cb);
+ return 0;
+}
+
+int pwrdm_post_transition(void)
+{
+ pwrdm_for_each(_pwrdm_post_transition_cb);
+ return 0;
+}
diff --git a/arch/arm/plat-omap/include/mach/powerdomain.h b/arch/arm/plat-omap/include/mach/powerdomain.h
index 69c9e67..52663fc 100644
--- a/arch/arm/plat-omap/include/mach/powerdomain.h
+++ b/arch/arm/plat-omap/include/mach/powerdomain.h
@@ -117,6 +117,8 @@ struct powerdomain {
struct list_head node;
+ int state;
+ unsigned state_counter[4];
};
@@ -164,4 +166,9 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);
int pwrdm_wait_transition(struct powerdomain *pwrdm);
+int pwrdm_state_switch(struct powerdomain *pwrdm);
+int pwrdm_clkdm_state_switch(struct clockdomain *clkdm);
+int pwrdm_pre_transition(void);
+int pwrdm_post_transition(void);
+
#endif
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] Hook into PM counters
2008-10-01 15:48 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
@ 2008-10-01 15:48 ` Peter 'p2' De Schrijver
0 siblings, 0 replies; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-01 15:48 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/clock.c | 2 ++
arch/arm/mach-omap2/clockdomain.c | 4 ++++
arch/arm/mach-omap2/pm34xx.c | 6 ++++++
3 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index c3af24e..dbbc7c8 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -1013,5 +1013,7 @@ void omap2_clk_disable_unused(struct clk *clk)
printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
_omap2_clk_disable(clk);
+ if (clk->clkdm.ptr != NULL)
+ pwrdm_clkdm_state_switch(clk->clkdm.ptr);
}
#endif
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
index fa62f14..5249fe8 100644
--- a/arch/arm/mach-omap2/clockdomain.c
+++ b/arch/arm/mach-omap2/clockdomain.c
@@ -567,6 +567,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_wakeup(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
@@ -618,6 +620,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_sleep(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index a828db6..1fbb690 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -170,6 +170,8 @@ static void omap_sram_idle(void)
disable_smartreflex(SR1);
disable_smartreflex(SR2);
+ pwrdm_pre_transition();
+
omap2_gpio_prepare_for_retention();
_omap_sram_idle(NULL, save_state);
@@ -179,6 +181,9 @@ static void omap_sram_idle(void)
/* Enable smartreflex after WFI */
enable_smartreflex(SR1);
enable_smartreflex(SR2);
+
+ pwrdm_post_transition();
+
}
/*
@@ -260,6 +265,7 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
if (sleep_switch) {
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
pwrdm_wait_transition(pwrdm);
+ pwrdm_state_switch(pwrdm);
}
err:
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 0/2] PM counters
@ 2008-10-15 14:48 Peter 'p2' De Schrijver
2008-10-15 14:48 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
0 siblings, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-15 14:48 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
This patch introduces counters for the various PM states in OMAP3.
Peter 'p2' De Schrijver (2):
PM counter infrastructure.
Hook into PM counters
arch/arm/mach-omap2/clock.c | 2 +
arch/arm/mach-omap2/clockdomain.c | 4 +
arch/arm/mach-omap2/pm34xx.c | 6 ++
arch/arm/mach-omap2/powerdomain.c | 101 ++++++++++++++++++++++++-
arch/arm/plat-omap/include/mach/powerdomain.h | 7 ++
5 files changed, 118 insertions(+), 2 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] PM counter infrastructure.
2008-10-15 14:48 [PATCH 0/2] " Peter 'p2' De Schrijver
@ 2008-10-15 14:48 ` Peter 'p2' De Schrijver
2008-10-15 14:48 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
0 siblings, 1 reply; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-15 14:48 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
This patch provides the infrastructure to count how many times a powerdomain
entered a given power state (on, inactive, retention, off). A number of
functions are provided which will be called by the chip specific powerdomain
and clockdomain code whenever a transition might have happened.
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/powerdomain.c | 101 ++++++++++++++++++++++++-
arch/arm/plat-omap/include/mach/powerdomain.h | 7 ++
2 files changed, 106 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 73e2971..3a9e151 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -35,6 +35,11 @@
#include <mach/powerdomain.h>
#include <mach/clockdomain.h>
+enum {
+ PWRDM_STATE_NOW = 0,
+ PWRDM_STATE_PREV,
+};
+
/* pwrdm_list contains all registered struct powerdomains */
static LIST_HEAD(pwrdm_list);
@@ -102,6 +107,63 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm,
return pd->pwrdm;
}
+static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
+{
+
+ int prev;
+ int state;
+
+ if (pwrdm == NULL)
+ return -EINVAL;
+
+ state = pwrdm_read_pwrst(pwrdm);
+
+ switch (flag) {
+ case PWRDM_STATE_NOW:
+ prev = pwrdm->state;
+ break;
+ case PWRDM_STATE_PREV:
+ prev = pwrdm_read_prev_pwrst(pwrdm);
+ if (pwrdm->state != prev)
+ pwrdm->state_counter[prev]++;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (state != prev)
+ pwrdm->state_counter[state]++;
+
+ pwrdm->state = state;
+
+ return 0;
+}
+
+static int _pwrdm_pre_transition_cb(struct powerdomain *pwrdm)
+{
+ pwrdm_clear_all_prev_pwrst(pwrdm);
+ _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
+ return 0;
+}
+
+static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm)
+{
+ _pwrdm_state_switch(pwrdm, PWRDM_STATE_PREV);
+ return 0;
+}
+
+static __init void _pwrdm_setup(struct powerdomain *pwrdm)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ pwrdm->state_counter[i] = 0;
+
+ pwrdm_wait_transition(pwrdm);
+ pwrdm->state = pwrdm_read_pwrst(pwrdm);
+ pwrdm->state_counter[pwrdm->state] = 1;
+
+}
/* Public functions */
@@ -117,9 +179,12 @@ void pwrdm_init(struct powerdomain **pwrdm_list)
{
struct powerdomain **p = NULL;
- if (pwrdm_list)
- for (p = pwrdm_list; *p; p++)
+ if (pwrdm_list) {
+ for (p = pwrdm_list; *p; p++) {
pwrdm_register(*p);
+ _pwrdm_setup(*p);
+ }
+ }
}
/**
@@ -1110,4 +1175,36 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
return 0;
}
+int pwrdm_state_switch(struct powerdomain *pwrdm)
+{
+ return _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW);
+}
+
+int pwrdm_clkdm_state_switch(struct clockdomain *clkdm)
+{
+ if (clkdm != NULL && clkdm->pwrdm.ptr != NULL) {
+ pwrdm_wait_transition(clkdm->pwrdm.ptr);
+ return pwrdm_state_switch(clkdm->pwrdm.ptr);
+ }
+
+ return -EINVAL;
+}
+int pwrdm_clk_state_switch(struct clk *clk)
+{
+ if (clk != NULL && clk->clkdm.ptr != NULL)
+ return pwrdm_clkdm_state_switch(clk->clkdm.ptr);
+ return -EINVAL;
+}
+
+int pwrdm_pre_transition(void)
+{
+ pwrdm_for_each(_pwrdm_pre_transition_cb);
+ return 0;
+}
+
+int pwrdm_post_transition(void)
+{
+ pwrdm_for_each(_pwrdm_post_transition_cb);
+ return 0;
+}
diff --git a/arch/arm/plat-omap/include/mach/powerdomain.h b/arch/arm/plat-omap/include/mach/powerdomain.h
index 69c9e67..52663fc 100644
--- a/arch/arm/plat-omap/include/mach/powerdomain.h
+++ b/arch/arm/plat-omap/include/mach/powerdomain.h
@@ -117,6 +117,8 @@ struct powerdomain {
struct list_head node;
+ int state;
+ unsigned state_counter[4];
};
@@ -164,4 +166,9 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm);
int pwrdm_wait_transition(struct powerdomain *pwrdm);
+int pwrdm_state_switch(struct powerdomain *pwrdm);
+int pwrdm_clkdm_state_switch(struct clockdomain *clkdm);
+int pwrdm_pre_transition(void);
+int pwrdm_post_transition(void);
+
#endif
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/2] Hook into PM counters
2008-10-15 14:48 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
@ 2008-10-15 14:48 ` Peter 'p2' De Schrijver
0 siblings, 0 replies; 8+ messages in thread
From: Peter 'p2' De Schrijver @ 2008-10-15 14:48 UTC (permalink / raw)
To: linux-omap; +Cc: Peter 'p2' De Schrijver
This patch modifies the clock, clockdomain and OMAP3 specific powerdomain
code to call the PM counter infrastructure whenever one or more powerdomains
might have changed state.
Signed-off-by: Peter 'p2' De Schrijver <peter.de-schrijver@nokia.com>
---
arch/arm/mach-omap2/clock.c | 2 ++
arch/arm/mach-omap2/clockdomain.c | 4 ++++
arch/arm/mach-omap2/pm34xx.c | 6 ++++++
3 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index c3af24e..dbbc7c8 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -1013,5 +1013,7 @@ void omap2_clk_disable_unused(struct clk *clk)
printk(KERN_INFO "Disabling unused clock \"%s\"\n", clk->name);
_omap2_clk_disable(clk);
+ if (clk->clkdm.ptr != NULL)
+ pwrdm_clkdm_state_switch(clk->clkdm.ptr);
}
#endif
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
index fa62f14..5249fe8 100644
--- a/arch/arm/mach-omap2/clockdomain.c
+++ b/arch/arm/mach-omap2/clockdomain.c
@@ -567,6 +567,8 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_wakeup(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
@@ -618,6 +620,8 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
else
omap2_clkdm_sleep(clkdm);
+ pwrdm_clkdm_state_switch(clkdm);
+
return 0;
}
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index a828db6..1fbb690 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -170,6 +170,8 @@ static void omap_sram_idle(void)
disable_smartreflex(SR1);
disable_smartreflex(SR2);
+ pwrdm_pre_transition();
+
omap2_gpio_prepare_for_retention();
_omap_sram_idle(NULL, save_state);
@@ -179,6 +181,9 @@ static void omap_sram_idle(void)
/* Enable smartreflex after WFI */
enable_smartreflex(SR1);
enable_smartreflex(SR2);
+
+ pwrdm_post_transition();
+
}
/*
@@ -260,6 +265,7 @@ static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
if (sleep_switch) {
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
pwrdm_wait_transition(pwrdm);
+ pwrdm_state_switch(pwrdm);
}
err:
--
1.5.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-10-15 14:49 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-26 14:12 [PATCH 0/2] PM counters Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 1/1] Hook into " Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
2008-09-26 14:12 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
2008-10-01 11:36 ` Kevin Hilman
2008-09-26 14:18 ` [PATCH 1/1] " Peter 'p2' De Schrijver
-- strict thread matches above, loose matches on Subject: below --
2008-10-01 15:48 [PATCH 0/2] " Peter 'p2' De Schrijver
2008-10-01 15:48 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
2008-10-01 15:48 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
2008-10-15 14:48 [PATCH 0/2] " Peter 'p2' De Schrijver
2008-10-15 14:48 ` [PATCH 1/2] PM counter infrastructure Peter 'p2' De Schrijver
2008-10-15 14:48 ` [PATCH 2/2] Hook into PM counters Peter 'p2' De Schrijver
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.