diff options
Diffstat (limited to 'arch/arm/mach-omap2/pm-debug.c')
-rw-r--r-- | arch/arm/mach-omap2/pm-debug.c | 82 |
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))) | |
56 | static int __init pm_dbg_init(void); | ||
57 | 57 | ||
58 | void omap2_pm_dump(int mode, int resume, unsigned int us) | 58 | void 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 | ||
167 | static int pm_dbg_init_done; | 167 | static int pm_dbg_init_done; |
168 | 168 | ||
169 | static int __init pm_dbg_init(void); | ||
170 | |||
169 | enum { | 171 | enum { |
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 | ||
328 | static const char pwrdm_state_names[][4] = { | 330 | static 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 | ||
488 | static int pwrdm_suspend_get(void *data, u64 *val) | 495 | static 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 | ||
538 | static int option_get(void *data, u64 *val) | ||
539 | { | ||
540 | u32 *option = data; | ||
541 | |||
542 | *val = *option; | ||
543 | |||
544 | return 0; | ||
545 | } | ||
546 | |||
547 | static 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 | |||
559 | DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n"); | ||
560 | |||
529 | static int __init pm_dbg_init(void) | 561 | static 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 | } |
575 | arch_initcall(pm_dbg_init); | 613 | arch_initcall(pm_dbg_init); |
576 | 614 | ||
577 | #else | ||
578 | void pm_dbg_update_time(struct powerdomain *pwrdm, int prev) {} | ||
579 | #endif | 615 | #endif |