]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
OMAP3 PM: Adding counters for power domain logic off and mem off during retention.
authorThara Gopinath <thara@ti.com>
Wed, 24 Feb 2010 19:05:50 +0000 (12:05 -0700)
committerPaul Walmsley <paul@pwsan.com>
Wed, 24 Feb 2010 19:05:50 +0000 (12:05 -0700)
This patch adds counters to keep track of whether the powerdomain
logic or software controllable memory banks are turned off when
the power domain enters retention. During power domain retention
if logic gets turned off, the scenario is known as Open Switch Retention.
Also during retention s/w controllable memory banks of a power
domain can be chosen to be kept in retention or off.

This patch adds one counter per powerdomain to track the power domain
logic state during retention. Number of memory bank state counters
added depends on the number of software controllable memory banks
of the powerdomain. To view these counters do
cat ../debug/pm_debug/count

Signed-off-by: Thara Gopinath <thara@ti.com>
[paul@pwsan.com: conditional expressions simplified; counter increment
 code moved to its own function]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
arch/arm/mach-omap2/pm-debug.c
arch/arm/mach-omap2/powerdomain.c
arch/arm/plat-omap/include/plat/powerdomain.h

index 0ce356f351a3c2f7fffdf95d68b775ba956cb30a..c18f7f2f19bce28414084571fe3956803126a387 100644 (file)
@@ -385,6 +385,11 @@ static int pwrdm_dbg_show_counter(struct powerdomain *pwrdm, void *user)
                seq_printf(s, ",%s:%d", pwrdm_state_names[i],
                        pwrdm->state_counter[i]);
 
+       seq_printf(s, ",RET-LOGIC-OFF:%d", pwrdm->ret_logic_off_counter);
+       for (i = 0; i < pwrdm->banks; i++)
+               seq_printf(s, ",RET-MEMBANK%d-OFF:%d", i + 1,
+                               pwrdm->ret_mem_off_counter[i]);
+
        seq_printf(s, "\n");
 
        return 0;
index e9eeaa4fbd47ed7a498b2b92e84f26faf365ffea..9a0fb385622b90b6be2b429deb079b8961f89502 100644 (file)
@@ -125,6 +125,10 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
        for (i = 0; i < PWRDM_MAX_PWRSTS; i++)
                pwrdm->state_counter[i] = 0;
 
+       pwrdm->ret_logic_off_counter = 0;
+       for (i = 0; i < pwrdm->banks; i++)
+               pwrdm->ret_mem_off_counter[i] = 0;
+
        pwrdm_wait_transition(pwrdm);
        pwrdm->state = pwrdm_read_pwrst(pwrdm);
        pwrdm->state_counter[pwrdm->state] = 1;
@@ -134,6 +138,25 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
        return 0;
 }
 
+static void _update_logic_membank_counters(struct powerdomain *pwrdm)
+{
+       int i;
+       u8 prev_logic_pwrst, prev_mem_pwrst;
+
+       prev_logic_pwrst = pwrdm_read_prev_logic_pwrst(pwrdm);
+       if ((pwrdm->pwrsts_logic_ret == PWRSTS_OFF_RET) &&
+           (prev_logic_pwrst == PWRDM_POWER_OFF))
+               pwrdm->ret_logic_off_counter++;
+
+       for (i = 0; i < pwrdm->banks; i++) {
+               prev_mem_pwrst = pwrdm_read_prev_mem_pwrst(pwrdm, i);
+
+               if ((pwrdm->pwrsts_mem_ret[i] == PWRSTS_OFF_RET) &&
+                   (prev_mem_pwrst == PWRDM_POWER_OFF))
+                       pwrdm->ret_mem_off_counter[i]++;
+       }
+}
+
 static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
 {
 
@@ -153,6 +176,8 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
                prev = pwrdm_read_prev_pwrst(pwrdm);
                if (pwrdm->state != prev)
                        pwrdm->state_counter[prev]++;
+               if (prev == PWRDM_POWER_RET)
+                       _update_logic_membank_counters(pwrdm);
                break;
        default:
                return -EINVAL;
index 6657ff2dfb6e2918193dddf7c7aa45b2d1213f78..d82b2c00d4f1accc88d5366c9be455791c764825 100644 (file)
@@ -100,6 +100,8 @@ struct powerdomain {
        struct list_head node;
        int state;
        unsigned state_counter[PWRDM_MAX_PWRSTS];
+       unsigned ret_logic_off_counter;
+       unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS];
 
 #ifdef CONFIG_PM_DEBUG
        s64 timer;