diff options
| -rw-r--r-- | arch/arm/mach-omap2/board-3430sdp.c | 20 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/cpuidle34xx.c | 105 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pm.h | 15 |
3 files changed, 119 insertions, 21 deletions
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 5adef517a2b3..99f295e81db4 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include "mux.h" | 46 | #include "mux.h" |
| 47 | #include "sdram-qimonda-hyb18m512160af-6.h" | 47 | #include "sdram-qimonda-hyb18m512160af-6.h" |
| 48 | #include "hsmmc.h" | 48 | #include "hsmmc.h" |
| 49 | #include "pm.h" | ||
| 49 | 50 | ||
| 50 | #define CONFIG_DISABLE_HFCLK 1 | 51 | #define CONFIG_DISABLE_HFCLK 1 |
| 51 | 52 | ||
| @@ -57,6 +58,24 @@ | |||
| 57 | 58 | ||
| 58 | #define TWL4030_MSECURE_GPIO 22 | 59 | #define TWL4030_MSECURE_GPIO 22 |
| 59 | 60 | ||
| 61 | /* FIXME: These values need to be updated based on more profiling on 3430sdp*/ | ||
| 62 | static struct cpuidle_params omap3_cpuidle_params_table[] = { | ||
| 63 | /* C1 */ | ||
| 64 | {2, 2, 5}, | ||
| 65 | /* C2 */ | ||
| 66 | {10, 10, 30}, | ||
| 67 | /* C3 */ | ||
| 68 | {50, 50, 300}, | ||
| 69 | /* C4 */ | ||
| 70 | {1500, 1800, 4000}, | ||
| 71 | /* C5 */ | ||
| 72 | {2500, 7500, 12000}, | ||
| 73 | /* C6 */ | ||
| 74 | {3000, 8500, 15000}, | ||
| 75 | /* C7 */ | ||
| 76 | {10000, 30000, 300000}, | ||
| 77 | }; | ||
| 78 | |||
| 60 | static int board_keymap[] = { | 79 | static int board_keymap[] = { |
| 61 | KEY(0, 0, KEY_LEFT), | 80 | KEY(0, 0, KEY_LEFT), |
| 62 | KEY(0, 1, KEY_RIGHT), | 81 | KEY(0, 1, KEY_RIGHT), |
| @@ -307,6 +326,7 @@ static void __init omap_3430sdp_init_irq(void) | |||
| 307 | { | 326 | { |
| 308 | omap_board_config = sdp3430_config; | 327 | omap_board_config = sdp3430_config; |
| 309 | omap_board_config_size = ARRAY_SIZE(sdp3430_config); | 328 | omap_board_config_size = ARRAY_SIZE(sdp3430_config); |
| 329 | omap3_pm_init_cpuidle(omap3_cpuidle_params_table); | ||
| 310 | omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL); | 330 | omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL); |
| 311 | omap_init_irq(); | 331 | omap_init_irq(); |
| 312 | omap_gpio_init(); | 332 | omap_gpio_init(); |
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index ff1ad3d06ce1..597148eed0bd 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
| @@ -62,6 +62,30 @@ struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES]; | |||
| 62 | struct omap3_processor_cx current_cx_state; | 62 | struct omap3_processor_cx current_cx_state; |
| 63 | struct powerdomain *mpu_pd, *core_pd; | 63 | struct powerdomain *mpu_pd, *core_pd; |
| 64 | 64 | ||
| 65 | /* | ||
| 66 | * The latencies/thresholds for various C states have | ||
| 67 | * to be configured from the respective board files. | ||
| 68 | * These are some default values (which might not provide | ||
| 69 | * the best power savings) used on boards which do not | ||
| 70 | * pass these details from the board file. | ||
| 71 | */ | ||
| 72 | static struct cpuidle_params cpuidle_params_table[] = { | ||
| 73 | /* C1 */ | ||
| 74 | {2, 2, 5}, | ||
| 75 | /* C2 */ | ||
| 76 | {10, 10, 30}, | ||
| 77 | /* C3 */ | ||
| 78 | {50, 50, 300}, | ||
| 79 | /* C4 */ | ||
| 80 | {1500, 1800, 4000}, | ||
| 81 | /* C5 */ | ||
| 82 | {2500, 7500, 12000}, | ||
| 83 | /* C6 */ | ||
| 84 | {3000, 8500, 15000}, | ||
| 85 | /* C7 */ | ||
| 86 | {10000, 30000, 300000}, | ||
| 87 | }; | ||
| 88 | |||
| 65 | static int omap3_idle_bm_check(void) | 89 | static int omap3_idle_bm_check(void) |
| 66 | { | 90 | { |
| 67 | if (!omap3_can_sleep()) | 91 | if (!omap3_can_sleep()) |
| @@ -245,6 +269,24 @@ void omap3_cpuidle_update_states(void) | |||
| 245 | } | 269 | } |
| 246 | } | 270 | } |
| 247 | 271 | ||
| 272 | void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) | ||
| 273 | { | ||
| 274 | int i; | ||
| 275 | |||
| 276 | if (!cpuidle_board_params) | ||
| 277 | return; | ||
| 278 | |||
| 279 | for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) { | ||
| 280 | cpuidle_params_table[i].sleep_latency = | ||
| 281 | cpuidle_board_params[i].sleep_latency; | ||
| 282 | cpuidle_params_table[i].wake_latency = | ||
| 283 | cpuidle_board_params[i].wake_latency; | ||
| 284 | cpuidle_params_table[i].threshold = | ||
| 285 | cpuidle_board_params[i].threshold; | ||
| 286 | } | ||
| 287 | return; | ||
| 288 | } | ||
| 289 | |||
| 248 | /* omap3_init_power_states - Initialises the OMAP3 specific C states. | 290 | /* omap3_init_power_states - Initialises the OMAP3 specific C states. |
| 249 | * | 291 | * |
| 250 | * Below is the desciption of each C state. | 292 | * Below is the desciption of each C state. |
| @@ -261,9 +303,12 @@ void omap_init_power_states(void) | |||
| 261 | /* C1 . MPU WFI + Core active */ | 303 | /* C1 . MPU WFI + Core active */ |
| 262 | omap3_power_states[OMAP3_STATE_C1].valid = 1; | 304 | omap3_power_states[OMAP3_STATE_C1].valid = 1; |
| 263 | omap3_power_states[OMAP3_STATE_C1].type = OMAP3_STATE_C1; | 305 | omap3_power_states[OMAP3_STATE_C1].type = OMAP3_STATE_C1; |
| 264 | omap3_power_states[OMAP3_STATE_C1].sleep_latency = 2; | 306 | omap3_power_states[OMAP3_STATE_C1].sleep_latency = |
| 265 | omap3_power_states[OMAP3_STATE_C1].wakeup_latency = 2; | 307 | cpuidle_params_table[OMAP3_STATE_C1].sleep_latency; |
| 266 | omap3_power_states[OMAP3_STATE_C1].threshold = 5; | 308 | omap3_power_states[OMAP3_STATE_C1].wakeup_latency = |
| 309 | cpuidle_params_table[OMAP3_STATE_C1].wake_latency; | ||
| 310 | omap3_power_states[OMAP3_STATE_C1].threshold = | ||
| 311 | cpuidle_params_table[OMAP3_STATE_C1].threshold; | ||
| 267 | omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON; | 312 | omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON; |
| 268 | omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON; | 313 | omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON; |
| 269 | omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID; | 314 | omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID; |
| @@ -271,9 +316,12 @@ void omap_init_power_states(void) | |||
| 271 | /* C2 . MPU WFI + Core inactive */ | 316 | /* C2 . MPU WFI + Core inactive */ |
| 272 | omap3_power_states[OMAP3_STATE_C2].valid = 1; | 317 | omap3_power_states[OMAP3_STATE_C2].valid = 1; |
| 273 | omap3_power_states[OMAP3_STATE_C2].type = OMAP3_STATE_C2; | 318 | omap3_power_states[OMAP3_STATE_C2].type = OMAP3_STATE_C2; |
| 274 | omap3_power_states[OMAP3_STATE_C2].sleep_latency = 10; | 319 | omap3_power_states[OMAP3_STATE_C2].sleep_latency = |
| 275 | omap3_power_states[OMAP3_STATE_C2].wakeup_latency = 10; | 320 | cpuidle_params_table[OMAP3_STATE_C2].sleep_latency; |
| 276 | omap3_power_states[OMAP3_STATE_C2].threshold = 30; | 321 | omap3_power_states[OMAP3_STATE_C2].wakeup_latency = |
| 322 | cpuidle_params_table[OMAP3_STATE_C2].wake_latency; | ||
| 323 | omap3_power_states[OMAP3_STATE_C2].threshold = | ||
| 324 | cpuidle_params_table[OMAP3_STATE_C2].threshold; | ||
| 277 | omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON; | 325 | omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON; |
| 278 | omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON; | 326 | omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON; |
| 279 | omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID; | 327 | omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID; |
| @@ -281,9 +329,12 @@ void omap_init_power_states(void) | |||
| 281 | /* C3 . MPU CSWR + Core inactive */ | 329 | /* C3 . MPU CSWR + Core inactive */ |
| 282 | omap3_power_states[OMAP3_STATE_C3].valid = 1; | 330 | omap3_power_states[OMAP3_STATE_C3].valid = 1; |
| 283 | omap3_power_states[OMAP3_STATE_C3].type = OMAP3_STATE_C3; | 331 | omap3_power_states[OMAP3_STATE_C3].type = OMAP3_STATE_C3; |
| 284 | omap3_power_states[OMAP3_STATE_C3].sleep_latency = 50; | 332 | omap3_power_states[OMAP3_STATE_C3].sleep_latency = |
| 285 | omap3_power_states[OMAP3_STATE_C3].wakeup_latency = 50; | 333 | cpuidle_params_table[OMAP3_STATE_C3].sleep_latency; |
| 286 | omap3_power_states[OMAP3_STATE_C3].threshold = 300; | 334 | omap3_power_states[OMAP3_STATE_C3].wakeup_latency = |
| 335 | cpuidle_params_table[OMAP3_STATE_C3].wake_latency; | ||
| 336 | omap3_power_states[OMAP3_STATE_C3].threshold = | ||
| 337 | cpuidle_params_table[OMAP3_STATE_C3].threshold; | ||
| 287 | omap3_power_states[OMAP3_STATE_C3].mpu_state = PWRDM_POWER_RET; | 338 | omap3_power_states[OMAP3_STATE_C3].mpu_state = PWRDM_POWER_RET; |
| 288 | omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON; | 339 | omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON; |
| 289 | omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID | | 340 | omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID | |
| @@ -292,9 +343,12 @@ void omap_init_power_states(void) | |||
| 292 | /* C4 . MPU OFF + Core inactive */ | 343 | /* C4 . MPU OFF + Core inactive */ |
| 293 | omap3_power_states[OMAP3_STATE_C4].valid = 1; | 344 | omap3_power_states[OMAP3_STATE_C4].valid = 1; |
| 294 | omap3_power_states[OMAP3_STATE_C4].type = OMAP3_STATE_C4; | 345 | omap3_power_states[OMAP3_STATE_C4].type = OMAP3_STATE_C4; |
| 295 | omap3_power_states[OMAP3_STATE_C4].sleep_latency = 1500; | 346 | omap3_power_states[OMAP3_STATE_C4].sleep_latency = |
| 296 | omap3_power_states[OMAP3_STATE_C4].wakeup_latency = 1800; | 347 | cpuidle_params_table[OMAP3_STATE_C4].sleep_latency; |
| 297 | omap3_power_states[OMAP3_STATE_C4].threshold = 4000; | 348 | omap3_power_states[OMAP3_STATE_C4].wakeup_latency = |
| 349 | cpuidle_params_table[OMAP3_STATE_C4].wake_latency; | ||
| 350 | omap3_power_states[OMAP3_STATE_C4].threshold = | ||
| 351 | cpuidle_params_table[OMAP3_STATE_C4].threshold; | ||
| 298 | omap3_power_states[OMAP3_STATE_C4].mpu_state = PWRDM_POWER_OFF; | 352 | omap3_power_states[OMAP3_STATE_C4].mpu_state = PWRDM_POWER_OFF; |
| 299 | omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON; | 353 | omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON; |
| 300 | omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID | | 354 | omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID | |
| @@ -303,9 +357,12 @@ void omap_init_power_states(void) | |||
| 303 | /* C5 . MPU CSWR + Core CSWR*/ | 357 | /* C5 . MPU CSWR + Core CSWR*/ |
| 304 | omap3_power_states[OMAP3_STATE_C5].valid = 1; | 358 | omap3_power_states[OMAP3_STATE_C5].valid = 1; |
| 305 | omap3_power_states[OMAP3_STATE_C5].type = OMAP3_STATE_C5; | 359 | omap3_power_states[OMAP3_STATE_C5].type = OMAP3_STATE_C5; |
| 306 | omap3_power_states[OMAP3_STATE_C5].sleep_latency = 2500; | 360 | omap3_power_states[OMAP3_STATE_C5].sleep_latency = |
| 307 | omap3_power_states[OMAP3_STATE_C5].wakeup_latency = 7500; | 361 | cpuidle_params_table[OMAP3_STATE_C5].sleep_latency; |
| 308 | omap3_power_states[OMAP3_STATE_C5].threshold = 12000; | 362 | omap3_power_states[OMAP3_STATE_C5].wakeup_latency = |
| 363 | cpuidle_params_table[OMAP3_STATE_C5].wake_latency; | ||
| 364 | omap3_power_states[OMAP3_STATE_C5].threshold = | ||
| 365 | cpuidle_params_table[OMAP3_STATE_C5].threshold; | ||
| 309 | omap3_power_states[OMAP3_STATE_C5].mpu_state = PWRDM_POWER_RET; | 366 | omap3_power_states[OMAP3_STATE_C5].mpu_state = PWRDM_POWER_RET; |
| 310 | omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET; | 367 | omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET; |
| 311 | omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID | | 368 | omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID | |
| @@ -314,9 +371,12 @@ void omap_init_power_states(void) | |||
| 314 | /* C6 . MPU OFF + Core CSWR */ | 371 | /* C6 . MPU OFF + Core CSWR */ |
| 315 | omap3_power_states[OMAP3_STATE_C6].valid = 1; | 372 | omap3_power_states[OMAP3_STATE_C6].valid = 1; |
| 316 | omap3_power_states[OMAP3_STATE_C6].type = OMAP3_STATE_C6; | 373 | omap3_power_states[OMAP3_STATE_C6].type = OMAP3_STATE_C6; |
| 317 | omap3_power_states[OMAP3_STATE_C6].sleep_latency = 3000; | 374 | omap3_power_states[OMAP3_STATE_C6].sleep_latency = |
| 318 | omap3_power_states[OMAP3_STATE_C6].wakeup_latency = 8500; | 375 | cpuidle_params_table[OMAP3_STATE_C6].sleep_latency; |
| 319 | omap3_power_states[OMAP3_STATE_C6].threshold = 15000; | 376 | omap3_power_states[OMAP3_STATE_C6].wakeup_latency = |
| 377 | cpuidle_params_table[OMAP3_STATE_C6].wake_latency; | ||
| 378 | omap3_power_states[OMAP3_STATE_C6].threshold = | ||
| 379 | cpuidle_params_table[OMAP3_STATE_C6].threshold; | ||
| 320 | omap3_power_states[OMAP3_STATE_C6].mpu_state = PWRDM_POWER_OFF; | 380 | omap3_power_states[OMAP3_STATE_C6].mpu_state = PWRDM_POWER_OFF; |
| 321 | omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET; | 381 | omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET; |
| 322 | omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID | | 382 | omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID | |
| @@ -325,9 +385,12 @@ void omap_init_power_states(void) | |||
| 325 | /* C7 . MPU OFF + Core OFF */ | 385 | /* C7 . MPU OFF + Core OFF */ |
| 326 | omap3_power_states[OMAP3_STATE_C7].valid = 1; | 386 | omap3_power_states[OMAP3_STATE_C7].valid = 1; |
| 327 | omap3_power_states[OMAP3_STATE_C7].type = OMAP3_STATE_C7; | 387 | omap3_power_states[OMAP3_STATE_C7].type = OMAP3_STATE_C7; |
| 328 | omap3_power_states[OMAP3_STATE_C7].sleep_latency = 10000; | 388 | omap3_power_states[OMAP3_STATE_C7].sleep_latency = |
| 329 | omap3_power_states[OMAP3_STATE_C7].wakeup_latency = 30000; | 389 | cpuidle_params_table[OMAP3_STATE_C7].sleep_latency; |
| 330 | omap3_power_states[OMAP3_STATE_C7].threshold = 300000; | 390 | omap3_power_states[OMAP3_STATE_C7].wakeup_latency = |
| 391 | cpuidle_params_table[OMAP3_STATE_C7].wake_latency; | ||
| 392 | omap3_power_states[OMAP3_STATE_C7].threshold = | ||
| 393 | cpuidle_params_table[OMAP3_STATE_C7].threshold; | ||
| 331 | omap3_power_states[OMAP3_STATE_C7].mpu_state = PWRDM_POWER_OFF; | 394 | omap3_power_states[OMAP3_STATE_C7].mpu_state = PWRDM_POWER_OFF; |
| 332 | omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF; | 395 | omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF; |
| 333 | omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID | | 396 | omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID | |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 09c0144e90d1..58a2671e6147 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
| @@ -23,6 +23,21 @@ extern int omap3_can_sleep(void); | |||
| 23 | extern int set_pwrdm_state(struct powerdomain *pwrdm, u32 state); | 23 | extern int set_pwrdm_state(struct powerdomain *pwrdm, u32 state); |
| 24 | extern int omap3_idle_init(void); | 24 | extern int omap3_idle_init(void); |
| 25 | 25 | ||
| 26 | struct cpuidle_params { | ||
| 27 | u32 sleep_latency; | ||
| 28 | u32 wake_latency; | ||
| 29 | u32 threshold; | ||
| 30 | }; | ||
| 31 | |||
| 32 | #if defined(CONFIG_PM) && defined(CONFIG_CPU_IDLE) | ||
| 33 | extern void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params); | ||
| 34 | #else | ||
| 35 | static | ||
| 36 | inline void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) | ||
| 37 | { | ||
| 38 | } | ||
| 39 | #endif | ||
| 40 | |||
| 26 | extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm); | 41 | extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm); |
| 27 | extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state); | 42 | extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state); |
| 28 | 43 | ||
