diff options
author | Paul Walmsley <paul@pwsan.com> | 2012-10-21 03:01:10 -0400 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2012-10-21 03:01:10 -0400 |
commit | 498153995b9ff41279be54fc56facb92f5cad793 (patch) | |
tree | 82736e204351bcd198d5dcec3c41deeab1b6779f /arch/arm/mach-omap2/prm44xx.c | |
parent | 139563ad27e7baad7935b8113940f0d804cf513b (diff) |
ARM: OMAP2+: powerdomain/PRM: move the low-level powerdomain functions into PRM
Move the low-level SoC-specific powerdomain control functions into
prm*.c. For example, OMAP2xxx low-level powerdomain functions go into
prm2xxx.c. Then remove the unnecessary powerdomain*xxx*.c files.
The objective is to centralize low-level PRM register accesses into
the prm*.[ch] files, and then to export an OMAP SoC-independent API to
higher-level OMAP power management code.
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Rajendra Nayak <rnayak@ti.com>
Cc: Vaibhav Hiremath <hvaibhav@ti.com>
Acked-by: Rajendra Nayak <rnayak@ti.com>
Reviewed-by: Russ Dill <Russ.Dill@ti.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2/prm44xx.c')
-rw-r--r-- | arch/arm/mach-omap2/prm44xx.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 06bb67910a31..48d91930796d 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -5,6 +5,7 @@ | |||
5 | * Copyright (C) 2010 Nokia Corporation | 5 | * Copyright (C) 2010 Nokia Corporation |
6 | * Benoît Cousson | 6 | * Benoît Cousson |
7 | * Paul Walmsley | 7 | * Paul Walmsley |
8 | * Rajendra Nayak <rnayak@ti.com> | ||
8 | * | 9 | * |
9 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
@@ -27,6 +28,7 @@ | |||
27 | #include "prm-regbits-44xx.h" | 28 | #include "prm-regbits-44xx.h" |
28 | #include "prcm44xx.h" | 29 | #include "prcm44xx.h" |
29 | #include "prminst44xx.h" | 30 | #include "prminst44xx.h" |
31 | #include "powerdomain.h" | ||
30 | 32 | ||
31 | static const struct omap_prcm_irq omap4_prcm_irqs[] = { | 33 | static const struct omap_prcm_irq omap4_prcm_irqs[] = { |
32 | OMAP_PRCM_IRQ("wkup", 0, 0), | 34 | OMAP_PRCM_IRQ("wkup", 0, 0), |
@@ -291,6 +293,269 @@ static void __init omap44xx_prm_enable_io_wakeup(void) | |||
291 | OMAP4_PRM_IO_PMCTRL_OFFSET); | 293 | OMAP4_PRM_IO_PMCTRL_OFFSET); |
292 | } | 294 | } |
293 | 295 | ||
296 | /* Powerdomain low-level functions */ | ||
297 | |||
298 | static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) | ||
299 | { | ||
300 | omap4_prminst_rmw_inst_reg_bits(OMAP_POWERSTATE_MASK, | ||
301 | (pwrst << OMAP_POWERSTATE_SHIFT), | ||
302 | pwrdm->prcm_partition, | ||
303 | pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL); | ||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) | ||
308 | { | ||
309 | u32 v; | ||
310 | |||
311 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
312 | OMAP4_PM_PWSTCTRL); | ||
313 | v &= OMAP_POWERSTATE_MASK; | ||
314 | v >>= OMAP_POWERSTATE_SHIFT; | ||
315 | |||
316 | return v; | ||
317 | } | ||
318 | |||
319 | static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm) | ||
320 | { | ||
321 | u32 v; | ||
322 | |||
323 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
324 | OMAP4_PM_PWSTST); | ||
325 | v &= OMAP_POWERSTATEST_MASK; | ||
326 | v >>= OMAP_POWERSTATEST_SHIFT; | ||
327 | |||
328 | return v; | ||
329 | } | ||
330 | |||
331 | static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm) | ||
332 | { | ||
333 | u32 v; | ||
334 | |||
335 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
336 | OMAP4_PM_PWSTST); | ||
337 | v &= OMAP4430_LASTPOWERSTATEENTERED_MASK; | ||
338 | v >>= OMAP4430_LASTPOWERSTATEENTERED_SHIFT; | ||
339 | |||
340 | return v; | ||
341 | } | ||
342 | |||
343 | static int omap4_pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm) | ||
344 | { | ||
345 | omap4_prminst_rmw_inst_reg_bits(OMAP4430_LOWPOWERSTATECHANGE_MASK, | ||
346 | (1 << OMAP4430_LOWPOWERSTATECHANGE_SHIFT), | ||
347 | pwrdm->prcm_partition, | ||
348 | pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL); | ||
349 | return 0; | ||
350 | } | ||
351 | |||
352 | static int omap4_pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm) | ||
353 | { | ||
354 | omap4_prminst_rmw_inst_reg_bits(OMAP4430_LASTPOWERSTATEENTERED_MASK, | ||
355 | OMAP4430_LASTPOWERSTATEENTERED_MASK, | ||
356 | pwrdm->prcm_partition, | ||
357 | pwrdm->prcm_offs, OMAP4_PM_PWSTST); | ||
358 | return 0; | ||
359 | } | ||
360 | |||
361 | static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst) | ||
362 | { | ||
363 | u32 v; | ||
364 | |||
365 | v = pwrst << __ffs(OMAP4430_LOGICRETSTATE_MASK); | ||
366 | omap4_prminst_rmw_inst_reg_bits(OMAP4430_LOGICRETSTATE_MASK, v, | ||
367 | pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
368 | OMAP4_PM_PWSTCTRL); | ||
369 | |||
370 | return 0; | ||
371 | } | ||
372 | |||
373 | static int omap4_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, | ||
374 | u8 pwrst) | ||
375 | { | ||
376 | u32 m; | ||
377 | |||
378 | m = omap2_pwrdm_get_mem_bank_onstate_mask(bank); | ||
379 | |||
380 | omap4_prminst_rmw_inst_reg_bits(m, (pwrst << __ffs(m)), | ||
381 | pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
382 | OMAP4_PM_PWSTCTRL); | ||
383 | |||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | static int omap4_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, | ||
388 | u8 pwrst) | ||
389 | { | ||
390 | u32 m; | ||
391 | |||
392 | m = omap2_pwrdm_get_mem_bank_retst_mask(bank); | ||
393 | |||
394 | omap4_prminst_rmw_inst_reg_bits(m, (pwrst << __ffs(m)), | ||
395 | pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
396 | OMAP4_PM_PWSTCTRL); | ||
397 | |||
398 | return 0; | ||
399 | } | ||
400 | |||
401 | static int omap4_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm) | ||
402 | { | ||
403 | u32 v; | ||
404 | |||
405 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
406 | OMAP4_PM_PWSTST); | ||
407 | v &= OMAP4430_LOGICSTATEST_MASK; | ||
408 | v >>= OMAP4430_LOGICSTATEST_SHIFT; | ||
409 | |||
410 | return v; | ||
411 | } | ||
412 | |||
413 | static int omap4_pwrdm_read_logic_retst(struct powerdomain *pwrdm) | ||
414 | { | ||
415 | u32 v; | ||
416 | |||
417 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
418 | OMAP4_PM_PWSTCTRL); | ||
419 | v &= OMAP4430_LOGICRETSTATE_MASK; | ||
420 | v >>= OMAP4430_LOGICRETSTATE_SHIFT; | ||
421 | |||
422 | return v; | ||
423 | } | ||
424 | |||
425 | /** | ||
426 | * omap4_pwrdm_read_prev_logic_pwrst - read the previous logic powerstate | ||
427 | * @pwrdm: struct powerdomain * to read the state for | ||
428 | * | ||
429 | * Reads the previous logic powerstate for a powerdomain. This | ||
430 | * function must determine the previous logic powerstate by first | ||
431 | * checking the previous powerstate for the domain. If that was OFF, | ||
432 | * then logic has been lost. If previous state was RETENTION, the | ||
433 | * function reads the setting for the next retention logic state to | ||
434 | * see the actual value. In every other case, the logic is | ||
435 | * retained. Returns either PWRDM_POWER_OFF or PWRDM_POWER_RET | ||
436 | * depending whether the logic was retained or not. | ||
437 | */ | ||
438 | static int omap4_pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm) | ||
439 | { | ||
440 | int state; | ||
441 | |||
442 | state = omap4_pwrdm_read_prev_pwrst(pwrdm); | ||
443 | |||
444 | if (state == PWRDM_POWER_OFF) | ||
445 | return PWRDM_POWER_OFF; | ||
446 | |||
447 | if (state != PWRDM_POWER_RET) | ||
448 | return PWRDM_POWER_RET; | ||
449 | |||
450 | return omap4_pwrdm_read_logic_retst(pwrdm); | ||
451 | } | ||
452 | |||
453 | static int omap4_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank) | ||
454 | { | ||
455 | u32 m, v; | ||
456 | |||
457 | m = omap2_pwrdm_get_mem_bank_stst_mask(bank); | ||
458 | |||
459 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
460 | OMAP4_PM_PWSTST); | ||
461 | v &= m; | ||
462 | v >>= __ffs(m); | ||
463 | |||
464 | return v; | ||
465 | } | ||
466 | |||
467 | static int omap4_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank) | ||
468 | { | ||
469 | u32 m, v; | ||
470 | |||
471 | m = omap2_pwrdm_get_mem_bank_retst_mask(bank); | ||
472 | |||
473 | v = omap4_prminst_read_inst_reg(pwrdm->prcm_partition, pwrdm->prcm_offs, | ||
474 | OMAP4_PM_PWSTCTRL); | ||
475 | v &= m; | ||
476 | v >>= __ffs(m); | ||
477 | |||
478 | return v; | ||
479 | } | ||
480 | |||
481 | /** | ||
482 | * omap4_pwrdm_read_prev_mem_pwrst - reads the previous memory powerstate | ||
483 | * @pwrdm: struct powerdomain * to read mem powerstate for | ||
484 | * @bank: memory bank index | ||
485 | * | ||
486 | * Reads the previous memory powerstate for a powerdomain. This | ||
487 | * function must determine the previous memory powerstate by first | ||
488 | * checking the previous powerstate for the domain. If that was OFF, | ||
489 | * then logic has been lost. If previous state was RETENTION, the | ||
490 | * function reads the setting for the next memory retention state to | ||
491 | * see the actual value. In every other case, the logic is | ||
492 | * retained. Returns either PWRDM_POWER_OFF or PWRDM_POWER_RET | ||
493 | * depending whether logic was retained or not. | ||
494 | */ | ||
495 | static int omap4_pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank) | ||
496 | { | ||
497 | int state; | ||
498 | |||
499 | state = omap4_pwrdm_read_prev_pwrst(pwrdm); | ||
500 | |||
501 | if (state == PWRDM_POWER_OFF) | ||
502 | return PWRDM_POWER_OFF; | ||
503 | |||
504 | if (state != PWRDM_POWER_RET) | ||
505 | return PWRDM_POWER_RET; | ||
506 | |||
507 | return omap4_pwrdm_read_mem_retst(pwrdm, bank); | ||
508 | } | ||
509 | |||
510 | static int omap4_pwrdm_wait_transition(struct powerdomain *pwrdm) | ||
511 | { | ||
512 | u32 c = 0; | ||
513 | |||
514 | /* | ||
515 | * REVISIT: pwrdm_wait_transition() may be better implemented | ||
516 | * via a callback and a periodic timer check -- how long do we expect | ||
517 | * powerdomain transitions to take? | ||
518 | */ | ||
519 | |||
520 | /* XXX Is this udelay() value meaningful? */ | ||
521 | while ((omap4_prminst_read_inst_reg(pwrdm->prcm_partition, | ||
522 | pwrdm->prcm_offs, | ||
523 | OMAP4_PM_PWSTST) & | ||
524 | OMAP_INTRANSITION_MASK) && | ||
525 | (c++ < PWRDM_TRANSITION_BAILOUT)) | ||
526 | udelay(1); | ||
527 | |||
528 | if (c > PWRDM_TRANSITION_BAILOUT) { | ||
529 | pr_err("powerdomain: %s: waited too long to complete transition\n", | ||
530 | pwrdm->name); | ||
531 | return -EAGAIN; | ||
532 | } | ||
533 | |||
534 | pr_debug("powerdomain: completed transition in %d loops\n", c); | ||
535 | |||
536 | return 0; | ||
537 | } | ||
538 | |||
539 | struct pwrdm_ops omap4_pwrdm_operations = { | ||
540 | .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst, | ||
541 | .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst, | ||
542 | .pwrdm_read_pwrst = omap4_pwrdm_read_pwrst, | ||
543 | .pwrdm_read_prev_pwrst = omap4_pwrdm_read_prev_pwrst, | ||
544 | .pwrdm_set_lowpwrstchange = omap4_pwrdm_set_lowpwrstchange, | ||
545 | .pwrdm_clear_all_prev_pwrst = omap4_pwrdm_clear_all_prev_pwrst, | ||
546 | .pwrdm_set_logic_retst = omap4_pwrdm_set_logic_retst, | ||
547 | .pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst, | ||
548 | .pwrdm_read_prev_logic_pwrst = omap4_pwrdm_read_prev_logic_pwrst, | ||
549 | .pwrdm_read_logic_retst = omap4_pwrdm_read_logic_retst, | ||
550 | .pwrdm_read_mem_pwrst = omap4_pwrdm_read_mem_pwrst, | ||
551 | .pwrdm_read_mem_retst = omap4_pwrdm_read_mem_retst, | ||
552 | .pwrdm_read_prev_mem_pwrst = omap4_pwrdm_read_prev_mem_pwrst, | ||
553 | .pwrdm_set_mem_onst = omap4_pwrdm_set_mem_onst, | ||
554 | .pwrdm_set_mem_retst = omap4_pwrdm_set_mem_retst, | ||
555 | .pwrdm_wait_transition = omap4_pwrdm_wait_transition, | ||
556 | }; | ||
557 | |||
558 | |||
294 | static int __init omap4xxx_prm_init(void) | 559 | static int __init omap4xxx_prm_init(void) |
295 | { | 560 | { |
296 | if (!cpu_is_omap44xx()) | 561 | if (!cpu_is_omap44xx()) |