blob: 2c4424bfa6c4141bae14c03bd02eb424e8e1e4e7 [file] [log] [blame]
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +01001#ifdef CONFIG_ARCH_AT91RM9200
2#include <mach/at91rm9200_mc.h>
3
4/*
5 * The AT91RM9200 goes into self-refresh mode with this command, and will
6 * terminate self-refresh automatically on the next SDRAM access.
7 *
8 * Self-refresh mode is exited as soon as a memory access is made, but we don't
9 * know for sure when that happens. However, we need to restore the low-power
10 * mode if it was enabled before going idle. Restoring low-power mode while
11 * still in self-refresh is "not recommended", but seems to work.
12 */
13
14static inline u32 sdram_selfrefresh_enable(void)
15{
16 u32 saved_lpr = at91_sys_read(AT91_SDRAMC_LPR);
17
18 at91_sys_write(AT91_SDRAMC_LPR, 0);
19 at91_sys_write(AT91_SDRAMC_SRR, 1);
20 return saved_lpr;
21}
22
23#define sdram_selfrefresh_disable(saved_lpr) at91_sys_write(AT91_SDRAMC_LPR, saved_lpr)
Nicolas Ferre8aeeda82010-10-22 17:53:39 +020024#define wait_for_interrupt_enable() asm("mcr p15, 0, r0, c7, c0, 4")
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010025
26#elif defined(CONFIG_ARCH_AT91CAP9)
27#include <mach/at91cap9_ddrsdr.h>
28
29
30static inline u32 sdram_selfrefresh_enable(void)
31{
32 u32 saved_lpr, lpr;
33
Nicolas Ferre7dca3342010-06-21 14:59:27 +010034 saved_lpr = at91_ramc_read(0, AT91_DDRSDRC_LPR);
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010035
36 lpr = saved_lpr & ~AT91_DDRSDRC_LPCB;
Nicolas Ferre7dca3342010-06-21 14:59:27 +010037 at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH);
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010038 return saved_lpr;
39}
40
Nicolas Ferre7dca3342010-06-21 14:59:27 +010041#define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr)
Nicolas Ferre8aeeda82010-10-22 17:53:39 +020042#define wait_for_interrupt_enable() cpu_do_idle()
Nicolas Ferre7dca3342010-06-21 14:59:27 +010043
44#elif defined(CONFIG_ARCH_AT91SAM9G45)
45#include <mach/at91sam9_ddrsdr.h>
46
47/* We manage both DDRAM/SDRAM controllers, we need more than one value to
48 * remember.
49 */
50static u32 saved_lpr1;
51
52static inline u32 sdram_selfrefresh_enable(void)
53{
54 /* Those tow values allow us to delay self-refresh activation
55 * to the maximum. */
56 u32 lpr0, lpr1;
57 u32 saved_lpr0;
58
59 saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
60 lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
61 lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
62
63 saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
64 lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
65 lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
66
67 /* self-refresh mode now */
68 at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
69 at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
70
71 return saved_lpr0;
72}
73
74#define sdram_selfrefresh_disable(saved_lpr0) \
75 do { \
76 at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); \
77 at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); \
78 } while (0)
Nicolas Ferre8aeeda82010-10-22 17:53:39 +020079#define wait_for_interrupt_enable() cpu_do_idle()
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010080
81#else
82#include <mach/at91sam9_sdramc.h>
83
84#ifdef CONFIG_ARCH_AT91SAM9263
85/*
86 * FIXME either or both the SDRAM controllers (EB0, EB1) might be in use;
87 * handle those cases both here and in the Suspend-To-RAM support.
88 */
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010089#warning Assuming EB1 SDRAM controller is *NOT* used
90#endif
91
92static inline u32 sdram_selfrefresh_enable(void)
93{
94 u32 saved_lpr, lpr;
95
Nicolas Ferre7dca3342010-06-21 14:59:27 +010096 saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010097
98 lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
Nicolas Ferre7dca3342010-06-21 14:59:27 +010099 at91_ramc_write(0, AT91_SDRAMC_LPR, lpr | AT91_SDRAMC_LPCB_SELF_REFRESH);
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +0100100 return saved_lpr;
101}
102
Nicolas Ferre7dca3342010-06-21 14:59:27 +0100103#define sdram_selfrefresh_disable(saved_lpr) at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr)
Nicolas Ferre8aeeda82010-10-22 17:53:39 +0200104#define wait_for_interrupt_enable() cpu_do_idle()
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +0100105
106#endif