2 * OMAP Power Management debug routines
4 * Copyright (C) 2005 Texas Instruments, Inc.
5 * Copyright (C) 2006-2008 Nokia Corporation
8 * Richard Woodruff <r-woodruff2@ti.com>
11 * Amit Kucheria <amit.kucheria@nokia.com>
12 * Igor Stoppa <igor.stoppa@nokia.com>
15 * Based on pm.c for omap2
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
22 #include <linux/kernel.h>
23 #include <linux/timer.h>
24 #include <linux/clk.h>
25 #include <linux/err.h>
28 #include <mach/clock.h>
29 #include <mach/board.h>
37 #define DUMP_PRM_MOD_REG(mod, reg) \
38 regs[reg_count].name = #mod "." #reg; \
39 regs[reg_count++].val = prm_read_mod_reg(mod, reg)
40 #define DUMP_CM_MOD_REG(mod, reg) \
41 regs[reg_count].name = #mod "." #reg; \
42 regs[reg_count++].val = cm_read_mod_reg(mod, reg)
43 #define DUMP_PRM_REG(reg) \
44 regs[reg_count].name = #reg; \
45 regs[reg_count++].val = __raw_readl(reg)
46 #define DUMP_CM_REG(reg) \
47 regs[reg_count].name = #reg; \
48 regs[reg_count++].val = __raw_readl(reg)
49 #define DUMP_INTC_REG(reg, off) \
50 regs[reg_count].name = #reg; \
51 regs[reg_count++].val = __raw_readl(IO_ADDRESS(0x480fe000 + (off)))
53 void omap2_pm_dump(int mode
, int resume
, unsigned int us
)
60 const char *s1
= NULL
, *s2
= NULL
;
65 DUMP_PRM_MOD_REG(OCP_MOD
, OMAP2_PRM_IRQENABLE_MPU_OFFSET
);
66 DUMP_CM_MOD_REG(MPU_MOD
, CM_CLKSTCTRL
);
67 DUMP_PRM_MOD_REG(MPU_MOD
, PM_PWSTCTRL
);
68 DUMP_PRM_MOD_REG(MPU_MOD
, PM_PWSTST
);
69 DUMP_PRM_MOD_REG(MPU_MOD
, PM_WKDEP
);
73 DUMP_INTC_REG(INTC_MIR0
, 0x0084);
74 DUMP_INTC_REG(INTC_MIR1
, 0x00a4);
75 DUMP_INTC_REG(INTC_MIR2
, 0x00c4);
78 DUMP_CM_MOD_REG(CORE_MOD
, CM_FCLKEN1
);
79 if (cpu_is_omap24xx()) {
80 DUMP_CM_MOD_REG(CORE_MOD
, OMAP24XX_CM_FCLKEN2
);
81 DUMP_PRM_MOD_REG(OMAP24XX_GR_MOD
,
82 OMAP2_PRCM_CLKEMUL_CTRL_OFFSET
);
83 DUMP_PRM_MOD_REG(OMAP24XX_GR_MOD
,
84 OMAP2_PRCM_CLKSRC_CTRL_OFFSET
);
86 DUMP_CM_MOD_REG(WKUP_MOD
, CM_FCLKEN
);
87 DUMP_CM_MOD_REG(CORE_MOD
, CM_ICLKEN1
);
88 DUMP_CM_MOD_REG(CORE_MOD
, CM_ICLKEN2
);
89 DUMP_CM_MOD_REG(WKUP_MOD
, CM_ICLKEN
);
90 DUMP_CM_MOD_REG(PLL_MOD
, CM_CLKEN
);
91 DUMP_CM_MOD_REG(PLL_MOD
, CM_AUTOIDLE
);
92 DUMP_PRM_MOD_REG(CORE_MOD
, PM_PWSTST
);
96 if (cpu_is_omap24xx()) {
97 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD
, CM_FCLKEN
);
98 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD
, CM_ICLKEN
);
99 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD
, CM_IDLEST
);
100 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD
, CM_AUTOIDLE
);
101 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD
, CM_CLKSEL
);
102 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD
, CM_CLKSTCTRL
);
103 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD
, RM_RSTCTRL
);
104 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD
, RM_RSTST
);
105 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD
, PM_PWSTCTRL
);
106 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD
, PM_PWSTST
);
110 DUMP_PRM_MOD_REG(CORE_MOD
, PM_WKST1
);
111 if (cpu_is_omap24xx())
112 DUMP_PRM_MOD_REG(CORE_MOD
, OMAP24XX_PM_WKST2
);
113 DUMP_PRM_MOD_REG(WKUP_MOD
, PM_WKST
);
114 DUMP_PRM_MOD_REG(OCP_MOD
, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET
);
116 DUMP_INTC_REG(INTC_PENDING_IRQ0
, 0x0098);
117 DUMP_INTC_REG(INTC_PENDING_IRQ1
, 0x00b8);
118 DUMP_INTC_REG(INTC_PENDING_IRQ2
, 0x00d8);
140 "--- Going to %s %s (next timer after %u ms)\n", s1
, s2
,
141 jiffies_to_msecs(get_next_timer_interrupt(jiffies
) -
144 printk(KERN_INFO
"--- Going to %s %s\n", s1
, s2
);
147 printk(KERN_INFO
"--- Woke up (slept for %u.%03u ms)\n",
148 us
/ 1000, us
% 1000);
150 for (i
= 0; i
< reg_count
; i
++)
151 printk(KERN_INFO
"%-20s: 0x%08x\n", regs
[i
].name
, regs
[i
].val
);