blob: 715813ed73e37b41525716766f223ee23313e992 [file] [log] [blame]
Daniel Lezcanofa50ae92012-01-25 00:56:06 +01001/*
2 * AT91 Power Management
3 *
4 * Copyright (C) 2005 David Brownell
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11#ifndef __ARCH_ARM_MACH_AT91_PM
12#define __ARCH_ARM_MACH_AT91_PM
13
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010014#ifdef CONFIG_ARCH_AT91RM9200
15#include <mach/at91rm9200_mc.h>
16
17/*
18 * The AT91RM9200 goes into self-refresh mode with this command, and will
19 * terminate self-refresh automatically on the next SDRAM access.
20 *
21 * Self-refresh mode is exited as soon as a memory access is made, but we don't
22 * know for sure when that happens. However, we need to restore the low-power
23 * mode if it was enabled before going idle. Restoring low-power mode while
24 * still in self-refresh is "not recommended", but seems to work.
25 */
26
27static inline u32 sdram_selfrefresh_enable(void)
28{
29 u32 saved_lpr = at91_sys_read(AT91_SDRAMC_LPR);
30
31 at91_sys_write(AT91_SDRAMC_LPR, 0);
32 at91_sys_write(AT91_SDRAMC_SRR, 1);
33 return saved_lpr;
34}
35
Daniel Lezcanoc54b7bb2012-01-25 00:56:05 +010036#define sdram_selfrefresh_disable(saved_lpr) \
37 at91_sys_write(AT91_SDRAMC_LPR, saved_lpr)
38
39#define wait_for_interrupt_enable() \
40 asm volatile ("mcr p15, 0, %0, c7, c0, 4" \
41 : : "r" (0))
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +010042
Nicolas Ferre7dca3342010-06-21 14:59:27 +010043#elif defined(CONFIG_ARCH_AT91SAM9G45)
44#include <mach/at91sam9_ddrsdr.h>
45
46/* We manage both DDRAM/SDRAM controllers, we need more than one value to
47 * remember.
48 */
49static u32 saved_lpr1;
50
51static inline u32 sdram_selfrefresh_enable(void)
52{
53 /* Those tow values allow us to delay self-refresh activation
54 * to the maximum. */
55 u32 lpr0, lpr1;
56 u32 saved_lpr0;
57
58 saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
59 lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
60 lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
61
62 saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
63 lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
64 lpr0 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
65
66 /* self-refresh mode now */
67 at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
68 at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
69
70 return saved_lpr0;
71}
72
73#define sdram_selfrefresh_disable(saved_lpr0) \
74 do { \
75 at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); \
76 at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); \
77 } while (0)
Daniel Lezcanoc54b7bb2012-01-25 00:56:05 +010078
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;
Daniel Lezcanoc54b7bb2012-01-25 00:56:05 +010099 at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
100 AT91_SDRAMC_LPCB_SELF_REFRESH);
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +0100101 return saved_lpr;
102}
103
Daniel Lezcanoc54b7bb2012-01-25 00:56:05 +0100104#define sdram_selfrefresh_disable(saved_lpr) \
105 at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr)
106
107#define wait_for_interrupt_enable() \
108 cpu_do_idle()
Albin Tonnerre1ea60cf2009-11-01 18:40:50 +0100109
110#endif
Daniel Lezcanofa50ae92012-01-25 00:56:06 +0100111
112#endif