aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/pm34xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/pm34xx.c')
-rw-r--r--arch/arm/mach-omap2/pm34xx.c487
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
55static suspend_state_t suspend_state = PM_SUSPEND_ON;
56static inline bool is_suspending(void)
57{
58 return (suspend_state != PM_SUSPEND_ON);
59}
60#else
61static 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
58u32 enable_off_mode; 72/* pm34xx errata defined in pm.h */
59u32 sleep_while_idle; 73u16 pm34xx_errata;
60u32 wakeup_timer_seconds;
61u32 wakeup_timer_milliseconds;
62 74
63struct power_state { 75struct 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)
116static void omap3_disable_io_chain(void) 128static 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
123static void omap3_core_save_context(void) 135static 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 */
169static void omap3_save_secure_ram_context(u32 target_mpu_state) 172static 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
311static 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 */
317static void restore_table_entry(void) 316static 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
340void omap_sram_idle(void) 339void 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
483console_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
495int omap3_can_sleep(void) 498int 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. */
507int 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
545err:
546 return ret;
547}
548
549static void omap3_pm_idle(void) 507static 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
562out: 526out:
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
568static suspend_state_t suspend_state;
569
570static 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
587static int omap3_pm_prepare(void)
588{
589 disable_hlt();
590 return 0;
591}
592
593static int omap3_pm_suspend(void) 532static 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
655static 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 */
661static int omap3_pm_begin(suspend_state_t state) 595static 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
675static struct platform_suspend_ops omap_pm_ops = { 611static 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 = {
696static void __init omap3_iva_idle(void) 630static 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
757static void __init prcm_setup_regs(void) 691static 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 */
1030static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) 845static 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
864static 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
1052static int __init omap3_pm_init(void) 875static 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();