diff options
Diffstat (limited to 'arch/arm/mach-at91/pm.c')
-rw-r--r-- | arch/arm/mach-at91/pm.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 1606379ac284..f630250c6b87 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c | |||
@@ -136,7 +136,7 @@ static int at91_pm_verify_clocks(void) | |||
136 | unsigned long scsr; | 136 | unsigned long scsr; |
137 | int i; | 137 | int i; |
138 | 138 | ||
139 | scsr = at91_sys_read(AT91_PMC_SCSR); | 139 | scsr = at91_pmc_read(AT91_PMC_SCSR); |
140 | 140 | ||
141 | /* USB must not be using PLLB */ | 141 | /* USB must not be using PLLB */ |
142 | if (cpu_is_at91rm9200()) { | 142 | if (cpu_is_at91rm9200()) { |
@@ -150,11 +150,6 @@ static int at91_pm_verify_clocks(void) | |||
150 | pr_err("AT91: PM - Suspend-to-RAM with USB still active\n"); | 150 | pr_err("AT91: PM - Suspend-to-RAM with USB still active\n"); |
151 | return 0; | 151 | return 0; |
152 | } | 152 | } |
153 | } else if (cpu_is_at91cap9()) { | ||
154 | if ((scsr & AT91CAP9_PMC_UHP) != 0) { | ||
155 | pr_err("AT91: PM - Suspend-to-RAM with USB still active\n"); | ||
156 | return 0; | ||
157 | } | ||
158 | } | 153 | } |
159 | 154 | ||
160 | #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS | 155 | #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS |
@@ -165,7 +160,7 @@ static int at91_pm_verify_clocks(void) | |||
165 | if ((scsr & (AT91_PMC_PCK0 << i)) == 0) | 160 | if ((scsr & (AT91_PMC_PCK0 << i)) == 0) |
166 | continue; | 161 | continue; |
167 | 162 | ||
168 | css = at91_sys_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS; | 163 | css = at91_pmc_read(AT91_PMC_PCKR(i)) & AT91_PMC_CSS; |
169 | if (css != AT91_PMC_CSS_SLOW) { | 164 | if (css != AT91_PMC_CSS_SLOW) { |
170 | pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css); | 165 | pr_err("AT91: PM - Suspend-to-RAM with PCK%d src %d\n", i, css); |
171 | return 0; | 166 | return 0; |
@@ -193,23 +188,23 @@ int at91_suspend_entering_slow_clock(void) | |||
193 | EXPORT_SYMBOL(at91_suspend_entering_slow_clock); | 188 | EXPORT_SYMBOL(at91_suspend_entering_slow_clock); |
194 | 189 | ||
195 | 190 | ||
196 | static void (*slow_clock)(void); | 191 | static void (*slow_clock)(void __iomem *pmc, void __iomem *ramc0, |
192 | void __iomem *ramc1, int memctrl); | ||
197 | 193 | ||
198 | #ifdef CONFIG_AT91_SLOW_CLOCK | 194 | #ifdef CONFIG_AT91_SLOW_CLOCK |
199 | extern void at91_slow_clock(void); | 195 | extern void at91_slow_clock(void __iomem *pmc, void __iomem *ramc0, |
196 | void __iomem *ramc1, int memctrl); | ||
200 | extern u32 at91_slow_clock_sz; | 197 | extern u32 at91_slow_clock_sz; |
201 | #endif | 198 | #endif |
202 | 199 | ||
203 | |||
204 | static int at91_pm_enter(suspend_state_t state) | 200 | static int at91_pm_enter(suspend_state_t state) |
205 | { | 201 | { |
206 | u32 saved_lpr; | ||
207 | at91_gpio_suspend(); | 202 | at91_gpio_suspend(); |
208 | at91_irq_suspend(); | 203 | at91_irq_suspend(); |
209 | 204 | ||
210 | pr_debug("AT91: PM - wake mask %08x, pm state %d\n", | 205 | pr_debug("AT91: PM - wake mask %08x, pm state %d\n", |
211 | /* remember all the always-wake irqs */ | 206 | /* remember all the always-wake irqs */ |
212 | (at91_sys_read(AT91_PMC_PCSR) | 207 | (at91_pmc_read(AT91_PMC_PCSR) |
213 | | (1 << AT91_ID_FIQ) | 208 | | (1 << AT91_ID_FIQ) |
214 | | (1 << AT91_ID_SYS) | 209 | | (1 << AT91_ID_SYS) |
215 | | (at91_extern_irq)) | 210 | | (at91_extern_irq)) |
@@ -234,11 +229,18 @@ static int at91_pm_enter(suspend_state_t state) | |||
234 | * turning off the main oscillator; reverse on wakeup. | 229 | * turning off the main oscillator; reverse on wakeup. |
235 | */ | 230 | */ |
236 | if (slow_clock) { | 231 | if (slow_clock) { |
232 | int memctrl = AT91_MEMCTRL_SDRAMC; | ||
233 | |||
234 | if (cpu_is_at91rm9200()) | ||
235 | memctrl = AT91_MEMCTRL_MC; | ||
236 | else if (cpu_is_at91sam9g45()) | ||
237 | memctrl = AT91_MEMCTRL_DDRSDR; | ||
237 | #ifdef CONFIG_AT91_SLOW_CLOCK | 238 | #ifdef CONFIG_AT91_SLOW_CLOCK |
238 | /* copy slow_clock handler to SRAM, and call it */ | 239 | /* copy slow_clock handler to SRAM, and call it */ |
239 | memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz); | 240 | memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz); |
240 | #endif | 241 | #endif |
241 | slow_clock(); | 242 | slow_clock(at91_pmc_base, at91_ramc_base[0], |
243 | at91_ramc_base[1], memctrl); | ||
242 | break; | 244 | break; |
243 | } else { | 245 | } else { |
244 | pr_info("AT91: PM - no slow clock mode enabled ...\n"); | 246 | pr_info("AT91: PM - no slow clock mode enabled ...\n"); |
@@ -259,16 +261,7 @@ static int at91_pm_enter(suspend_state_t state) | |||
259 | * For ARM 926 based chips, this requirement is weaker | 261 | * For ARM 926 based chips, this requirement is weaker |
260 | * as at91sam9 can access a RAM in self-refresh mode. | 262 | * as at91sam9 can access a RAM in self-refresh mode. |
261 | */ | 263 | */ |
262 | asm volatile ( "mov r0, #0\n\t" | 264 | at91_standby(); |
263 | "b 1f\n\t" | ||
264 | ".align 5\n\t" | ||
265 | "1: mcr p15, 0, r0, c7, c10, 4\n\t" | ||
266 | : /* no output */ | ||
267 | : /* no input */ | ||
268 | : "r0"); | ||
269 | saved_lpr = sdram_selfrefresh_enable(); | ||
270 | wait_for_interrupt_enable(); | ||
271 | sdram_selfrefresh_disable(saved_lpr); | ||
272 | break; | 265 | break; |
273 | 266 | ||
274 | case PM_SUSPEND_ON: | 267 | case PM_SUSPEND_ON: |
@@ -316,7 +309,7 @@ static int __init at91_pm_init(void) | |||
316 | 309 | ||
317 | #ifdef CONFIG_ARCH_AT91RM9200 | 310 | #ifdef CONFIG_ARCH_AT91RM9200 |
318 | /* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */ | 311 | /* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */ |
319 | at91_sys_write(AT91_SDRAMC_LPR, 0); | 312 | at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0); |
320 | #endif | 313 | #endif |
321 | 314 | ||
322 | suspend_set_ops(&at91_pm_ops); | 315 | suspend_set_ops(&at91_pm_ops); |