Signed-off-by: Peter 'p2' De Schrijver <[EMAIL PROTECTED]>
---
 arch/arm/mach-omap2/pm-debug.c                |  153 ++++++++++++-------------
 arch/arm/mach-omap2/pm.h                      |   19 +---
 arch/arm/plat-omap/include/mach/powerdomain.h |   14 ++-
 3 files changed, 87 insertions(+), 99 deletions(-)

diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c
index 380a2a0..64d40c4 100644
--- a/arch/arm/mach-omap2/pm-debug.c
+++ b/arch/arm/mach-omap2/pm-debug.c
@@ -167,8 +167,8 @@ struct dentry *pm_dbg_dir;
 static int pm_dbg_init_done;
 
 enum {
-       PM_DBG_STATE_NOW = 0,
-       PM_DBG_STATE_PREV,
+       DEBUG_FILE_COUNTERS = 0,
+       DEBUG_FILE_TIMERS,
 };
 
 struct pm_module_def {
@@ -218,6 +218,13 @@ static const struct pm_module_def pm_dbg_reg_modules[] = {
 
 static void *pm_dbg_reg_set[PM_DBG_MAX_REG_SETS];
 
+static const char pwrdm_state_names[][4] = {
+       "OFF",
+       "RET",
+       "INA",
+       "ON"
+};
+
 static int pm_dbg_get_regset_size(void)
 {
        static int regset_size;
@@ -318,107 +325,96 @@ int pm_dbg_regset_save(int reg_set)
        return 0;
 }
 
-static int _pm_dbg_state_switch(struct powerdomain *pwrdm, int flag)
+void pm_dbg_update_time(struct powerdomain *pwrdm, int prev)
 {
        s64 t;
        struct timespec now;
-       int prev;
-       int state;
 
-       if (pwrdm == NULL)
-               return -EINVAL;
+       if (!pm_dbg_init_done)
+               return ;
 
-       state = pwrdm_read_pwrst(pwrdm);
+       /* Update timer for previous state */
+       getnstimeofday(&now);
+       t = timespec_to_ns(&now);
 
-       switch (flag) {
-       case PM_DBG_STATE_NOW:
-               prev = pwrdm->state;
-               break;
-       case PM_DBG_STATE_PREV:
-               prev = pwrdm_read_prev_pwrst(pwrdm);
-               if (pwrdm->state != prev)
-                       pwrdm->state_counter[prev]++;
-               break;
-       default:
-               return -EINVAL;
-       }
+       pwrdm->state_timer[prev] += t - pwrdm->timer;
 
-       if (pm_dbg_init_done) {
-               /* Update timer for previous state */
-               getnstimeofday(&now);
-               t = timespec_to_ns(&now);
+       pwrdm->timer = t;
 
-               pwrdm->state_timer[prev] += t - pwrdm->timer;
+}
 
-               pwrdm->timer = t;
+static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user)
+{
+       struct seq_file *s = (struct seq_file *)user;
 
-               if (state != prev)
-                       pwrdm->state_counter[state]++;
-       }
+       if (strcmp(clkdm->name, "emu_clkdm") == 0 ||
+               strcmp(clkdm->name, "wkup_clkdm") == 0)
+               return 0;
 
-       pwrdm->state = state;
+       seq_printf(s, "%s->%s (%d)", clkdm->name,
+                       clkdm->pwrdm.ptr->name,
+                       atomic_read(&clkdm->usecount));
+       seq_printf(s, "\n");
 
        return 0;
 }
 
-int pm_dbg_pwrdm_state_switch(struct powerdomain *pwrdm)
+static int pwrdm_dbg_show_counter(struct powerdomain *pwrdm, void *user)
 {
-       return _pm_dbg_state_switch(pwrdm, PM_DBG_STATE_NOW);
-}
+       struct seq_file *s = (struct seq_file *)user;
+       int i;
 
-int pm_dbg_clkdm_state_switch(struct clockdomain *clkdm)
-{
-       if (clkdm != NULL && clkdm->pwrdm.ptr != NULL) {
-               pwrdm_wait_transition(clkdm->pwrdm.ptr);
-               return pm_dbg_pwrdm_state_switch(clkdm->pwrdm.ptr);
-       }
+       if (strcmp(pwrdm->name, "emu_pwrdm") == 0 ||
+               strcmp(pwrdm->name, "wkup_pwrdm") == 0)
+               return 0;
 
-       return -EINVAL;
-}
+       if (pwrdm->state != pwrdm_read_pwrst(pwrdm))
+               printk(KERN_ERR "pwrdm state mismatch(%s) %d != %d\n",
+                       pwrdm->name, pwrdm->state, pwrdm_read_pwrst(pwrdm));
 
-int pm_dbg_clk_state_switch(struct clk *clk)
-{
-       if (clk != NULL && clk->clkdm.ptr != NULL)
-               return pm_dbg_clkdm_state_switch(clk->clkdm.ptr);
-       return -EINVAL;
-}
+       seq_printf(s, "%s (%s)", pwrdm->name,
+                       pwrdm_state_names[pwrdm->state]);
+       for (i = 0; i < 4; i++)
+               seq_printf(s, ",%s:%d", pwrdm_state_names[i],
+                       pwrdm->state_counter[i]);
 
-static int pm_dbg_pre_suspend_cb(struct powerdomain *pwrdm)
-{
-       pwrdm_clear_all_prev_pwrst(pwrdm);
-       _pm_dbg_state_switch(pwrdm, PM_DBG_STATE_NOW);
-       return 0;
-}
+       seq_printf(s, "\n");
 
-static int pm_dbg_post_suspend_cb(struct powerdomain *pwrdm)
-{
-       _pm_dbg_state_switch(pwrdm, PM_DBG_STATE_PREV);
        return 0;
 }
 
-int pm_dbg_pre_suspend(void)
+static int pwrdm_dbg_show_timer(struct powerdomain *pwrdm, void *user)
 {
-       pwrdm_for_each(pm_dbg_pre_suspend_cb);
+       struct seq_file *s = (struct seq_file *)user;
+       int i;
+
+       if (strcmp(pwrdm->name, "emu_pwrdm") == 0 ||
+               strcmp(pwrdm->name, "wkup_pwrdm") == 0)
+               return 0;
+
+       pwrdm_state_switch(pwrdm);
+
+       seq_printf(s, "%s (%s)", pwrdm->name,
+               pwrdm_state_names[pwrdm->state]);
+
+       for (i = 0; i < 4; i++)
+               seq_printf(s, ",%s:%lld", pwrdm_state_names[i],
+                       pwrdm->state_timer[i]);
+
+       seq_printf(s, "\n");
+
        return 0;
 }
 
-int pm_dbg_post_suspend(void)
+static void pm_dbg_show_counters(struct seq_file *s, void *unused)
 {
-       pwrdm_for_each(pm_dbg_post_suspend_cb);
-       return 0;
+       pwrdm_for_each(pwrdm_dbg_show_counter, s);
+       clkdm_for_each(clkdm_dbg_show_counter, s);
 }
 
-enum {
-       DEBUG_FILE_COUNTERS = 0,
-       DEBUG_FILE_TIMERS,
-};
-
-int pm_dbg_show_counters(struct seq_file *s, void *unused)
+static void pm_dbg_show_timers(struct seq_file *s, void *unused)
 {
-       pwrdm_dbg_show_counters(s, unused);
-       clkdm_dbg_show_counters(s, unused);
-
-       return 0;
+       pwrdm_for_each(pwrdm_dbg_show_timer, s);
 }
 
 static int pm_dbg_open(struct inode *inode, struct file *file)
@@ -429,7 +425,7 @@ static int pm_dbg_open(struct inode *inode, struct file 
*file)
                        &inode->i_private);
        case DEBUG_FILE_TIMERS:
        default:
-               return single_open(file, pwrdm_dbg_show_timers,
+               return single_open(file, pm_dbg_show_timers,
                        &inode->i_private);
        };
 }
@@ -489,23 +485,18 @@ int pm_dbg_regset_init(int reg_set)
        return 0;
 }
 
-static int __init pwrdms_setup(struct powerdomain *pwrdm)
+static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
 {
-       s64 t;
        int i;
+       s64 t;
        struct timespec now;
 
        getnstimeofday(&now);
        t = timespec_to_ns(&now);
 
-       for (i = 0; i < 4; i++) {
-               pwrdm->state_counter[i] = 0;
+       for (i = 0; i < 4; i++)
                pwrdm->state_timer[i] = 0;
-       }
 
-       pwrdm_wait_transition(pwrdm);
-       pwrdm->state = pwrdm_read_pwrst(pwrdm);
-       pwrdm->state_counter[pwrdm->state] = 1;
        pwrdm->timer = t;
 
        (void) debugfs_create_file(pwrdm->name, S_IRUGO|S_IWUSR,
@@ -535,7 +526,7 @@ static int __init pm_dbg_init(void)
        if (IS_ERR(pm_dbg_dir))
                return PTR_ERR(pm_dbg_dir);
 
-       pwrdm_for_each(pwrdms_setup);
+       pwrdm_for_each(pwrdms_setup, NULL);
 
        pm_dbg_dir = debugfs_create_dir("registers", d);
        if (IS_ERR(pm_dbg_dir))
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
index 038931c..55a9cdd 100644
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -31,32 +31,21 @@ extern int omap2_pm_debug;
 #define omap2_pm_debug 0
 #endif
 
+extern int set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
+
 #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
 struct seq_file;
 struct clk;
 struct clockdomain;
 struct powerdomain;
-extern int pm_dbg_pwrdm_state_switch(struct powerdomain *pwrdm);
-extern int pm_dbg_clkdm_state_switch(struct clockdomain *clkdm);
-extern int pm_dbg_clk_state_switch(struct clk *clk);
-extern int pm_dbg_pre_suspend(void);
-extern int pm_dbg_post_suspend(void);
 extern int pm_dbg_regset_save(int reg_set);
 extern int pm_dbg_regset_init(int reg_set);
-extern int pwrdm_dbg_show_counters(struct seq_file *s, void *unused);
-extern int pwrdm_dbg_show_timers(struct seq_file *s, void *unused);
 extern int clkdm_dbg_show_counters(struct seq_file *s, void *unused);
-extern int set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
+extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev);
 #else
-#define pm_dbg_pwrdm_state_switch(domain) do; while (0)
-#define pm_dbg_clkdm_state_switch(domain) do; while (0)
-#define pm_dbg_clk_state_switch(domain) do; while (0)
-#define pm_dbg_pre_suspend() do; while (0)
-#define pm_dbg_post_suspend() do; while (0)
 #define pm_dbg_regset_save(reg_set) do; while (0)
 #define pm_dbg_regset_init(reg_set) do; while (0)
-#define pwrdm_dbg_show_counters(s,unused) do; while (0)
-#define pwrdm_dbg_show_timers(s,unused) do; while (0)
 #define clkdm_dbg_show_counters(s,unused) do; while (0)
+#define pm_dbg_update_time(pwrdm, prev) do; while (0)
 #endif /* CONFIG_PM_DEBUG */
 #endif
diff --git a/arch/arm/plat-omap/include/mach/powerdomain.h 
b/arch/arm/plat-omap/include/mach/powerdomain.h
index 1c27d7d..2d6f9a0 100644
--- a/arch/arm/plat-omap/include/mach/powerdomain.h
+++ b/arch/arm/plat-omap/include/mach/powerdomain.h
@@ -74,6 +74,11 @@ struct pwrdm_dep {
 
        int state;
        unsigned state_counter[4];
+
+#ifdef CONFIG_PM_DEBUG
+       s64 timer;
+       s64 state_timer[4];
+#endif
 };
 
 struct powerdomain {
@@ -118,9 +123,11 @@ struct powerdomain {
        struct clockdomain *pwrdm_clkdms[PWRDM_MAX_CLKDMS];
 
        struct list_head node;
-#ifdef CONFIG_PM_DEBUG
+
        int state;
-       int state_counter[4];
+       unsigned state_counter[4];
+
+#ifdef CONFIG_PM_DEBUG
        s64 timer;
        s64 state_timer[4];
 #endif
@@ -133,7 +140,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);
-- 
1.5.6.3

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to