pm.h 2.5 KB

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