pm.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. #elif defined(CONFIG_ARCH_AT91CAP9)
  21. #include <mach/at91cap9_ddrsdr.h>
  22. static inline u32 sdram_selfrefresh_enable(void)
  23. {
  24. u32 saved_lpr, lpr;
  25. saved_lpr = at91_ramc_read(0, AT91_DDRSDRC_LPR);
  26. lpr = saved_lpr & ~AT91_DDRSDRC_LPCB;
  27. at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH);
  28. return saved_lpr;
  29. }
  30. #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr)
  31. #elif defined(CONFIG_ARCH_AT91SAM9G45)
  32. #include <mach/at91sam9_ddrsdr.h>
  33. /* We manage both DDRAM/SDRAM controllers, we need more than one value to
  34. * remember.
  35. */
  36. static u32 saved_lpr1;
  37. static inline u32 sdram_selfrefresh_enable(void)
  38. {
  39. /* Those tow values allow us to delay self-refresh activation
  40. * to the maximum. */
  41. u32 lpr0, lpr1;
  42. u32 saved_lpr0;
  43. saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
  44. lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
  45. lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
  46. saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
  47. lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
  48. lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
  49. /* self-refresh mode now */
  50. at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
  51. at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
  52. return saved_lpr0;
  53. }
  54. #define sdram_selfrefresh_disable(saved_lpr0) \
  55. do { \
  56. at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); \
  57. at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); \
  58. } while (0)
  59. #else
  60. #include <mach/at91sam9_sdramc.h>
  61. #ifdef CONFIG_ARCH_AT91SAM9263
  62. /*
  63. * FIXME either or both the SDRAM controllers (EB0, EB1) might be in use;
  64. * handle those cases both here and in the Suspend-To-RAM support.
  65. */
  66. #warning Assuming EB1 SDRAM controller is *NOT* used
  67. #endif
  68. static inline u32 sdram_selfrefresh_enable(void)
  69. {
  70. u32 saved_lpr, lpr;
  71. saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
  72. lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
  73. at91_ramc_write(0, AT91_SDRAMC_LPR, lpr | AT91_SDRAMC_LPCB_SELF_REFRESH);
  74. return saved_lpr;
  75. }
  76. #define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr)
  77. #endif