pm.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #ifdef CONFIG_ARCH_AT91RM9200
  2. #include <mach/at91rm9200_mc.h>
  3. /*
  4. * The AT91RM9200 goes into self-refresh mode with this command, and will
  5. * terminate self-refresh automatically on the next SDRAM access.
  6. *
  7. * Self-refresh mode is exited as soon as a memory access is made, but we don't
  8. * know for sure when that happens. However, we need to restore the low-power
  9. * mode if it was enabled before going idle. Restoring low-power mode while
  10. * still in self-refresh is "not recommended", but seems to work.
  11. */
  12. static inline u32 sdram_selfrefresh_enable(void)
  13. {
  14. u32 saved_lpr = at91_sys_read(AT91_SDRAMC_LPR);
  15. at91_sys_write(AT91_SDRAMC_LPR, 0);
  16. at91_sys_write(AT91_SDRAMC_SRR, 1);
  17. return saved_lpr;
  18. }
  19. #define sdram_selfrefresh_disable(saved_lpr) at91_sys_write(AT91_SDRAMC_LPR, saved_lpr)
  20. #define wait_for_interrupt_enable() asm volatile ("mcr p15, 0, %0, c7, c0, 4" \
  21. : : "r" (0))
  22. #elif defined(CONFIG_ARCH_AT91CAP9)
  23. #include <mach/at91cap9_ddrsdr.h>
  24. static inline u32 sdram_selfrefresh_enable(void)
  25. {
  26. u32 saved_lpr, lpr;
  27. saved_lpr = at91_ramc_read(0, AT91_DDRSDRC_LPR);
  28. lpr = saved_lpr & ~AT91_DDRSDRC_LPCB;
  29. at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH);
  30. return saved_lpr;
  31. }
  32. #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr)
  33. #define wait_for_interrupt_enable() cpu_do_idle()
  34. #elif defined(CONFIG_ARCH_AT91SAM9G45)
  35. #include <mach/at91sam9_ddrsdr.h>
  36. /* We manage both DDRAM/SDRAM controllers, we need more than one value to
  37. * remember.
  38. */
  39. static u32 saved_lpr1;
  40. static inline u32 sdram_selfrefresh_enable(void)
  41. {
  42. /* Those tow values allow us to delay self-refresh activation
  43. * to the maximum. */
  44. u32 lpr0, lpr1;
  45. u32 saved_lpr0;
  46. saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
  47. lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
  48. lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
  49. saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
  50. lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
  51. lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
  52. /* self-refresh mode now */
  53. at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
  54. at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
  55. return saved_lpr0;
  56. }
  57. #define sdram_selfrefresh_disable(saved_lpr0) \
  58. do { \
  59. at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); \
  60. at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); \
  61. } while (0)
  62. #define wait_for_interrupt_enable() cpu_do_idle()
  63. #else
  64. #include <mach/at91sam9_sdramc.h>
  65. #ifdef CONFIG_ARCH_AT91SAM9263
  66. /*
  67. * FIXME either or both the SDRAM controllers (EB0, EB1) might be in use;
  68. * handle those cases both here and in the Suspend-To-RAM support.
  69. */
  70. #warning Assuming EB1 SDRAM controller is *NOT* used
  71. #endif
  72. static inline u32 sdram_selfrefresh_enable(void)
  73. {
  74. u32 saved_lpr, lpr;
  75. saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
  76. lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
  77. at91_ramc_write(0, AT91_SDRAMC_LPR, lpr | AT91_SDRAMC_LPCB_SELF_REFRESH);
  78. return saved_lpr;
  79. }
  80. #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr)
  81. #define wait_for_interrupt_enable() cpu_do_idle()
  82. #endif