aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/pm-debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/pm-debug.c')
-rw-r--r--arch/arm/mach-omap2/pm-debug.c82
1 files changed, 59 insertions, 23 deletions
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c
index 2fc4d6abbd0a..6cac9817c243 100644
--- a/arch/arm/mach-omap2/pm-debug.c
+++ b/arch/arm/mach-omap2/pm-debug.c
@@ -25,11 +25,12 @@
25#include <linux/err.h> 25#include <linux/err.h>
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/module.h> 27#include <linux/module.h>
28#include <linux/slab.h>
28 29
29#include <mach/clock.h> 30#include <plat/clock.h>
30#include <mach/board.h> 31#include <plat/board.h>
31#include <mach/powerdomain.h> 32#include <plat/powerdomain.h>
32#include <mach/clockdomain.h> 33#include <plat/clockdomain.h>
33 34
34#include "prm.h" 35#include "prm.h"
35#include "cm.h" 36#include "cm.h"
@@ -51,9 +52,8 @@ int omap2_pm_debug;
51 regs[reg_count++].val = __raw_readl(reg) 52 regs[reg_count++].val = __raw_readl(reg)
52#define DUMP_INTC_REG(reg, off) \ 53#define DUMP_INTC_REG(reg, off) \
53 regs[reg_count].name = #reg; \ 54 regs[reg_count].name = #reg; \
54 regs[reg_count++].val = __raw_readl(OMAP2_IO_ADDRESS(0x480fe000 + (off))) 55 regs[reg_count++].val = \
55 56 __raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off)))
56static int __init pm_dbg_init(void);
57 57
58void omap2_pm_dump(int mode, int resume, unsigned int us) 58void omap2_pm_dump(int mode, int resume, unsigned int us)
59{ 59{
@@ -68,9 +68,9 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
68#if 0 68#if 0
69 /* MPU */ 69 /* MPU */
70 DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRM_IRQENABLE_MPU_OFFSET); 70 DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRM_IRQENABLE_MPU_OFFSET);
71 DUMP_CM_MOD_REG(MPU_MOD, CM_CLKSTCTRL); 71 DUMP_CM_MOD_REG(MPU_MOD, OMAP2_CM_CLKSTCTRL);
72 DUMP_PRM_MOD_REG(MPU_MOD, PM_PWSTCTRL); 72 DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTCTRL);
73 DUMP_PRM_MOD_REG(MPU_MOD, PM_PWSTST); 73 DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTST);
74 DUMP_PRM_MOD_REG(MPU_MOD, PM_WKDEP); 74 DUMP_PRM_MOD_REG(MPU_MOD, PM_WKDEP);
75#endif 75#endif
76#if 0 76#if 0
@@ -94,7 +94,7 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
94 DUMP_CM_MOD_REG(WKUP_MOD, CM_ICLKEN); 94 DUMP_CM_MOD_REG(WKUP_MOD, CM_ICLKEN);
95 DUMP_CM_MOD_REG(PLL_MOD, CM_CLKEN); 95 DUMP_CM_MOD_REG(PLL_MOD, CM_CLKEN);
96 DUMP_CM_MOD_REG(PLL_MOD, CM_AUTOIDLE); 96 DUMP_CM_MOD_REG(PLL_MOD, CM_AUTOIDLE);
97 DUMP_PRM_MOD_REG(CORE_MOD, PM_PWSTST); 97 DUMP_PRM_MOD_REG(CORE_MOD, OMAP2_PM_PWSTST);
98#endif 98#endif
99#if 0 99#if 0
100 /* DSP */ 100 /* DSP */
@@ -104,11 +104,11 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
104 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_IDLEST); 104 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_IDLEST);
105 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_AUTOIDLE); 105 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_AUTOIDLE);
106 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSEL); 106 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSEL);
107 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSTCTRL); 107 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_CM_CLKSTCTRL);
108 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, RM_RSTCTRL); 108 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTCTRL);
109 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, RM_RSTST); 109 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTST);
110 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, PM_PWSTCTRL); 110 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTCTRL);
111 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, PM_PWSTST); 111 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTST);
112 } 112 }
113#endif 113#endif
114 } else { 114 } else {
@@ -166,6 +166,8 @@ struct dentry *pm_dbg_dir;
166 166
167static int pm_dbg_init_done; 167static int pm_dbg_init_done;
168 168
169static int __init pm_dbg_init(void);
170
169enum { 171enum {
170 DEBUG_FILE_COUNTERS = 0, 172 DEBUG_FILE_COUNTERS = 0,
171 DEBUG_FILE_TIMERS, 173 DEBUG_FILE_TIMERS,
@@ -325,7 +327,7 @@ int pm_dbg_regset_save(int reg_set)
325 return 0; 327 return 0;
326} 328}
327 329
328static const char pwrdm_state_names[][4] = { 330static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = {
329 "OFF", 331 "OFF",
330 "RET", 332 "RET",
331 "INA", 333 "INA",
@@ -380,10 +382,15 @@ static int pwrdm_dbg_show_counter(struct powerdomain *pwrdm, void *user)
380 382
381 seq_printf(s, "%s (%s)", pwrdm->name, 383 seq_printf(s, "%s (%s)", pwrdm->name,
382 pwrdm_state_names[pwrdm->state]); 384 pwrdm_state_names[pwrdm->state]);
383 for (i = 0; i < 4; i++) 385 for (i = 0; i < PWRDM_MAX_PWRSTS; i++)
384 seq_printf(s, ",%s:%d", pwrdm_state_names[i], 386 seq_printf(s, ",%s:%d", pwrdm_state_names[i],
385 pwrdm->state_counter[i]); 387 pwrdm->state_counter[i]);
386 388
389 seq_printf(s, ",RET-LOGIC-OFF:%d", pwrdm->ret_logic_off_counter);
390 for (i = 0; i < pwrdm->banks; i++)
391 seq_printf(s, ",RET-MEMBANK%d-OFF:%d", i + 1,
392 pwrdm->ret_mem_off_counter[i]);
393
387 seq_printf(s, "\n"); 394 seq_printf(s, "\n");
388 395
389 return 0; 396 return 0;
@@ -487,9 +494,11 @@ int pm_dbg_regset_init(int reg_set)
487 494
488static int pwrdm_suspend_get(void *data, u64 *val) 495static int pwrdm_suspend_get(void *data, u64 *val)
489{ 496{
490 *val = omap3_pm_get_suspend_state((struct powerdomain *)data); 497 int ret;
498 ret = omap3_pm_get_suspend_state((struct powerdomain *)data);
499 *val = ret;
491 500
492 if (*val >= 0) 501 if (ret >= 0)
493 return 0; 502 return 0;
494 return *val; 503 return *val;
495} 504}
@@ -526,6 +535,29 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *dir)
526 return 0; 535 return 0;
527} 536}
528 537
538static int option_get(void *data, u64 *val)
539{
540 u32 *option = data;
541
542 *val = *option;
543
544 return 0;
545}
546
547static int option_set(void *data, u64 val)
548{
549 u32 *option = data;
550
551 *option = val;
552
553 if (option == &enable_off_mode)
554 omap3_pm_off_mode_enable(val);
555
556 return 0;
557}
558
559DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n");
560
529static int __init pm_dbg_init(void) 561static int __init pm_dbg_init(void)
530{ 562{
531 int i; 563 int i;
@@ -551,7 +583,7 @@ static int __init pm_dbg_init(void)
551 (void) debugfs_create_file("time", S_IRUGO, 583 (void) debugfs_create_file("time", S_IRUGO,
552 d, (void *)DEBUG_FILE_TIMERS, &debug_fops); 584 d, (void *)DEBUG_FILE_TIMERS, &debug_fops);
553 585
554 pwrdm_for_each_nolock(pwrdms_setup, (void *)d); 586 pwrdm_for_each(pwrdms_setup, (void *)d);
555 587
556 pm_dbg_dir = debugfs_create_dir("registers", d); 588 pm_dbg_dir = debugfs_create_dir("registers", d);
557 if (IS_ERR(pm_dbg_dir)) 589 if (IS_ERR(pm_dbg_dir))
@@ -568,12 +600,16 @@ static int __init pm_dbg_init(void)
568 600
569 } 601 }
570 602
603 (void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUGO, d,
604 &enable_off_mode, &pm_dbg_option_fops);
605 (void) debugfs_create_file("sleep_while_idle", S_IRUGO | S_IWUGO, d,
606 &sleep_while_idle, &pm_dbg_option_fops);
607 (void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUGO, d,
608 &wakeup_timer_seconds, &pm_dbg_option_fops);
571 pm_dbg_init_done = 1; 609 pm_dbg_init_done = 1;
572 610
573 return 0; 611 return 0;
574} 612}
575arch_initcall(pm_dbg_init); 613arch_initcall(pm_dbg_init);
576 614
577#else
578void pm_dbg_update_time(struct powerdomain *pwrdm, int prev) {}
579#endif 615#endif