diff options
Diffstat (limited to 'arch/arm/mach-omap2/pm34xx.c')
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 487 |
1 files changed, 159 insertions, 328 deletions
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 7b03426c72a3..c155c9d1c82c 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -28,37 +28,49 @@ | |||
28 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/console.h> | ||
32 | #include <trace/events/power.h> | ||
31 | 33 | ||
32 | #include <plat/sram.h> | 34 | #include <plat/sram.h> |
33 | #include <plat/clockdomain.h> | 35 | #include "clockdomain.h" |
34 | #include <plat/powerdomain.h> | 36 | #include "powerdomain.h" |
35 | #include <plat/control.h> | ||
36 | #include <plat/serial.h> | 37 | #include <plat/serial.h> |
37 | #include <plat/sdrc.h> | 38 | #include <plat/sdrc.h> |
38 | #include <plat/prcm.h> | 39 | #include <plat/prcm.h> |
39 | #include <plat/gpmc.h> | 40 | #include <plat/gpmc.h> |
40 | #include <plat/dma.h> | 41 | #include <plat/dma.h> |
41 | #include <plat/dmtimer.h> | ||
42 | 42 | ||
43 | #include <asm/tlbflush.h> | 43 | #include <asm/tlbflush.h> |
44 | 44 | ||
45 | #include "cm.h" | 45 | #include "cm2xxx_3xxx.h" |
46 | #include "cm-regbits-34xx.h" | 46 | #include "cm-regbits-34xx.h" |
47 | #include "prm-regbits-34xx.h" | 47 | #include "prm-regbits-34xx.h" |
48 | 48 | ||
49 | #include "prm.h" | 49 | #include "prm2xxx_3xxx.h" |
50 | #include "pm.h" | 50 | #include "pm.h" |
51 | #include "sdrc.h" | 51 | #include "sdrc.h" |
52 | #include "control.h" | ||
53 | |||
54 | #ifdef CONFIG_SUSPEND | ||
55 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | ||
56 | static inline bool is_suspending(void) | ||
57 | { | ||
58 | return (suspend_state != PM_SUSPEND_ON); | ||
59 | } | ||
60 | #else | ||
61 | static inline bool is_suspending(void) | ||
62 | { | ||
63 | return false; | ||
64 | } | ||
65 | #endif | ||
52 | 66 | ||
53 | /* Scratchpad offsets */ | 67 | /* Scratchpad offsets */ |
54 | #define OMAP343X_TABLE_ADDRESS_OFFSET 0x31 | 68 | #define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4 |
55 | #define OMAP343X_TABLE_VALUE_OFFSET 0x30 | 69 | #define OMAP343X_TABLE_VALUE_OFFSET 0xc0 |
56 | #define OMAP343X_CONTROL_REG_VALUE_OFFSET 0x32 | 70 | #define OMAP343X_CONTROL_REG_VALUE_OFFSET 0xc8 |
57 | 71 | ||
58 | u32 enable_off_mode; | 72 | /* pm34xx errata defined in pm.h */ |
59 | u32 sleep_while_idle; | 73 | u16 pm34xx_errata; |
60 | u32 wakeup_timer_seconds; | ||
61 | u32 wakeup_timer_milliseconds; | ||
62 | 74 | ||
63 | struct power_state { | 75 | struct power_state { |
64 | struct powerdomain *pwrdm; | 76 | struct powerdomain *pwrdm; |
@@ -94,12 +106,12 @@ static void omap3_enable_io_chain(void) | |||
94 | int timeout = 0; | 106 | int timeout = 0; |
95 | 107 | ||
96 | if (omap_rev() >= OMAP3430_REV_ES3_1) { | 108 | if (omap_rev() >= OMAP3430_REV_ES3_1) { |
97 | prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, | 109 | omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, |
98 | PM_WKEN); | 110 | PM_WKEN); |
99 | /* Do a readback to assure write has been done */ | 111 | /* Do a readback to assure write has been done */ |
100 | prm_read_mod_reg(WKUP_MOD, PM_WKEN); | 112 | omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN); |
101 | 113 | ||
102 | while (!(prm_read_mod_reg(WKUP_MOD, PM_WKEN) & | 114 | while (!(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN) & |
103 | OMAP3430_ST_IO_CHAIN_MASK)) { | 115 | OMAP3430_ST_IO_CHAIN_MASK)) { |
104 | timeout++; | 116 | timeout++; |
105 | if (timeout > 1000) { | 117 | if (timeout > 1000) { |
@@ -107,7 +119,7 @@ static void omap3_enable_io_chain(void) | |||
107 | "activation failed.\n"); | 119 | "activation failed.\n"); |
108 | return; | 120 | return; |
109 | } | 121 | } |
110 | prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, | 122 | omap2_prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK, |
111 | WKUP_MOD, PM_WKEN); | 123 | WKUP_MOD, PM_WKEN); |
112 | } | 124 | } |
113 | } | 125 | } |
@@ -116,26 +128,17 @@ static void omap3_enable_io_chain(void) | |||
116 | static void omap3_disable_io_chain(void) | 128 | static void omap3_disable_io_chain(void) |
117 | { | 129 | { |
118 | if (omap_rev() >= OMAP3430_REV_ES3_1) | 130 | if (omap_rev() >= OMAP3430_REV_ES3_1) |
119 | prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, | 131 | omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD, |
120 | PM_WKEN); | 132 | PM_WKEN); |
121 | } | 133 | } |
122 | 134 | ||
123 | static void omap3_core_save_context(void) | 135 | static void omap3_core_save_context(void) |
124 | { | 136 | { |
125 | u32 control_padconf_off; | 137 | omap3_ctrl_save_padconf(); |
126 | |||
127 | /* Save the padconf registers */ | ||
128 | control_padconf_off = omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_OFF); | ||
129 | control_padconf_off |= START_PADCONF_SAVE; | ||
130 | omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF); | ||
131 | /* wait for the save to complete */ | ||
132 | while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) | ||
133 | & PADCONF_SAVE_DONE)) | ||
134 | udelay(1); | ||
135 | 138 | ||
136 | /* | 139 | /* |
137 | * Force write last pad into memory, as this can fail in some | 140 | * Force write last pad into memory, as this can fail in some |
138 | * cases according to erratas 1.157, 1.185 | 141 | * cases according to errata 1.157, 1.185 |
139 | */ | 142 | */ |
140 | omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14), | 143 | omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14), |
141 | OMAP343X_CONTROL_MEM_WKUP + 0x2a0); | 144 | OMAP343X_CONTROL_MEM_WKUP + 0x2a0); |
@@ -166,9 +169,10 @@ static void omap3_core_restore_context(void) | |||
166 | * once during boot sequence, but this works as we are not using secure | 169 | * once during boot sequence, but this works as we are not using secure |
167 | * services. | 170 | * services. |
168 | */ | 171 | */ |
169 | static void omap3_save_secure_ram_context(u32 target_mpu_state) | 172 | static void omap3_save_secure_ram_context(void) |
170 | { | 173 | { |
171 | u32 ret; | 174 | u32 ret; |
175 | int mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm); | ||
172 | 176 | ||
173 | if (omap_type() != OMAP2_DEVICE_TYPE_GP) { | 177 | if (omap_type() != OMAP2_DEVICE_TYPE_GP) { |
174 | /* | 178 | /* |
@@ -179,7 +183,7 @@ static void omap3_save_secure_ram_context(u32 target_mpu_state) | |||
179 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); | 183 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); |
180 | ret = _omap_save_secure_sram((u32 *) | 184 | ret = _omap_save_secure_sram((u32 *) |
181 | __pa(omap3_secure_ram_storage)); | 185 | __pa(omap3_secure_ram_storage)); |
182 | pwrdm_set_next_pwrst(mpu_pwrdm, target_mpu_state); | 186 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); |
183 | /* Following is for error tracking, it should not happen */ | 187 | /* Following is for error tracking, it should not happen */ |
184 | if (ret) { | 188 | if (ret) { |
185 | printk(KERN_ERR "save_secure_sram() returns %08x\n", | 189 | printk(KERN_ERR "save_secure_sram() returns %08x\n", |
@@ -210,27 +214,27 @@ static int prcm_clear_mod_irqs(s16 module, u8 regs) | |||
210 | OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL; | 214 | OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL; |
211 | int c = 0; | 215 | int c = 0; |
212 | 216 | ||
213 | wkst = prm_read_mod_reg(module, wkst_off); | 217 | wkst = omap2_prm_read_mod_reg(module, wkst_off); |
214 | wkst &= prm_read_mod_reg(module, grpsel_off); | 218 | wkst &= omap2_prm_read_mod_reg(module, grpsel_off); |
215 | if (wkst) { | 219 | if (wkst) { |
216 | iclk = cm_read_mod_reg(module, iclk_off); | 220 | iclk = omap2_cm_read_mod_reg(module, iclk_off); |
217 | fclk = cm_read_mod_reg(module, fclk_off); | 221 | fclk = omap2_cm_read_mod_reg(module, fclk_off); |
218 | while (wkst) { | 222 | while (wkst) { |
219 | clken = wkst; | 223 | clken = wkst; |
220 | cm_set_mod_reg_bits(clken, module, iclk_off); | 224 | omap2_cm_set_mod_reg_bits(clken, module, iclk_off); |
221 | /* | 225 | /* |
222 | * For USBHOST, we don't know whether HOST1 or | 226 | * For USBHOST, we don't know whether HOST1 or |
223 | * HOST2 woke us up, so enable both f-clocks | 227 | * HOST2 woke us up, so enable both f-clocks |
224 | */ | 228 | */ |
225 | if (module == OMAP3430ES2_USBHOST_MOD) | 229 | if (module == OMAP3430ES2_USBHOST_MOD) |
226 | clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT; | 230 | clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT; |
227 | cm_set_mod_reg_bits(clken, module, fclk_off); | 231 | omap2_cm_set_mod_reg_bits(clken, module, fclk_off); |
228 | prm_write_mod_reg(wkst, module, wkst_off); | 232 | omap2_prm_write_mod_reg(wkst, module, wkst_off); |
229 | wkst = prm_read_mod_reg(module, wkst_off); | 233 | wkst = omap2_prm_read_mod_reg(module, wkst_off); |
230 | c++; | 234 | c++; |
231 | } | 235 | } |
232 | cm_write_mod_reg(iclk, module, iclk_off); | 236 | omap2_cm_write_mod_reg(iclk, module, iclk_off); |
233 | cm_write_mod_reg(fclk, module, fclk_off); | 237 | omap2_cm_write_mod_reg(fclk, module, fclk_off); |
234 | } | 238 | } |
235 | 239 | ||
236 | return c; | 240 | return c; |
@@ -273,9 +277,9 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | |||
273 | u32 irqenable_mpu, irqstatus_mpu; | 277 | u32 irqenable_mpu, irqstatus_mpu; |
274 | int c = 0; | 278 | int c = 0; |
275 | 279 | ||
276 | irqenable_mpu = prm_read_mod_reg(OCP_MOD, | 280 | irqenable_mpu = omap2_prm_read_mod_reg(OCP_MOD, |
277 | OMAP3_PRM_IRQENABLE_MPU_OFFSET); | 281 | OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
278 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, | 282 | irqstatus_mpu = omap2_prm_read_mod_reg(OCP_MOD, |
279 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 283 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
280 | irqstatus_mpu &= irqenable_mpu; | 284 | irqstatus_mpu &= irqenable_mpu; |
281 | 285 | ||
@@ -296,10 +300,10 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | |||
296 | "no code to handle it (%08x)\n", irqstatus_mpu); | 300 | "no code to handle it (%08x)\n", irqstatus_mpu); |
297 | } | 301 | } |
298 | 302 | ||
299 | prm_write_mod_reg(irqstatus_mpu, OCP_MOD, | 303 | omap2_prm_write_mod_reg(irqstatus_mpu, OCP_MOD, |
300 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 304 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
301 | 305 | ||
302 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, | 306 | irqstatus_mpu = omap2_prm_read_mod_reg(OCP_MOD, |
303 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 307 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
304 | irqstatus_mpu &= irqenable_mpu; | 308 | irqstatus_mpu &= irqenable_mpu; |
305 | 309 | ||
@@ -308,15 +312,10 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | |||
308 | return IRQ_HANDLED; | 312 | return IRQ_HANDLED; |
309 | } | 313 | } |
310 | 314 | ||
311 | static void restore_control_register(u32 val) | ||
312 | { | ||
313 | __asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r" (val)); | ||
314 | } | ||
315 | |||
316 | /* Function to restore the table entry that was modified for enabling MMU */ | 315 | /* Function to restore the table entry that was modified for enabling MMU */ |
317 | static void restore_table_entry(void) | 316 | static void restore_table_entry(void) |
318 | { | 317 | { |
319 | u32 *scratchpad_address; | 318 | void __iomem *scratchpad_address; |
320 | u32 previous_value, control_reg_value; | 319 | u32 previous_value, control_reg_value; |
321 | u32 *address; | 320 | u32 *address; |
322 | 321 | ||
@@ -334,7 +333,7 @@ static void restore_table_entry(void) | |||
334 | control_reg_value = __raw_readl(scratchpad_address | 333 | control_reg_value = __raw_readl(scratchpad_address |
335 | + OMAP343X_CONTROL_REG_VALUE_OFFSET); | 334 | + OMAP343X_CONTROL_REG_VALUE_OFFSET); |
336 | /* This will enable caches and prediction */ | 335 | /* This will enable caches and prediction */ |
337 | restore_control_register(control_reg_value); | 336 | set_cr(control_reg_value); |
338 | } | 337 | } |
339 | 338 | ||
340 | void omap_sram_idle(void) | 339 | void omap_sram_idle(void) |
@@ -349,9 +348,9 @@ void omap_sram_idle(void) | |||
349 | int mpu_next_state = PWRDM_POWER_ON; | 348 | int mpu_next_state = PWRDM_POWER_ON; |
350 | int per_next_state = PWRDM_POWER_ON; | 349 | int per_next_state = PWRDM_POWER_ON; |
351 | int core_next_state = PWRDM_POWER_ON; | 350 | int core_next_state = PWRDM_POWER_ON; |
351 | int per_going_off; | ||
352 | int core_prev_state, per_prev_state; | 352 | int core_prev_state, per_prev_state; |
353 | u32 sdrc_pwr = 0; | 353 | u32 sdrc_pwr = 0; |
354 | int per_state_modified = 0; | ||
355 | 354 | ||
356 | if (!_omap_sram_idle) | 355 | if (!_omap_sram_idle) |
357 | return; | 356 | return; |
@@ -385,37 +384,37 @@ void omap_sram_idle(void) | |||
385 | /* Enable IO-PAD and IO-CHAIN wakeups */ | 384 | /* Enable IO-PAD and IO-CHAIN wakeups */ |
386 | per_next_state = pwrdm_read_next_pwrst(per_pwrdm); | 385 | per_next_state = pwrdm_read_next_pwrst(per_pwrdm); |
387 | core_next_state = pwrdm_read_next_pwrst(core_pwrdm); | 386 | core_next_state = pwrdm_read_next_pwrst(core_pwrdm); |
388 | if (omap3_has_io_wakeup() && \ | 387 | if (omap3_has_io_wakeup() && |
389 | (per_next_state < PWRDM_POWER_ON || | 388 | (per_next_state < PWRDM_POWER_ON || |
390 | core_next_state < PWRDM_POWER_ON)) { | 389 | core_next_state < PWRDM_POWER_ON)) { |
391 | prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN); | 390 | omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN); |
392 | omap3_enable_io_chain(); | 391 | omap3_enable_io_chain(); |
393 | } | 392 | } |
394 | 393 | ||
394 | /* Block console output in case it is on one of the OMAP UARTs */ | ||
395 | if (!is_suspending()) | ||
396 | if (per_next_state < PWRDM_POWER_ON || | ||
397 | core_next_state < PWRDM_POWER_ON) | ||
398 | if (!console_trylock()) | ||
399 | goto console_still_active; | ||
400 | |||
395 | /* PER */ | 401 | /* PER */ |
396 | if (per_next_state < PWRDM_POWER_ON) { | 402 | if (per_next_state < PWRDM_POWER_ON) { |
403 | per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0; | ||
397 | omap_uart_prepare_idle(2); | 404 | omap_uart_prepare_idle(2); |
398 | omap2_gpio_prepare_for_idle(per_next_state); | 405 | omap_uart_prepare_idle(3); |
399 | if (per_next_state == PWRDM_POWER_OFF) { | 406 | omap2_gpio_prepare_for_idle(per_going_off); |
400 | if (core_next_state == PWRDM_POWER_ON) { | 407 | if (per_next_state == PWRDM_POWER_OFF) |
401 | per_next_state = PWRDM_POWER_RET; | ||
402 | pwrdm_set_next_pwrst(per_pwrdm, per_next_state); | ||
403 | per_state_modified = 1; | ||
404 | } else | ||
405 | omap3_per_save_context(); | 408 | omap3_per_save_context(); |
406 | } | ||
407 | } | 409 | } |
408 | 410 | ||
409 | if (pwrdm_read_pwrst(cam_pwrdm) == PWRDM_POWER_ON) | ||
410 | omap2_clkdm_deny_idle(mpu_pwrdm->pwrdm_clkdms[0]); | ||
411 | |||
412 | /* CORE */ | 411 | /* CORE */ |
413 | if (core_next_state < PWRDM_POWER_ON) { | 412 | if (core_next_state < PWRDM_POWER_ON) { |
414 | omap_uart_prepare_idle(0); | 413 | omap_uart_prepare_idle(0); |
415 | omap_uart_prepare_idle(1); | 414 | omap_uart_prepare_idle(1); |
416 | if (core_next_state == PWRDM_POWER_OFF) { | 415 | if (core_next_state == PWRDM_POWER_OFF) { |
417 | omap3_core_save_context(); | 416 | omap3_core_save_context(); |
418 | omap3_prcm_save_context(); | 417 | omap3_cm_save_context(); |
419 | } | 418 | } |
420 | } | 419 | } |
421 | 420 | ||
@@ -424,7 +423,7 @@ void omap_sram_idle(void) | |||
424 | /* | 423 | /* |
425 | * On EMU/HS devices ROM code restores a SRDC value | 424 | * On EMU/HS devices ROM code restores a SRDC value |
426 | * from scratchpad which has automatic self refresh on timeout | 425 | * from scratchpad which has automatic self refresh on timeout |
427 | * of AUTO_CNT = 1 enabled. This takes care of errata 1.142. | 426 | * of AUTO_CNT = 1 enabled. This takes care of erratum ID i443. |
428 | * Hence store/restore the SDRC_POWER register here. | 427 | * Hence store/restore the SDRC_POWER register here. |
429 | */ | 428 | */ |
430 | if (omap_rev() >= OMAP3430_REV_ES3_0 && | 429 | if (omap_rev() >= OMAP3430_REV_ES3_0 && |
@@ -455,14 +454,14 @@ void omap_sram_idle(void) | |||
455 | core_prev_state = pwrdm_read_prev_pwrst(core_pwrdm); | 454 | core_prev_state = pwrdm_read_prev_pwrst(core_pwrdm); |
456 | if (core_prev_state == PWRDM_POWER_OFF) { | 455 | if (core_prev_state == PWRDM_POWER_OFF) { |
457 | omap3_core_restore_context(); | 456 | omap3_core_restore_context(); |
458 | omap3_prcm_restore_context(); | 457 | omap3_cm_restore_context(); |
459 | omap3_sram_restore_context(); | 458 | omap3_sram_restore_context(); |
460 | omap2_sms_restore_context(); | 459 | omap2_sms_restore_context(); |
461 | } | 460 | } |
462 | omap_uart_resume_idle(0); | 461 | omap_uart_resume_idle(0); |
463 | omap_uart_resume_idle(1); | 462 | omap_uart_resume_idle(1); |
464 | if (core_next_state == PWRDM_POWER_OFF) | 463 | if (core_next_state == PWRDM_POWER_OFF) |
465 | prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK, | 464 | omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK, |
466 | OMAP3430_GR_MOD, | 465 | OMAP3430_GR_MOD, |
467 | OMAP3_PRM_VOLTCTRL_OFFSET); | 466 | OMAP3_PRM_VOLTCTRL_OFFSET); |
468 | } | 467 | } |
@@ -475,21 +474,25 @@ void omap_sram_idle(void) | |||
475 | if (per_prev_state == PWRDM_POWER_OFF) | 474 | if (per_prev_state == PWRDM_POWER_OFF) |
476 | omap3_per_restore_context(); | 475 | omap3_per_restore_context(); |
477 | omap_uart_resume_idle(2); | 476 | omap_uart_resume_idle(2); |
478 | if (per_state_modified) | 477 | omap_uart_resume_idle(3); |
479 | pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF); | ||
480 | } | 478 | } |
481 | 479 | ||
480 | if (!is_suspending()) | ||
481 | console_unlock(); | ||
482 | |||
483 | console_still_active: | ||
482 | /* Disable IO-PAD and IO-CHAIN wakeup */ | 484 | /* Disable IO-PAD and IO-CHAIN wakeup */ |
483 | if (omap3_has_io_wakeup() && | 485 | if (omap3_has_io_wakeup() && |
484 | (per_next_state < PWRDM_POWER_ON || | 486 | (per_next_state < PWRDM_POWER_ON || |
485 | core_next_state < PWRDM_POWER_ON)) { | 487 | core_next_state < PWRDM_POWER_ON)) { |
486 | prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN); | 488 | omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, |
489 | PM_WKEN); | ||
487 | omap3_disable_io_chain(); | 490 | omap3_disable_io_chain(); |
488 | } | 491 | } |
489 | 492 | ||
490 | pwrdm_post_transition(); | 493 | pwrdm_post_transition(); |
491 | 494 | ||
492 | omap2_clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]); | 495 | clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]); |
493 | } | 496 | } |
494 | 497 | ||
495 | int omap3_can_sleep(void) | 498 | int omap3_can_sleep(void) |
@@ -501,51 +504,6 @@ int omap3_can_sleep(void) | |||
501 | return 1; | 504 | return 1; |
502 | } | 505 | } |
503 | 506 | ||
504 | /* This sets pwrdm state (other than mpu & core. Currently only ON & | ||
505 | * RET are supported. Function is assuming that clkdm doesn't have | ||
506 | * hw_sup mode enabled. */ | ||
507 | int set_pwrdm_state(struct powerdomain *pwrdm, u32 state) | ||
508 | { | ||
509 | u32 cur_state; | ||
510 | int sleep_switch = 0; | ||
511 | int ret = 0; | ||
512 | |||
513 | if (pwrdm == NULL || IS_ERR(pwrdm)) | ||
514 | return -EINVAL; | ||
515 | |||
516 | while (!(pwrdm->pwrsts & (1 << state))) { | ||
517 | if (state == PWRDM_POWER_OFF) | ||
518 | return ret; | ||
519 | state--; | ||
520 | } | ||
521 | |||
522 | cur_state = pwrdm_read_next_pwrst(pwrdm); | ||
523 | if (cur_state == state) | ||
524 | return ret; | ||
525 | |||
526 | if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) { | ||
527 | omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); | ||
528 | sleep_switch = 1; | ||
529 | pwrdm_wait_transition(pwrdm); | ||
530 | } | ||
531 | |||
532 | ret = pwrdm_set_next_pwrst(pwrdm, state); | ||
533 | if (ret) { | ||
534 | printk(KERN_ERR "Unable to set state of powerdomain: %s\n", | ||
535 | pwrdm->name); | ||
536 | goto err; | ||
537 | } | ||
538 | |||
539 | if (sleep_switch) { | ||
540 | omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); | ||
541 | pwrdm_wait_transition(pwrdm); | ||
542 | pwrdm_state_switch(pwrdm); | ||
543 | } | ||
544 | |||
545 | err: | ||
546 | return ret; | ||
547 | } | ||
548 | |||
549 | static void omap3_pm_idle(void) | 507 | static void omap3_pm_idle(void) |
550 | { | 508 | { |
551 | local_irq_disable(); | 509 | local_irq_disable(); |
@@ -557,39 +515,20 @@ static void omap3_pm_idle(void) | |||
557 | if (omap_irq_pending() || need_resched()) | 515 | if (omap_irq_pending() || need_resched()) |
558 | goto out; | 516 | goto out; |
559 | 517 | ||
518 | trace_power_start(POWER_CSTATE, 1, smp_processor_id()); | ||
519 | trace_cpu_idle(1, smp_processor_id()); | ||
520 | |||
560 | omap_sram_idle(); | 521 | omap_sram_idle(); |
561 | 522 | ||
523 | trace_power_end(smp_processor_id()); | ||
524 | trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()); | ||
525 | |||
562 | out: | 526 | out: |
563 | local_fiq_enable(); | 527 | local_fiq_enable(); |
564 | local_irq_enable(); | 528 | local_irq_enable(); |
565 | } | 529 | } |
566 | 530 | ||
567 | #ifdef CONFIG_SUSPEND | 531 | #ifdef CONFIG_SUSPEND |
568 | static suspend_state_t suspend_state; | ||
569 | |||
570 | static void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds) | ||
571 | { | ||
572 | u32 tick_rate, cycles; | ||
573 | |||
574 | if (!seconds && !milliseconds) | ||
575 | return; | ||
576 | |||
577 | tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup)); | ||
578 | cycles = tick_rate * seconds + tick_rate * milliseconds / 1000; | ||
579 | omap_dm_timer_stop(gptimer_wakeup); | ||
580 | omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles); | ||
581 | |||
582 | pr_info("PM: Resume timer in %u.%03u secs" | ||
583 | " (%d ticks at %d ticks/sec.)\n", | ||
584 | seconds, milliseconds, cycles, tick_rate); | ||
585 | } | ||
586 | |||
587 | static int omap3_pm_prepare(void) | ||
588 | { | ||
589 | disable_hlt(); | ||
590 | return 0; | ||
591 | } | ||
592 | |||
593 | static int omap3_pm_suspend(void) | 532 | static int omap3_pm_suspend(void) |
594 | { | 533 | { |
595 | struct power_state *pwrst; | 534 | struct power_state *pwrst; |
@@ -604,7 +543,7 @@ static int omap3_pm_suspend(void) | |||
604 | pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm); | 543 | pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm); |
605 | /* Set ones wanted by suspend */ | 544 | /* Set ones wanted by suspend */ |
606 | list_for_each_entry(pwrst, &pwrst_list, node) { | 545 | list_for_each_entry(pwrst, &pwrst_list, node) { |
607 | if (set_pwrdm_state(pwrst->pwrdm, pwrst->next_state)) | 546 | if (omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state)) |
608 | goto restore; | 547 | goto restore; |
609 | if (pwrdm_clear_all_prev_pwrst(pwrst->pwrdm)) | 548 | if (pwrdm_clear_all_prev_pwrst(pwrst->pwrdm)) |
610 | goto restore; | 549 | goto restore; |
@@ -625,7 +564,7 @@ restore: | |||
625 | pwrst->pwrdm->name, pwrst->next_state); | 564 | pwrst->pwrdm->name, pwrst->next_state); |
626 | ret = -1; | 565 | ret = -1; |
627 | } | 566 | } |
628 | set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | 567 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); |
629 | } | 568 | } |
630 | if (ret) | 569 | if (ret) |
631 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); | 570 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); |
@@ -652,14 +591,10 @@ static int omap3_pm_enter(suspend_state_t unused) | |||
652 | return ret; | 591 | return ret; |
653 | } | 592 | } |
654 | 593 | ||
655 | static void omap3_pm_finish(void) | ||
656 | { | ||
657 | enable_hlt(); | ||
658 | } | ||
659 | |||
660 | /* Hooks to enable / disable UART interrupts during suspend */ | 594 | /* Hooks to enable / disable UART interrupts during suspend */ |
661 | static int omap3_pm_begin(suspend_state_t state) | 595 | static int omap3_pm_begin(suspend_state_t state) |
662 | { | 596 | { |
597 | disable_hlt(); | ||
663 | suspend_state = state; | 598 | suspend_state = state; |
664 | omap_uart_enable_irqs(0); | 599 | omap_uart_enable_irqs(0); |
665 | return 0; | 600 | return 0; |
@@ -669,15 +604,14 @@ static void omap3_pm_end(void) | |||
669 | { | 604 | { |
670 | suspend_state = PM_SUSPEND_ON; | 605 | suspend_state = PM_SUSPEND_ON; |
671 | omap_uart_enable_irqs(1); | 606 | omap_uart_enable_irqs(1); |
607 | enable_hlt(); | ||
672 | return; | 608 | return; |
673 | } | 609 | } |
674 | 610 | ||
675 | static struct platform_suspend_ops omap_pm_ops = { | 611 | static const struct platform_suspend_ops omap_pm_ops = { |
676 | .begin = omap3_pm_begin, | 612 | .begin = omap3_pm_begin, |
677 | .end = omap3_pm_end, | 613 | .end = omap3_pm_end, |
678 | .prepare = omap3_pm_prepare, | ||
679 | .enter = omap3_pm_enter, | 614 | .enter = omap3_pm_enter, |
680 | .finish = omap3_pm_finish, | ||
681 | .valid = suspend_valid_only_mem, | 615 | .valid = suspend_valid_only_mem, |
682 | }; | 616 | }; |
683 | #endif /* CONFIG_SUSPEND */ | 617 | #endif /* CONFIG_SUSPEND */ |
@@ -696,21 +630,21 @@ static struct platform_suspend_ops omap_pm_ops = { | |||
696 | static void __init omap3_iva_idle(void) | 630 | static void __init omap3_iva_idle(void) |
697 | { | 631 | { |
698 | /* ensure IVA2 clock is disabled */ | 632 | /* ensure IVA2 clock is disabled */ |
699 | cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN); | 633 | omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN); |
700 | 634 | ||
701 | /* if no clock activity, nothing else to do */ | 635 | /* if no clock activity, nothing else to do */ |
702 | if (!(cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) & | 636 | if (!(omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) & |
703 | OMAP3430_CLKACTIVITY_IVA2_MASK)) | 637 | OMAP3430_CLKACTIVITY_IVA2_MASK)) |
704 | return; | 638 | return; |
705 | 639 | ||
706 | /* Reset IVA2 */ | 640 | /* Reset IVA2 */ |
707 | prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK | | 641 | omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK | |
708 | OMAP3430_RST2_IVA2_MASK | | 642 | OMAP3430_RST2_IVA2_MASK | |
709 | OMAP3430_RST3_IVA2_MASK, | 643 | OMAP3430_RST3_IVA2_MASK, |
710 | OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); | 644 | OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); |
711 | 645 | ||
712 | /* Enable IVA2 clock */ | 646 | /* Enable IVA2 clock */ |
713 | cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK, | 647 | omap2_cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK, |
714 | OMAP3430_IVA2_MOD, CM_FCLKEN); | 648 | OMAP3430_IVA2_MOD, CM_FCLKEN); |
715 | 649 | ||
716 | /* Set IVA2 boot mode to 'idle' */ | 650 | /* Set IVA2 boot mode to 'idle' */ |
@@ -718,13 +652,13 @@ static void __init omap3_iva_idle(void) | |||
718 | OMAP343X_CONTROL_IVA2_BOOTMOD); | 652 | OMAP343X_CONTROL_IVA2_BOOTMOD); |
719 | 653 | ||
720 | /* Un-reset IVA2 */ | 654 | /* Un-reset IVA2 */ |
721 | prm_write_mod_reg(0, OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); | 655 | omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); |
722 | 656 | ||
723 | /* Disable IVA2 clock */ | 657 | /* Disable IVA2 clock */ |
724 | cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN); | 658 | omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN); |
725 | 659 | ||
726 | /* Reset IVA2 */ | 660 | /* Reset IVA2 */ |
727 | prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK | | 661 | omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK | |
728 | OMAP3430_RST2_IVA2_MASK | | 662 | OMAP3430_RST2_IVA2_MASK | |
729 | OMAP3430_RST3_IVA2_MASK, | 663 | OMAP3430_RST3_IVA2_MASK, |
730 | OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); | 664 | OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); |
@@ -748,184 +682,61 @@ static void __init omap3_d2d_idle(void) | |||
748 | omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK); | 682 | omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK); |
749 | 683 | ||
750 | /* reset modem */ | 684 | /* reset modem */ |
751 | prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK | | 685 | omap2_prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK | |
752 | OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK, | 686 | OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK, |
753 | CORE_MOD, OMAP2_RM_RSTCTRL); | 687 | CORE_MOD, OMAP2_RM_RSTCTRL); |
754 | prm_write_mod_reg(0, CORE_MOD, OMAP2_RM_RSTCTRL); | 688 | omap2_prm_write_mod_reg(0, CORE_MOD, OMAP2_RM_RSTCTRL); |
755 | } | 689 | } |
756 | 690 | ||
757 | static void __init prcm_setup_regs(void) | 691 | static void __init prcm_setup_regs(void) |
758 | { | 692 | { |
759 | /* XXX Reset all wkdeps. This should be done when initializing | 693 | u32 omap3630_en_uart4_mask = cpu_is_omap3630() ? |
760 | * powerdomains */ | 694 | OMAP3630_EN_UART4_MASK : 0; |
761 | prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP); | 695 | u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ? |
762 | prm_write_mod_reg(0, MPU_MOD, PM_WKDEP); | 696 | OMAP3630_GRPSEL_UART4_MASK : 0; |
763 | prm_write_mod_reg(0, OMAP3430_DSS_MOD, PM_WKDEP); | ||
764 | prm_write_mod_reg(0, OMAP3430_NEON_MOD, PM_WKDEP); | ||
765 | prm_write_mod_reg(0, OMAP3430_CAM_MOD, PM_WKDEP); | ||
766 | prm_write_mod_reg(0, OMAP3430_PER_MOD, PM_WKDEP); | ||
767 | if (omap_rev() > OMAP3430_REV_ES1_0) { | ||
768 | prm_write_mod_reg(0, OMAP3430ES2_SGX_MOD, PM_WKDEP); | ||
769 | prm_write_mod_reg(0, OMAP3430ES2_USBHOST_MOD, PM_WKDEP); | ||
770 | } else | ||
771 | prm_write_mod_reg(0, GFX_MOD, PM_WKDEP); | ||
772 | |||
773 | /* | ||
774 | * Enable interface clock autoidle for all modules. | ||
775 | * Note that in the long run this should be done by clockfw | ||
776 | */ | ||
777 | cm_write_mod_reg( | ||
778 | OMAP3430_AUTO_MODEM_MASK | | ||
779 | OMAP3430ES2_AUTO_MMC3_MASK | | ||
780 | OMAP3430ES2_AUTO_ICR_MASK | | ||
781 | OMAP3430_AUTO_AES2_MASK | | ||
782 | OMAP3430_AUTO_SHA12_MASK | | ||
783 | OMAP3430_AUTO_DES2_MASK | | ||
784 | OMAP3430_AUTO_MMC2_MASK | | ||
785 | OMAP3430_AUTO_MMC1_MASK | | ||
786 | OMAP3430_AUTO_MSPRO_MASK | | ||
787 | OMAP3430_AUTO_HDQ_MASK | | ||
788 | OMAP3430_AUTO_MCSPI4_MASK | | ||
789 | OMAP3430_AUTO_MCSPI3_MASK | | ||
790 | OMAP3430_AUTO_MCSPI2_MASK | | ||
791 | OMAP3430_AUTO_MCSPI1_MASK | | ||
792 | OMAP3430_AUTO_I2C3_MASK | | ||
793 | OMAP3430_AUTO_I2C2_MASK | | ||
794 | OMAP3430_AUTO_I2C1_MASK | | ||
795 | OMAP3430_AUTO_UART2_MASK | | ||
796 | OMAP3430_AUTO_UART1_MASK | | ||
797 | OMAP3430_AUTO_GPT11_MASK | | ||
798 | OMAP3430_AUTO_GPT10_MASK | | ||
799 | OMAP3430_AUTO_MCBSP5_MASK | | ||
800 | OMAP3430_AUTO_MCBSP1_MASK | | ||
801 | OMAP3430ES1_AUTO_FAC_MASK | /* This is es1 only */ | ||
802 | OMAP3430_AUTO_MAILBOXES_MASK | | ||
803 | OMAP3430_AUTO_OMAPCTRL_MASK | | ||
804 | OMAP3430ES1_AUTO_FSHOSTUSB_MASK | | ||
805 | OMAP3430_AUTO_HSOTGUSB_MASK | | ||
806 | OMAP3430_AUTO_SAD2D_MASK | | ||
807 | OMAP3430_AUTO_SSI_MASK, | ||
808 | CORE_MOD, CM_AUTOIDLE1); | ||
809 | |||
810 | cm_write_mod_reg( | ||
811 | OMAP3430_AUTO_PKA_MASK | | ||
812 | OMAP3430_AUTO_AES1_MASK | | ||
813 | OMAP3430_AUTO_RNG_MASK | | ||
814 | OMAP3430_AUTO_SHA11_MASK | | ||
815 | OMAP3430_AUTO_DES1_MASK, | ||
816 | CORE_MOD, CM_AUTOIDLE2); | ||
817 | |||
818 | if (omap_rev() > OMAP3430_REV_ES1_0) { | ||
819 | cm_write_mod_reg( | ||
820 | OMAP3430_AUTO_MAD2D_MASK | | ||
821 | OMAP3430ES2_AUTO_USBTLL_MASK, | ||
822 | CORE_MOD, CM_AUTOIDLE3); | ||
823 | } | ||
824 | |||
825 | cm_write_mod_reg( | ||
826 | OMAP3430_AUTO_WDT2_MASK | | ||
827 | OMAP3430_AUTO_WDT1_MASK | | ||
828 | OMAP3430_AUTO_GPIO1_MASK | | ||
829 | OMAP3430_AUTO_32KSYNC_MASK | | ||
830 | OMAP3430_AUTO_GPT12_MASK | | ||
831 | OMAP3430_AUTO_GPT1_MASK, | ||
832 | WKUP_MOD, CM_AUTOIDLE); | ||
833 | |||
834 | cm_write_mod_reg( | ||
835 | OMAP3430_AUTO_DSS_MASK, | ||
836 | OMAP3430_DSS_MOD, | ||
837 | CM_AUTOIDLE); | ||
838 | |||
839 | cm_write_mod_reg( | ||
840 | OMAP3430_AUTO_CAM_MASK, | ||
841 | OMAP3430_CAM_MOD, | ||
842 | CM_AUTOIDLE); | ||
843 | |||
844 | cm_write_mod_reg( | ||
845 | OMAP3430_AUTO_GPIO6_MASK | | ||
846 | OMAP3430_AUTO_GPIO5_MASK | | ||
847 | OMAP3430_AUTO_GPIO4_MASK | | ||
848 | OMAP3430_AUTO_GPIO3_MASK | | ||
849 | OMAP3430_AUTO_GPIO2_MASK | | ||
850 | OMAP3430_AUTO_WDT3_MASK | | ||
851 | OMAP3430_AUTO_UART3_MASK | | ||
852 | OMAP3430_AUTO_GPT9_MASK | | ||
853 | OMAP3430_AUTO_GPT8_MASK | | ||
854 | OMAP3430_AUTO_GPT7_MASK | | ||
855 | OMAP3430_AUTO_GPT6_MASK | | ||
856 | OMAP3430_AUTO_GPT5_MASK | | ||
857 | OMAP3430_AUTO_GPT4_MASK | | ||
858 | OMAP3430_AUTO_GPT3_MASK | | ||
859 | OMAP3430_AUTO_GPT2_MASK | | ||
860 | OMAP3430_AUTO_MCBSP4_MASK | | ||
861 | OMAP3430_AUTO_MCBSP3_MASK | | ||
862 | OMAP3430_AUTO_MCBSP2_MASK, | ||
863 | OMAP3430_PER_MOD, | ||
864 | CM_AUTOIDLE); | ||
865 | |||
866 | if (omap_rev() > OMAP3430_REV_ES1_0) { | ||
867 | cm_write_mod_reg( | ||
868 | OMAP3430ES2_AUTO_USBHOST_MASK, | ||
869 | OMAP3430ES2_USBHOST_MOD, | ||
870 | CM_AUTOIDLE); | ||
871 | } | ||
872 | 697 | ||
698 | /* XXX This should be handled by hwmod code or SCM init code */ | ||
873 | omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG); | 699 | omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG); |
874 | 700 | ||
875 | /* | 701 | /* |
876 | * Set all plls to autoidle. This is needed until autoidle is | ||
877 | * enabled by clockfw | ||
878 | */ | ||
879 | cm_write_mod_reg(1 << OMAP3430_AUTO_IVA2_DPLL_SHIFT, | ||
880 | OMAP3430_IVA2_MOD, CM_AUTOIDLE2); | ||
881 | cm_write_mod_reg(1 << OMAP3430_AUTO_MPU_DPLL_SHIFT, | ||
882 | MPU_MOD, | ||
883 | CM_AUTOIDLE2); | ||
884 | cm_write_mod_reg((1 << OMAP3430_AUTO_PERIPH_DPLL_SHIFT) | | ||
885 | (1 << OMAP3430_AUTO_CORE_DPLL_SHIFT), | ||
886 | PLL_MOD, | ||
887 | CM_AUTOIDLE); | ||
888 | cm_write_mod_reg(1 << OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT, | ||
889 | PLL_MOD, | ||
890 | CM_AUTOIDLE2); | ||
891 | |||
892 | /* | ||
893 | * Enable control of expternal oscillator through | 702 | * Enable control of expternal oscillator through |
894 | * sys_clkreq. In the long run clock framework should | 703 | * sys_clkreq. In the long run clock framework should |
895 | * take care of this. | 704 | * take care of this. |
896 | */ | 705 | */ |
897 | prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK, | 706 | omap2_prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK, |
898 | 1 << OMAP_AUTOEXTCLKMODE_SHIFT, | 707 | 1 << OMAP_AUTOEXTCLKMODE_SHIFT, |
899 | OMAP3430_GR_MOD, | 708 | OMAP3430_GR_MOD, |
900 | OMAP3_PRM_CLKSRC_CTRL_OFFSET); | 709 | OMAP3_PRM_CLKSRC_CTRL_OFFSET); |
901 | 710 | ||
902 | /* setup wakup source */ | 711 | /* setup wakup source */ |
903 | prm_write_mod_reg(OMAP3430_EN_IO_MASK | OMAP3430_EN_GPIO1_MASK | | 712 | omap2_prm_write_mod_reg(OMAP3430_EN_IO_MASK | OMAP3430_EN_GPIO1_MASK | |
904 | OMAP3430_EN_GPT1_MASK | OMAP3430_EN_GPT12_MASK, | 713 | OMAP3430_EN_GPT1_MASK | OMAP3430_EN_GPT12_MASK, |
905 | WKUP_MOD, PM_WKEN); | 714 | WKUP_MOD, PM_WKEN); |
906 | /* No need to write EN_IO, that is always enabled */ | 715 | /* No need to write EN_IO, that is always enabled */ |
907 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO1_MASK | | 716 | omap2_prm_write_mod_reg(OMAP3430_GRPSEL_GPIO1_MASK | |
908 | OMAP3430_GRPSEL_GPT1_MASK | | 717 | OMAP3430_GRPSEL_GPT1_MASK | |
909 | OMAP3430_GRPSEL_GPT12_MASK, | 718 | OMAP3430_GRPSEL_GPT12_MASK, |
910 | WKUP_MOD, OMAP3430_PM_MPUGRPSEL); | 719 | WKUP_MOD, OMAP3430_PM_MPUGRPSEL); |
911 | /* For some reason IO doesn't generate wakeup event even if | 720 | /* For some reason IO doesn't generate wakeup event even if |
912 | * it is selected to mpu wakeup goup */ | 721 | * it is selected to mpu wakeup goup */ |
913 | prm_write_mod_reg(OMAP3430_IO_EN_MASK | OMAP3430_WKUP_EN_MASK, | 722 | omap2_prm_write_mod_reg(OMAP3430_IO_EN_MASK | OMAP3430_WKUP_EN_MASK, |
914 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); | 723 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
915 | 724 | ||
916 | /* Enable PM_WKEN to support DSS LPR */ | 725 | /* Enable PM_WKEN to support DSS LPR */ |
917 | prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS_MASK, | 726 | omap2_prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS_MASK, |
918 | OMAP3430_DSS_MOD, PM_WKEN); | 727 | OMAP3430_DSS_MOD, PM_WKEN); |
919 | 728 | ||
920 | /* Enable wakeups in PER */ | 729 | /* Enable wakeups in PER */ |
921 | prm_write_mod_reg(OMAP3430_EN_GPIO2_MASK | OMAP3430_EN_GPIO3_MASK | | 730 | omap2_prm_write_mod_reg(omap3630_en_uart4_mask | |
731 | OMAP3430_EN_GPIO2_MASK | OMAP3430_EN_GPIO3_MASK | | ||
922 | OMAP3430_EN_GPIO4_MASK | OMAP3430_EN_GPIO5_MASK | | 732 | OMAP3430_EN_GPIO4_MASK | OMAP3430_EN_GPIO5_MASK | |
923 | OMAP3430_EN_GPIO6_MASK | OMAP3430_EN_UART3_MASK | | 733 | OMAP3430_EN_GPIO6_MASK | OMAP3430_EN_UART3_MASK | |
924 | OMAP3430_EN_MCBSP2_MASK | OMAP3430_EN_MCBSP3_MASK | | 734 | OMAP3430_EN_MCBSP2_MASK | OMAP3430_EN_MCBSP3_MASK | |
925 | OMAP3430_EN_MCBSP4_MASK, | 735 | OMAP3430_EN_MCBSP4_MASK, |
926 | OMAP3430_PER_MOD, PM_WKEN); | 736 | OMAP3430_PER_MOD, PM_WKEN); |
927 | /* and allow them to wake up MPU */ | 737 | /* and allow them to wake up MPU */ |
928 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2_MASK | | 738 | omap2_prm_write_mod_reg(omap3630_grpsel_uart4_mask | |
739 | OMAP3430_GRPSEL_GPIO2_MASK | | ||
929 | OMAP3430_GRPSEL_GPIO3_MASK | | 740 | OMAP3430_GRPSEL_GPIO3_MASK | |
930 | OMAP3430_GRPSEL_GPIO4_MASK | | 741 | OMAP3430_GRPSEL_GPIO4_MASK | |
931 | OMAP3430_GRPSEL_GPIO5_MASK | | 742 | OMAP3430_GRPSEL_GPIO5_MASK | |
@@ -937,22 +748,22 @@ static void __init prcm_setup_regs(void) | |||
937 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); | 748 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); |
938 | 749 | ||
939 | /* Don't attach IVA interrupts */ | 750 | /* Don't attach IVA interrupts */ |
940 | prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); | 751 | omap2_prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); |
941 | prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); | 752 | omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); |
942 | prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); | 753 | omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); |
943 | prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); | 754 | omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); |
944 | 755 | ||
945 | /* Clear any pending 'reset' flags */ | 756 | /* Clear any pending 'reset' flags */ |
946 | prm_write_mod_reg(0xffffffff, MPU_MOD, OMAP2_RM_RSTST); | 757 | omap2_prm_write_mod_reg(0xffffffff, MPU_MOD, OMAP2_RM_RSTST); |
947 | prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP2_RM_RSTST); | 758 | omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP2_RM_RSTST); |
948 | prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, OMAP2_RM_RSTST); | 759 | omap2_prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, OMAP2_RM_RSTST); |
949 | prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, OMAP2_RM_RSTST); | 760 | omap2_prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, OMAP2_RM_RSTST); |
950 | prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, OMAP2_RM_RSTST); | 761 | omap2_prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, OMAP2_RM_RSTST); |
951 | prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, OMAP2_RM_RSTST); | 762 | omap2_prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, OMAP2_RM_RSTST); |
952 | prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, OMAP2_RM_RSTST); | 763 | omap2_prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, OMAP2_RM_RSTST); |
953 | 764 | ||
954 | /* Clear any pending PRCM interrupts */ | 765 | /* Clear any pending PRCM interrupts */ |
955 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 766 | omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
956 | 767 | ||
957 | omap3_iva_idle(); | 768 | omap3_iva_idle(); |
958 | omap3_d2d_idle(); | 769 | omap3_d2d_idle(); |
@@ -968,13 +779,17 @@ void omap3_pm_off_mode_enable(int enable) | |||
968 | else | 779 | else |
969 | state = PWRDM_POWER_RET; | 780 | state = PWRDM_POWER_RET; |
970 | 781 | ||
971 | #ifdef CONFIG_CPU_IDLE | ||
972 | omap3_cpuidle_update_states(); | ||
973 | #endif | ||
974 | |||
975 | list_for_each_entry(pwrst, &pwrst_list, node) { | 782 | list_for_each_entry(pwrst, &pwrst_list, node) { |
976 | pwrst->next_state = state; | 783 | if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583) && |
977 | set_pwrdm_state(pwrst->pwrdm, state); | 784 | pwrst->pwrdm == core_pwrdm && |
785 | state == PWRDM_POWER_OFF) { | ||
786 | pwrst->next_state = PWRDM_POWER_RET; | ||
787 | pr_warn("%s: Core OFF disabled due to errata i583\n", | ||
788 | __func__); | ||
789 | } else { | ||
790 | pwrst->next_state = state; | ||
791 | } | ||
792 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state); | ||
978 | } | 793 | } |
979 | } | 794 | } |
980 | 795 | ||
@@ -1019,7 +834,7 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) | |||
1019 | if (pwrdm_has_hdwr_sar(pwrdm)) | 834 | if (pwrdm_has_hdwr_sar(pwrdm)) |
1020 | pwrdm_enable_hdwr_sar(pwrdm); | 835 | pwrdm_enable_hdwr_sar(pwrdm); |
1021 | 836 | ||
1022 | return set_pwrdm_state(pwrst->pwrdm, pwrst->next_state); | 837 | return omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state); |
1023 | } | 838 | } |
1024 | 839 | ||
1025 | /* | 840 | /* |
@@ -1029,14 +844,11 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) | |||
1029 | */ | 844 | */ |
1030 | static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) | 845 | static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) |
1031 | { | 846 | { |
1032 | clkdm_clear_all_wkdeps(clkdm); | ||
1033 | clkdm_clear_all_sleepdeps(clkdm); | ||
1034 | |||
1035 | if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) | 847 | if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) |
1036 | omap2_clkdm_allow_idle(clkdm); | 848 | clkdm_allow_idle(clkdm); |
1037 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && | 849 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && |
1038 | atomic_read(&clkdm->usecount) == 0) | 850 | atomic_read(&clkdm->usecount) == 0) |
1039 | omap2_clkdm_sleep(clkdm); | 851 | clkdm_sleep(clkdm); |
1040 | return 0; | 852 | return 0; |
1041 | } | 853 | } |
1042 | 854 | ||
@@ -1049,6 +861,17 @@ void omap_push_sram_idle(void) | |||
1049 | save_secure_ram_context_sz); | 861 | save_secure_ram_context_sz); |
1050 | } | 862 | } |
1051 | 863 | ||
864 | static void __init pm_errata_configure(void) | ||
865 | { | ||
866 | if (cpu_is_omap3630()) { | ||
867 | pm34xx_errata |= PM_RTA_ERRATUM_i608; | ||
868 | /* Enable the l2 cache toggling in sleep logic */ | ||
869 | enable_omap3630_toggle_l2_on_restore(); | ||
870 | if (omap_rev() < OMAP3630_REV_ES1_2) | ||
871 | pm34xx_errata |= PM_SDRC_WAKEUP_ERRATUM_i583; | ||
872 | } | ||
873 | } | ||
874 | |||
1052 | static int __init omap3_pm_init(void) | 875 | static int __init omap3_pm_init(void) |
1053 | { | 876 | { |
1054 | struct power_state *pwrst, *tmp; | 877 | struct power_state *pwrst, *tmp; |
@@ -1058,7 +881,7 @@ static int __init omap3_pm_init(void) | |||
1058 | if (!cpu_is_omap34xx()) | 881 | if (!cpu_is_omap34xx()) |
1059 | return -ENODEV; | 882 | return -ENODEV; |
1060 | 883 | ||
1061 | printk(KERN_ERR "Power Management for TI OMAP3.\n"); | 884 | pm_errata_configure(); |
1062 | 885 | ||
1063 | /* XXX prcm_setup_regs needs to be before enabling hw | 886 | /* XXX prcm_setup_regs needs to be before enabling hw |
1064 | * supervised mode for powerdomains */ | 887 | * supervised mode for powerdomains */ |
@@ -1105,6 +928,14 @@ static int __init omap3_pm_init(void) | |||
1105 | pm_idle = omap3_pm_idle; | 928 | pm_idle = omap3_pm_idle; |
1106 | omap3_idle_init(); | 929 | omap3_idle_init(); |
1107 | 930 | ||
931 | /* | ||
932 | * RTA is disabled during initialization as per erratum i608 | ||
933 | * it is safer to disable RTA by the bootloader, but we would like | ||
934 | * to be doubly sure here and prevent any mishaps. | ||
935 | */ | ||
936 | if (IS_PM34XX_ERRATUM(PM_RTA_ERRATUM_i608)) | ||
937 | omap3630_ctrl_disable_rta(); | ||
938 | |||
1108 | clkdm_add_wkdep(neon_clkdm, mpu_clkdm); | 939 | clkdm_add_wkdep(neon_clkdm, mpu_clkdm); |
1109 | if (omap_type() != OMAP2_DEVICE_TYPE_GP) { | 940 | if (omap_type() != OMAP2_DEVICE_TYPE_GP) { |
1110 | omap3_secure_ram_storage = | 941 | omap3_secure_ram_storage = |
@@ -1117,7 +948,7 @@ static int __init omap3_pm_init(void) | |||
1117 | local_fiq_disable(); | 948 | local_fiq_disable(); |
1118 | 949 | ||
1119 | omap_dma_global_context_save(); | 950 | omap_dma_global_context_save(); |
1120 | omap3_save_secure_ram_context(PWRDM_POWER_ON); | 951 | omap3_save_secure_ram_context(); |
1121 | omap_dma_global_context_restore(); | 952 | omap_dma_global_context_restore(); |
1122 | 953 | ||
1123 | local_irq_enable(); | 954 | local_irq_enable(); |