diff options
-rw-r--r-- | arch/arm/mach-shmobile/pm-sh7372.c | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/arch/arm/mach-shmobile/pm-sh7372.c b/arch/arm/mach-shmobile/pm-sh7372.c index 9edd95f4beda..a38be7f06d6a 100644 --- a/arch/arm/mach-shmobile/pm-sh7372.c +++ b/arch/arm/mach-shmobile/pm-sh7372.c | |||
@@ -300,9 +300,6 @@ static void sh7372_set_reset_vector(unsigned long address) | |||
300 | __raw_writel(0, APARMBAREA); | 300 | __raw_writel(0, APARMBAREA); |
301 | } | 301 | } |
302 | 302 | ||
303 | #endif | ||
304 | |||
305 | #ifdef CONFIG_SUSPEND | ||
306 | static void sh7372_enter_sysc(int pllc0_on, unsigned long sleep_mode) | 303 | static void sh7372_enter_sysc(int pllc0_on, unsigned long sleep_mode) |
307 | { | 304 | { |
308 | if (pllc0_on) | 305 | if (pllc0_on) |
@@ -448,17 +445,6 @@ static void sh7372_enter_a3sm_common(int pllc0_on) | |||
448 | sh7372_enter_sysc(pllc0_on, 1 << 12); | 445 | sh7372_enter_sysc(pllc0_on, 1 << 12); |
449 | } | 446 | } |
450 | 447 | ||
451 | static void sh7372_enter_a4s_common(int pllc0_on) | ||
452 | { | ||
453 | sh7372_intca_suspend(); | ||
454 | memcpy((void *)SMFRAM, sh7372_resume_core_standby_sysc, 0x100); | ||
455 | sh7372_set_reset_vector(SMFRAM); | ||
456 | sh7372_enter_sysc(pllc0_on, 1 << 10); | ||
457 | sh7372_intca_resume(); | ||
458 | } | ||
459 | |||
460 | #endif | ||
461 | |||
462 | #ifdef CONFIG_CPU_IDLE | 448 | #ifdef CONFIG_CPU_IDLE |
463 | static int sh7372_do_idle_core_standby(unsigned long unused) | 449 | static int sh7372_do_idle_core_standby(unsigned long unused) |
464 | { | 450 | { |
@@ -479,6 +465,16 @@ static void sh7372_enter_core_standby(void) | |||
479 | __raw_writel(0, SBAR); | 465 | __raw_writel(0, SBAR); |
480 | } | 466 | } |
481 | 467 | ||
468 | static void sh7372_enter_a3sm_pll_on(void) | ||
469 | { | ||
470 | sh7372_enter_a3sm_common(1); | ||
471 | } | ||
472 | |||
473 | static void sh7372_enter_a3sm_pll_off(void) | ||
474 | { | ||
475 | sh7372_enter_a3sm_common(0); | ||
476 | } | ||
477 | |||
482 | static void sh7372_cpuidle_setup(struct cpuidle_driver *drv) | 478 | static void sh7372_cpuidle_setup(struct cpuidle_driver *drv) |
483 | { | 479 | { |
484 | struct cpuidle_state *state = &drv->states[drv->state_count]; | 480 | struct cpuidle_state *state = &drv->states[drv->state_count]; |
@@ -489,7 +485,24 @@ static void sh7372_cpuidle_setup(struct cpuidle_driver *drv) | |||
489 | state->target_residency = 20 + 10; | 485 | state->target_residency = 20 + 10; |
490 | state->flags = CPUIDLE_FLAG_TIME_VALID; | 486 | state->flags = CPUIDLE_FLAG_TIME_VALID; |
491 | shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_core_standby; | 487 | shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_core_standby; |
488 | drv->state_count++; | ||
492 | 489 | ||
490 | state = &drv->states[drv->state_count]; | ||
491 | snprintf(state->name, CPUIDLE_NAME_LEN, "C3"); | ||
492 | strncpy(state->desc, "A3SM PLL ON", CPUIDLE_DESC_LEN); | ||
493 | state->exit_latency = 20; | ||
494 | state->target_residency = 30 + 20; | ||
495 | state->flags = CPUIDLE_FLAG_TIME_VALID; | ||
496 | shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_a3sm_pll_on; | ||
497 | drv->state_count++; | ||
498 | |||
499 | state = &drv->states[drv->state_count]; | ||
500 | snprintf(state->name, CPUIDLE_NAME_LEN, "C4"); | ||
501 | strncpy(state->desc, "A3SM PLL OFF", CPUIDLE_DESC_LEN); | ||
502 | state->exit_latency = 120; | ||
503 | state->target_residency = 30 + 120; | ||
504 | state->flags = CPUIDLE_FLAG_TIME_VALID; | ||
505 | shmobile_cpuidle_modes[drv->state_count] = sh7372_enter_a3sm_pll_off; | ||
493 | drv->state_count++; | 506 | drv->state_count++; |
494 | } | 507 | } |
495 | 508 | ||
@@ -502,6 +515,14 @@ static void sh7372_cpuidle_init(void) {} | |||
502 | #endif | 515 | #endif |
503 | 516 | ||
504 | #ifdef CONFIG_SUSPEND | 517 | #ifdef CONFIG_SUSPEND |
518 | static void sh7372_enter_a4s_common(int pllc0_on) | ||
519 | { | ||
520 | sh7372_intca_suspend(); | ||
521 | memcpy((void *)SMFRAM, sh7372_resume_core_standby_sysc, 0x100); | ||
522 | sh7372_set_reset_vector(SMFRAM); | ||
523 | sh7372_enter_sysc(pllc0_on, 1 << 10); | ||
524 | sh7372_intca_resume(); | ||
525 | } | ||
505 | 526 | ||
506 | static int sh7372_enter_suspend(suspend_state_t suspend_state) | 527 | static int sh7372_enter_suspend(suspend_state_t suspend_state) |
507 | { | 528 | { |
@@ -562,6 +583,7 @@ static void sh7372_suspend_init(void) | |||
562 | #else | 583 | #else |
563 | static void sh7372_suspend_init(void) {} | 584 | static void sh7372_suspend_init(void) {} |
564 | #endif | 585 | #endif |
586 | #endif /* CONFIG_SUSPEND || CONFIG_CPU_IDLE */ | ||
565 | 587 | ||
566 | void __init sh7372_pm_init(void) | 588 | void __init sh7372_pm_init(void) |
567 | { | 589 | { |