diff options
author | Kevin Hilman <khilman@deeprootsystems.com> | 2010-09-08 19:37:42 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-09-23 20:13:50 -0400 |
commit | e7410cf7831c2e5106a90dac6179df5d2c9bd60e (patch) | |
tree | d53065cc2c53d2cc512b5bbb0a8f4ba23c652eac /arch/arm/mach-omap2/pm34xx.c | |
parent | 6cdee91257bee23a46dc869ca62469b67cba2c7e (diff) |
OMAP3: PM: move device-specific special cases from PM core into CPUidle
In an effort to simplify the core idle path, move any device-specific
special case handling from the core PM idle path into the CPUidle
pre-idle checking path.
This keeps the core, interrupts-disabled idle path streamlined and
independent of any device-specific handling, and also allows CPUidle
to do the checking only for certain C-states as needed. This patch
has the device checks in place for all states with the CHECK_BM flag,
namely all states >= C2.
This patch was inspired by a similar patch written by Tero Kristo as
part of a larger series to add INACTIVE state support.
NOTE: This is a baby-step towards decoupling device idle (or system
idle) from CPU idle. Eventually, CPUidle should only manage the CPU,
and device/system idle should be managed elsewhere.
Cc: Tero Kristo <tero.kristo@nokia.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch/arm/mach-omap2/pm34xx.c')
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 14 |
1 files changed, 1 insertions, 13 deletions
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 429268eaf8b3..bb2ba1e03d09 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -346,7 +346,6 @@ void omap_sram_idle(void) | |||
346 | int core_next_state = PWRDM_POWER_ON; | 346 | int core_next_state = PWRDM_POWER_ON; |
347 | int core_prev_state, per_prev_state; | 347 | int core_prev_state, per_prev_state; |
348 | u32 sdrc_pwr = 0; | 348 | u32 sdrc_pwr = 0; |
349 | int per_state_modified = 0; | ||
350 | 349 | ||
351 | if (!_omap_sram_idle) | 350 | if (!_omap_sram_idle) |
352 | return; | 351 | return; |
@@ -391,19 +390,10 @@ void omap_sram_idle(void) | |||
391 | if (per_next_state < PWRDM_POWER_ON) { | 390 | if (per_next_state < PWRDM_POWER_ON) { |
392 | omap_uart_prepare_idle(2); | 391 | omap_uart_prepare_idle(2); |
393 | omap2_gpio_prepare_for_idle(per_next_state); | 392 | omap2_gpio_prepare_for_idle(per_next_state); |
394 | if (per_next_state == PWRDM_POWER_OFF) { | 393 | if (per_next_state == PWRDM_POWER_OFF) |
395 | if (core_next_state == PWRDM_POWER_ON) { | ||
396 | per_next_state = PWRDM_POWER_RET; | ||
397 | pwrdm_set_next_pwrst(per_pwrdm, per_next_state); | ||
398 | per_state_modified = 1; | ||
399 | } else | ||
400 | omap3_per_save_context(); | 394 | omap3_per_save_context(); |
401 | } | ||
402 | } | 395 | } |
403 | 396 | ||
404 | if (pwrdm_read_pwrst(cam_pwrdm) == PWRDM_POWER_ON) | ||
405 | omap2_clkdm_deny_idle(mpu_pwrdm->pwrdm_clkdms[0]); | ||
406 | |||
407 | /* CORE */ | 397 | /* CORE */ |
408 | if (core_next_state < PWRDM_POWER_ON) { | 398 | if (core_next_state < PWRDM_POWER_ON) { |
409 | omap_uart_prepare_idle(0); | 399 | omap_uart_prepare_idle(0); |
@@ -470,8 +460,6 @@ void omap_sram_idle(void) | |||
470 | if (per_prev_state == PWRDM_POWER_OFF) | 460 | if (per_prev_state == PWRDM_POWER_OFF) |
471 | omap3_per_restore_context(); | 461 | omap3_per_restore_context(); |
472 | omap_uart_resume_idle(2); | 462 | omap_uart_resume_idle(2); |
473 | if (per_state_modified) | ||
474 | pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF); | ||
475 | } | 463 | } |
476 | 464 | ||
477 | /* Disable IO-PAD and IO-CHAIN wakeup */ | 465 | /* Disable IO-PAD and IO-CHAIN wakeup */ |