diff options
author | Kevin Hilman <khilman@ti.com> | 2011-05-26 18:34:39 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@ti.com> | 2011-06-27 12:53:09 -0400 |
commit | 59bec58373bc8324a2ee7d7355fe8499c8f6f602 (patch) | |
tree | 4746a0b78a25d0c3b14413cd3f185f059225320b | |
parent | 20d5d5514981f9a68832bffb27a698545ecba77a (diff) |
OMAP3: PM debug: remove register dumping
Remove OMAP3-specific register dumping feature from PM debug layer.
This is removed because:
- it's ugly
- it's OMAP3-specific, and will obviously not scale to OMAP4+
- userspace /dev/mem-based tools (like omapconf) can do this much better
Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Jean Pihet <j-pihet@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
-rw-r--r-- | arch/arm/mach-omap2/pm-debug.c | 221 | ||||
-rw-r--r-- | arch/arm/mach-omap2/pm.h | 4 |
2 files changed, 0 insertions, 225 deletions
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index a8425d653ebd..3d1cce280e24 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
@@ -63,10 +63,6 @@ void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | |||
63 | #include <linux/debugfs.h> | 63 | #include <linux/debugfs.h> |
64 | #include <linux/seq_file.h> | 64 | #include <linux/seq_file.h> |
65 | 65 | ||
66 | static void pm_dbg_regset_store(u32 *ptr); | ||
67 | |||
68 | static struct dentry *pm_dbg_dir; | ||
69 | |||
70 | static int pm_dbg_init_done; | 66 | static int pm_dbg_init_done; |
71 | 67 | ||
72 | static int pm_dbg_init(void); | 68 | static int pm_dbg_init(void); |
@@ -76,160 +72,6 @@ enum { | |||
76 | DEBUG_FILE_TIMERS, | 72 | DEBUG_FILE_TIMERS, |
77 | }; | 73 | }; |
78 | 74 | ||
79 | struct pm_module_def { | ||
80 | char name[8]; /* Name of the module */ | ||
81 | short type; /* CM or PRM */ | ||
82 | unsigned short offset; | ||
83 | int low; /* First register address on this module */ | ||
84 | int high; /* Last register address on this module */ | ||
85 | }; | ||
86 | |||
87 | #define MOD_CM 0 | ||
88 | #define MOD_PRM 1 | ||
89 | |||
90 | static const struct pm_module_def *pm_dbg_reg_modules; | ||
91 | static const struct pm_module_def omap3_pm_reg_modules[] = { | ||
92 | { "IVA2", MOD_CM, OMAP3430_IVA2_MOD, 0, 0x4c }, | ||
93 | { "OCP", MOD_CM, OCP_MOD, 0, 0x10 }, | ||
94 | { "MPU", MOD_CM, MPU_MOD, 4, 0x4c }, | ||
95 | { "CORE", MOD_CM, CORE_MOD, 0, 0x4c }, | ||
96 | { "SGX", MOD_CM, OMAP3430ES2_SGX_MOD, 0, 0x4c }, | ||
97 | { "WKUP", MOD_CM, WKUP_MOD, 0, 0x40 }, | ||
98 | { "CCR", MOD_CM, PLL_MOD, 0, 0x70 }, | ||
99 | { "DSS", MOD_CM, OMAP3430_DSS_MOD, 0, 0x4c }, | ||
100 | { "CAM", MOD_CM, OMAP3430_CAM_MOD, 0, 0x4c }, | ||
101 | { "PER", MOD_CM, OMAP3430_PER_MOD, 0, 0x4c }, | ||
102 | { "EMU", MOD_CM, OMAP3430_EMU_MOD, 0x40, 0x54 }, | ||
103 | { "NEON", MOD_CM, OMAP3430_NEON_MOD, 0x20, 0x48 }, | ||
104 | { "USB", MOD_CM, OMAP3430ES2_USBHOST_MOD, 0, 0x4c }, | ||
105 | |||
106 | { "IVA2", MOD_PRM, OMAP3430_IVA2_MOD, 0x50, 0xfc }, | ||
107 | { "OCP", MOD_PRM, OCP_MOD, 4, 0x1c }, | ||
108 | { "MPU", MOD_PRM, MPU_MOD, 0x58, 0xe8 }, | ||
109 | { "CORE", MOD_PRM, CORE_MOD, 0x58, 0xf8 }, | ||
110 | { "SGX", MOD_PRM, OMAP3430ES2_SGX_MOD, 0x58, 0xe8 }, | ||
111 | { "WKUP", MOD_PRM, WKUP_MOD, 0xa0, 0xb0 }, | ||
112 | { "CCR", MOD_PRM, PLL_MOD, 0x40, 0x70 }, | ||
113 | { "DSS", MOD_PRM, OMAP3430_DSS_MOD, 0x58, 0xe8 }, | ||
114 | { "CAM", MOD_PRM, OMAP3430_CAM_MOD, 0x58, 0xe8 }, | ||
115 | { "PER", MOD_PRM, OMAP3430_PER_MOD, 0x58, 0xe8 }, | ||
116 | { "EMU", MOD_PRM, OMAP3430_EMU_MOD, 0x58, 0xe4 }, | ||
117 | { "GLBL", MOD_PRM, OMAP3430_GR_MOD, 0x20, 0xe4 }, | ||
118 | { "NEON", MOD_PRM, OMAP3430_NEON_MOD, 0x58, 0xe8 }, | ||
119 | { "USB", MOD_PRM, OMAP3430ES2_USBHOST_MOD, 0x58, 0xe8 }, | ||
120 | { "", 0, 0, 0, 0 }, | ||
121 | }; | ||
122 | |||
123 | #define PM_DBG_MAX_REG_SETS 4 | ||
124 | |||
125 | static void *pm_dbg_reg_set[PM_DBG_MAX_REG_SETS]; | ||
126 | |||
127 | static int pm_dbg_get_regset_size(void) | ||
128 | { | ||
129 | static int regset_size; | ||
130 | |||
131 | if (regset_size == 0) { | ||
132 | int i = 0; | ||
133 | |||
134 | while (pm_dbg_reg_modules[i].name[0] != 0) { | ||
135 | regset_size += pm_dbg_reg_modules[i].high + | ||
136 | 4 - pm_dbg_reg_modules[i].low; | ||
137 | i++; | ||
138 | } | ||
139 | } | ||
140 | return regset_size; | ||
141 | } | ||
142 | |||
143 | static int pm_dbg_show_regs(struct seq_file *s, void *unused) | ||
144 | { | ||
145 | int i, j; | ||
146 | unsigned long val; | ||
147 | int reg_set = (int)s->private; | ||
148 | u32 *ptr; | ||
149 | void *store = NULL; | ||
150 | int regs; | ||
151 | int linefeed; | ||
152 | |||
153 | if (reg_set == 0) { | ||
154 | store = kmalloc(pm_dbg_get_regset_size(), GFP_KERNEL); | ||
155 | ptr = store; | ||
156 | pm_dbg_regset_store(ptr); | ||
157 | } else { | ||
158 | ptr = pm_dbg_reg_set[reg_set - 1]; | ||
159 | } | ||
160 | |||
161 | i = 0; | ||
162 | |||
163 | while (pm_dbg_reg_modules[i].name[0] != 0) { | ||
164 | regs = 0; | ||
165 | linefeed = 0; | ||
166 | if (pm_dbg_reg_modules[i].type == MOD_CM) | ||
167 | seq_printf(s, "MOD: CM_%s (%08x)\n", | ||
168 | pm_dbg_reg_modules[i].name, | ||
169 | (u32)(OMAP3430_CM_BASE + | ||
170 | pm_dbg_reg_modules[i].offset)); | ||
171 | else | ||
172 | seq_printf(s, "MOD: PRM_%s (%08x)\n", | ||
173 | pm_dbg_reg_modules[i].name, | ||
174 | (u32)(OMAP3430_PRM_BASE + | ||
175 | pm_dbg_reg_modules[i].offset)); | ||
176 | |||
177 | for (j = pm_dbg_reg_modules[i].low; | ||
178 | j <= pm_dbg_reg_modules[i].high; j += 4) { | ||
179 | val = *(ptr++); | ||
180 | if (val != 0) { | ||
181 | regs++; | ||
182 | if (linefeed) { | ||
183 | seq_printf(s, "\n"); | ||
184 | linefeed = 0; | ||
185 | } | ||
186 | seq_printf(s, " %02x => %08lx", j, val); | ||
187 | if (regs % 4 == 0) | ||
188 | linefeed = 1; | ||
189 | } | ||
190 | } | ||
191 | seq_printf(s, "\n"); | ||
192 | i++; | ||
193 | } | ||
194 | |||
195 | if (store != NULL) | ||
196 | kfree(store); | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | static void pm_dbg_regset_store(u32 *ptr) | ||
202 | { | ||
203 | int i, j; | ||
204 | u32 val; | ||
205 | |||
206 | i = 0; | ||
207 | |||
208 | while (pm_dbg_reg_modules[i].name[0] != 0) { | ||
209 | for (j = pm_dbg_reg_modules[i].low; | ||
210 | j <= pm_dbg_reg_modules[i].high; j += 4) { | ||
211 | if (pm_dbg_reg_modules[i].type == MOD_CM) | ||
212 | val = omap2_cm_read_mod_reg( | ||
213 | pm_dbg_reg_modules[i].offset, j); | ||
214 | else | ||
215 | val = omap2_prm_read_mod_reg( | ||
216 | pm_dbg_reg_modules[i].offset, j); | ||
217 | *(ptr++) = val; | ||
218 | } | ||
219 | i++; | ||
220 | } | ||
221 | } | ||
222 | |||
223 | int pm_dbg_regset_save(int reg_set) | ||
224 | { | ||
225 | if (pm_dbg_reg_set[reg_set-1] == NULL) | ||
226 | return -EINVAL; | ||
227 | |||
228 | pm_dbg_regset_store(pm_dbg_reg_set[reg_set-1]); | ||
229 | |||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = { | 75 | static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = { |
234 | "OFF", | 76 | "OFF", |
235 | "RET", | 77 | "RET", |
@@ -349,11 +191,6 @@ static int pm_dbg_open(struct inode *inode, struct file *file) | |||
349 | }; | 191 | }; |
350 | } | 192 | } |
351 | 193 | ||
352 | static int pm_dbg_reg_open(struct inode *inode, struct file *file) | ||
353 | { | ||
354 | return single_open(file, pm_dbg_show_regs, inode->i_private); | ||
355 | } | ||
356 | |||
357 | static const struct file_operations debug_fops = { | 194 | static const struct file_operations debug_fops = { |
358 | .open = pm_dbg_open, | 195 | .open = pm_dbg_open, |
359 | .read = seq_read, | 196 | .read = seq_read, |
@@ -361,40 +198,6 @@ static const struct file_operations debug_fops = { | |||
361 | .release = single_release, | 198 | .release = single_release, |
362 | }; | 199 | }; |
363 | 200 | ||
364 | static const struct file_operations debug_reg_fops = { | ||
365 | .open = pm_dbg_reg_open, | ||
366 | .read = seq_read, | ||
367 | .llseek = seq_lseek, | ||
368 | .release = single_release, | ||
369 | }; | ||
370 | |||
371 | int pm_dbg_regset_init(int reg_set) | ||
372 | { | ||
373 | char name[2]; | ||
374 | |||
375 | if (!pm_dbg_init_done) | ||
376 | pm_dbg_init(); | ||
377 | |||
378 | if (reg_set < 1 || reg_set > PM_DBG_MAX_REG_SETS || | ||
379 | pm_dbg_reg_set[reg_set-1] != NULL) | ||
380 | return -EINVAL; | ||
381 | |||
382 | pm_dbg_reg_set[reg_set-1] = | ||
383 | kmalloc(pm_dbg_get_regset_size(), GFP_KERNEL); | ||
384 | |||
385 | if (pm_dbg_reg_set[reg_set-1] == NULL) | ||
386 | return -ENOMEM; | ||
387 | |||
388 | if (pm_dbg_dir != NULL) { | ||
389 | sprintf(name, "%d", reg_set); | ||
390 | |||
391 | (void) debugfs_create_file(name, S_IRUGO, | ||
392 | pm_dbg_dir, (void *)reg_set, &debug_reg_fops); | ||
393 | } | ||
394 | |||
395 | return 0; | ||
396 | } | ||
397 | |||
398 | static int pwrdm_suspend_get(void *data, u64 *val) | 201 | static int pwrdm_suspend_get(void *data, u64 *val) |
399 | { | 202 | { |
400 | int ret = -EINVAL; | 203 | int ret = -EINVAL; |
@@ -477,20 +280,11 @@ DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n"); | |||
477 | 280 | ||
478 | static int pm_dbg_init(void) | 281 | static int pm_dbg_init(void) |
479 | { | 282 | { |
480 | int i; | ||
481 | struct dentry *d; | 283 | struct dentry *d; |
482 | char name[2]; | ||
483 | 284 | ||
484 | if (pm_dbg_init_done) | 285 | if (pm_dbg_init_done) |
485 | return 0; | 286 | return 0; |
486 | 287 | ||
487 | if (cpu_is_omap34xx()) | ||
488 | pm_dbg_reg_modules = omap3_pm_reg_modules; | ||
489 | else { | ||
490 | printk(KERN_ERR "%s: only OMAP3 supported\n", __func__); | ||
491 | return -ENODEV; | ||
492 | } | ||
493 | |||
494 | d = debugfs_create_dir("pm_debug", NULL); | 288 | d = debugfs_create_dir("pm_debug", NULL); |
495 | if (IS_ERR(d)) | 289 | if (IS_ERR(d)) |
496 | return PTR_ERR(d); | 290 | return PTR_ERR(d); |
@@ -502,21 +296,6 @@ static int pm_dbg_init(void) | |||
502 | 296 | ||
503 | pwrdm_for_each(pwrdms_setup, (void *)d); | 297 | pwrdm_for_each(pwrdms_setup, (void *)d); |
504 | 298 | ||
505 | pm_dbg_dir = debugfs_create_dir("registers", d); | ||
506 | if (IS_ERR(pm_dbg_dir)) | ||
507 | return PTR_ERR(pm_dbg_dir); | ||
508 | |||
509 | (void) debugfs_create_file("current", S_IRUGO, | ||
510 | pm_dbg_dir, (void *)0, &debug_reg_fops); | ||
511 | |||
512 | for (i = 0; i < PM_DBG_MAX_REG_SETS; i++) | ||
513 | if (pm_dbg_reg_set[i] != NULL) { | ||
514 | sprintf(name, "%d", i+1); | ||
515 | (void) debugfs_create_file(name, S_IRUGO, | ||
516 | pm_dbg_dir, (void *)(i+1), &debug_reg_fops); | ||
517 | |||
518 | } | ||
519 | |||
520 | (void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUSR, d, | 299 | (void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUSR, d, |
521 | &enable_off_mode, &pm_dbg_option_fops); | 300 | &enable_off_mode, &pm_dbg_option_fops); |
522 | (void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUSR, d, | 301 | (void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUSR, d, |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index acac27501d4e..ea58f5dd2400 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -74,12 +74,8 @@ extern u32 enable_off_mode; | |||
74 | 74 | ||
75 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) | 75 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) |
76 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); | 76 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); |
77 | extern int pm_dbg_regset_save(int reg_set); | ||
78 | extern int pm_dbg_regset_init(int reg_set); | ||
79 | #else | 77 | #else |
80 | #define pm_dbg_update_time(pwrdm, prev) do {} while (0); | 78 | #define pm_dbg_update_time(pwrdm, prev) do {} while (0); |
81 | #define pm_dbg_regset_save(reg_set) do {} while (0); | ||
82 | #define pm_dbg_regset_init(reg_set) do {} while (0); | ||
83 | #endif /* CONFIG_PM_DEBUG */ | 79 | #endif /* CONFIG_PM_DEBUG */ |
84 | 80 | ||
85 | extern void omap24xx_idle_loop_suspend(void); | 81 | extern void omap24xx_idle_loop_suspend(void); |