Merge tag 'usb-5.11-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[linux/fpc-iii.git] / arch / arm / mach-at91 / pm_suspend.S
blob0184de05c1be1879a9f4c62d1c4135e94d6cad38
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * arch/arm/mach-at91/pm_slow_clock.S
4  *
5  *  Copyright (C) 2006 Savin Zlobec
6  *
7  * AT91SAM9 support:
8  *  Copyright (C) 2007 Anti Sullin <anti.sullin@artecdesign.ee>
9  */
10 #include <linux/linkage.h>
11 #include <linux/clk/at91_pmc.h>
12 #include "pm.h"
13 #include "pm_data-offsets.h"
15 #define SRAMC_SELF_FRESH_ACTIVE         0x01
16 #define SRAMC_SELF_FRESH_EXIT           0x00
18 pmc     .req    r0
19 tmp1    .req    r4
20 tmp2    .req    r5
21 tmp3    .req    r6
24  * Wait until master clock is ready (after switching master clock source)
25  */
26         .macro wait_mckrdy
27 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
28         tst     tmp1, #AT91_PMC_MCKRDY
29         beq     1b
30         .endm
33  * Wait until master oscillator has stabilized.
34  */
35         .macro wait_moscrdy
36 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
37         tst     tmp1, #AT91_PMC_MOSCS
38         beq     1b
39         .endm
42  * Wait for main oscillator selection is done
43  */
44         .macro wait_moscsels
45 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
46         tst     tmp1, #AT91_PMC_MOSCSELS
47         beq     1b
48         .endm
51  * Put the processor to enter the idle state
52  */
53         .macro at91_cpu_idle
55 #if defined(CONFIG_CPU_V7)
56         mov     tmp1, #AT91_PMC_PCK
57         str     tmp1, [pmc, #AT91_PMC_SCDR]
59         dsb
61         wfi             @ Wait For Interrupt
62 #else
63         mcr     p15, 0, tmp1, c7, c0, 4
64 #endif
66         .endm
68         .text
70         .arm
73  * void at91_suspend_sram_fn(struct at91_pm_data*)
74  * @input param:
75  *      @r0: base address of struct at91_pm_data
76  */
77 /* at91_pm_suspend_in_sram must be 8-byte aligned per the requirements of fncpy() */
78         .align 3
79 ENTRY(at91_pm_suspend_in_sram)
80         /* Save registers on stack */
81         stmfd   sp!, {r4 - r12, lr}
83         /* Drain write buffer */
84         mov     tmp1, #0
85         mcr     p15, 0, tmp1, c7, c10, 4
87         ldr     tmp1, [r0, #PM_DATA_PMC]
88         str     tmp1, .pmc_base
89         ldr     tmp1, [r0, #PM_DATA_RAMC0]
90         str     tmp1, .sramc_base
91         ldr     tmp1, [r0, #PM_DATA_RAMC1]
92         str     tmp1, .sramc1_base
93         ldr     tmp1, [r0, #PM_DATA_MEMCTRL]
94         str     tmp1, .memtype
95         ldr     tmp1, [r0, #PM_DATA_MODE]
96         str     tmp1, .pm_mode
97         ldr     tmp1, [r0, #PM_DATA_PMC_MCKR_OFFSET]
98         str     tmp1, .mckr_offset
99         ldr     tmp1, [r0, #PM_DATA_PMC_VERSION]
100         str     tmp1, .pmc_version
101         /* Both ldrne below are here to preload their address in the TLB */
102         ldr     tmp1, [r0, #PM_DATA_SHDWC]
103         str     tmp1, .shdwc
104         cmp     tmp1, #0
105         ldrne   tmp2, [tmp1, #0]
106         ldr     tmp1, [r0, #PM_DATA_SFRBU]
107         str     tmp1, .sfrbu
108         cmp     tmp1, #0
109         ldrne   tmp2, [tmp1, #0x10]
111         /* Active the self-refresh mode */
112         mov     r0, #SRAMC_SELF_FRESH_ACTIVE
113         bl      at91_sramc_self_refresh
115         ldr     r0, .pm_mode
116         cmp     r0, #AT91_PM_STANDBY
117         beq     standby
118         cmp     r0, #AT91_PM_BACKUP
119         beq     backup_mode
121         bl      at91_ulp_mode
122         b       exit_suspend
124 standby:
125         /* Wait for interrupt */
126         ldr     pmc, .pmc_base
127         at91_cpu_idle
128         b       exit_suspend
130 backup_mode:
131         bl      at91_backup_mode
132         b       exit_suspend
134 exit_suspend:
135         /* Exit the self-refresh mode */
136         mov     r0, #SRAMC_SELF_FRESH_EXIT
137         bl      at91_sramc_self_refresh
139         /* Restore registers, and return */
140         ldmfd   sp!, {r4 - r12, pc}
141 ENDPROC(at91_pm_suspend_in_sram)
143 ENTRY(at91_backup_mode)
144         /* Switch the master clock source to slow clock. */
145         ldr     pmc, .pmc_base
146         ldr     tmp2, .mckr_offset
147         ldr     tmp1, [pmc, tmp2]
148         bic     tmp1, tmp1, #AT91_PMC_CSS
149         str     tmp1, [pmc, tmp2]
151         wait_mckrdy
153         /*BUMEN*/
154         ldr     r0, .sfrbu
155         mov     tmp1, #0x1
156         str     tmp1, [r0, #0x10]
158         /* Shutdown */
159         ldr     r0, .shdwc
160         mov     tmp1, #0xA5000000
161         add     tmp1, tmp1, #0x1
162         str     tmp1, [r0, #0]
163 ENDPROC(at91_backup_mode)
165 .macro at91_pm_ulp0_mode
166         ldr     pmc, .pmc_base
167         ldr     tmp2, .pm_mode
168         ldr     tmp3, .mckr_offset
170         /* Check if ULP0 fast variant has been requested. */
171         cmp     tmp2, #AT91_PM_ULP0_FAST
172         bne     0f
174         /* Set highest prescaler for power saving */
175         ldr     tmp1, [pmc, tmp3]
176         bic     tmp1, tmp1, #AT91_PMC_PRES
177         orr     tmp1, tmp1, #AT91_PMC_PRES_64
178         str     tmp1, [pmc, tmp3]
179         wait_mckrdy
180         b       1f
183         /* Turn off the crystal oscillator */
184         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
185         bic     tmp1, tmp1, #AT91_PMC_MOSCEN
186         orr     tmp1, tmp1, #AT91_PMC_KEY
187         str     tmp1, [pmc, #AT91_CKGR_MOR]
189         /* Save RC oscillator state */
190         ldr     tmp1, [pmc, #AT91_PMC_SR]
191         str     tmp1, .saved_osc_status
192         tst     tmp1, #AT91_PMC_MOSCRCS
193         bne     1f
195         /* Turn off RC oscillator */
196         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
197         bic     tmp1, tmp1, #AT91_PMC_MOSCRCEN
198         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
199         orr     tmp1, tmp1, #AT91_PMC_KEY
200         str     tmp1, [pmc, #AT91_CKGR_MOR]
202         /* Wait main RC disabled done */
203 2:      ldr     tmp1, [pmc, #AT91_PMC_SR]
204         tst     tmp1, #AT91_PMC_MOSCRCS
205         bne     2b
207         /* Wait for interrupt */
208 1:      at91_cpu_idle
210         /* Check if ULP0 fast variant has been requested. */
211         cmp     tmp2, #AT91_PM_ULP0_FAST
212         bne     5f
214         /* Set lowest prescaler for fast resume. */
215         ldr     tmp1, [pmc, tmp3]
216         bic     tmp1, tmp1, #AT91_PMC_PRES
217         str     tmp1, [pmc, tmp3]
218         wait_mckrdy
219         b       6f
221 5:      /* Restore RC oscillator state */
222         ldr     tmp1, .saved_osc_status
223         tst     tmp1, #AT91_PMC_MOSCRCS
224         beq     4f
226         /* Turn on RC oscillator */
227         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
228         orr     tmp1, tmp1, #AT91_PMC_MOSCRCEN
229         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
230         orr     tmp1, tmp1, #AT91_PMC_KEY
231         str     tmp1, [pmc, #AT91_CKGR_MOR]
233         /* Wait main RC stabilization */
234 3:      ldr     tmp1, [pmc, #AT91_PMC_SR]
235         tst     tmp1, #AT91_PMC_MOSCRCS
236         beq     3b
238         /* Turn on the crystal oscillator */
239 4:      ldr     tmp1, [pmc, #AT91_CKGR_MOR]
240         orr     tmp1, tmp1, #AT91_PMC_MOSCEN
241         orr     tmp1, tmp1, #AT91_PMC_KEY
242         str     tmp1, [pmc, #AT91_CKGR_MOR]
244         wait_moscrdy
246 .endm
249  * Note: This procedure only applies on the platform which uses
250  * the external crystal oscillator as a main clock source.
251  */
252 .macro at91_pm_ulp1_mode
253         ldr     pmc, .pmc_base
254         ldr     tmp2, .mckr_offset
256         /* Save RC oscillator state and check if it is enabled. */
257         ldr     tmp1, [pmc, #AT91_PMC_SR]
258         str     tmp1, .saved_osc_status
259         tst     tmp1, #AT91_PMC_MOSCRCS
260         bne     2f
262         /* Enable RC oscillator */
263         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
264         orr     tmp1, tmp1, #AT91_PMC_MOSCRCEN
265         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
266         orr     tmp1, tmp1, #AT91_PMC_KEY
267         str     tmp1, [pmc, #AT91_CKGR_MOR]
269         /* Wait main RC stabilization */
270 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
271         tst     tmp1, #AT91_PMC_MOSCRCS
272         beq     1b
274         /* Switch the main clock source to 12-MHz RC oscillator */
275 2:      ldr     tmp1, [pmc, #AT91_CKGR_MOR]
276         bic     tmp1, tmp1, #AT91_PMC_MOSCSEL
277         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
278         orr     tmp1, tmp1, #AT91_PMC_KEY
279         str     tmp1, [pmc, #AT91_CKGR_MOR]
281         wait_moscsels
283         /* Disable the crystal oscillator */
284         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
285         bic     tmp1, tmp1, #AT91_PMC_MOSCEN
286         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
287         orr     tmp1, tmp1, #AT91_PMC_KEY
288         str     tmp1, [pmc, #AT91_CKGR_MOR]
290         /* Switch the master clock source to main clock */
291         ldr     tmp1, [pmc, tmp2]
292         bic     tmp1, tmp1, #AT91_PMC_CSS
293         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN
294         str     tmp1, [pmc, tmp2]
296         wait_mckrdy
298         /* Enter the ULP1 mode by set WAITMODE bit in CKGR_MOR */
299         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
300         orr     tmp1, tmp1, #AT91_PMC_WAITMODE
301         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
302         orr     tmp1, tmp1, #AT91_PMC_KEY
303         str     tmp1, [pmc, #AT91_CKGR_MOR]
305         /* Quirk for SAM9X60's PMC */
306         nop
307         nop
309         wait_mckrdy
311         /* Enable the crystal oscillator */
312         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
313         orr     tmp1, tmp1, #AT91_PMC_MOSCEN
314         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
315         orr     tmp1, tmp1, #AT91_PMC_KEY
316         str     tmp1, [pmc, #AT91_CKGR_MOR]
318         wait_moscrdy
320         /* Switch the master clock source to slow clock */
321         ldr     tmp1, [pmc, tmp2]
322         bic     tmp1, tmp1, #AT91_PMC_CSS
323         str     tmp1, [pmc, tmp2]
325         wait_mckrdy
327         /* Switch main clock source to crystal oscillator */
328         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
329         orr     tmp1, tmp1, #AT91_PMC_MOSCSEL
330         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
331         orr     tmp1, tmp1, #AT91_PMC_KEY
332         str     tmp1, [pmc, #AT91_CKGR_MOR]
334         wait_moscsels
336         /* Switch the master clock source to main clock */
337         ldr     tmp1, [pmc, tmp2]
338         bic     tmp1, tmp1, #AT91_PMC_CSS
339         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN
340         str     tmp1, [pmc, tmp2]
342         wait_mckrdy
344         /* Restore RC oscillator state */
345         ldr     tmp1, .saved_osc_status
346         tst     tmp1, #AT91_PMC_MOSCRCS
347         bne     3f
349         /* Disable RC oscillator */
350         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
351         bic     tmp1, tmp1, #AT91_PMC_MOSCRCEN
352         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
353         orr     tmp1, tmp1, #AT91_PMC_KEY
354         str     tmp1, [pmc, #AT91_CKGR_MOR]
356         /* Wait RC oscillator disable done */
357 4:      ldr     tmp1, [pmc, #AT91_PMC_SR]
358         tst     tmp1, #AT91_PMC_MOSCRCS
359         bne     4b
362 .endm
364 .macro at91_plla_disable
365         /* Save PLLA setting and disable it */
366         ldr     tmp1, .pmc_version
367         cmp     tmp1, #AT91_PMC_V1
368         beq     1f
370 #ifdef CONFIG_SOC_SAM9X60
371         /* Save PLLA settings. */
372         ldr     tmp2, [pmc, #AT91_PMC_PLL_UPDT]
373         bic     tmp2, tmp2, #AT91_PMC_PLL_UPDT_ID
374         str     tmp2, [pmc, #AT91_PMC_PLL_UPDT]
376         /* save div. */
377         mov     tmp1, #0
378         ldr     tmp2, [pmc, #AT91_PMC_PLL_CTRL0]
379         bic     tmp2, tmp2, #0xffffff00
380         orr     tmp1, tmp1, tmp2
382         /* save mul. */
383         ldr     tmp2, [pmc, #AT91_PMC_PLL_CTRL1]
384         bic     tmp2, tmp2, #0xffffff
385         orr     tmp1, tmp1, tmp2
386         str     tmp1, .saved_pllar
388         /* step 2. */
389         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
390         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
391         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
392         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
394         /* step 3. */
395         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
396         bic     tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLLCK
397         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLL
398         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
400         /* step 4. */
401         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
402         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
403         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
404         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
406         /* step 5. */
407         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
408         bic     tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLL
409         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
411         /* step 7. */
412         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
413         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
414         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
415         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
417         b       2f
418 #endif
420 1:      /* Save PLLA setting and disable it */
421         ldr     tmp1, [pmc, #AT91_CKGR_PLLAR]
422         str     tmp1, .saved_pllar
424         /* Disable PLLA. */
425         mov     tmp1, #AT91_PMC_PLLCOUNT
426         orr     tmp1, tmp1, #(1 << 29)          /* bit 29 always set */
427         str     tmp1, [pmc, #AT91_CKGR_PLLAR]
429 .endm
431 .macro at91_plla_enable
432         ldr     tmp2, .saved_pllar
433         ldr     tmp3, .pmc_version
434         cmp     tmp3, #AT91_PMC_V1
435         beq     4f
437 #ifdef CONFIG_SOC_SAM9X60
438         /* step 1. */
439         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
440         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
441         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
442         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
444         /* step 2. */
445         ldr     tmp1, =#AT91_PMC_PLL_ACR_DEFAULT_PLLA
446         str     tmp1, [pmc, #AT91_PMC_PLL_ACR]
448         /* step 3. */
449         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL1]
450         mov     tmp3, tmp2
451         bic     tmp3, tmp3, #0xffffff
452         orr     tmp1, tmp1, tmp3
453         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL1]
455         /* step 8. */
456         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
457         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
458         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
459         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
461         /* step 9. */
462         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
463         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENLOCK
464         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLL
465         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLLCK
466         bic     tmp1, tmp1, #0xff
467         mov     tmp3, tmp2
468         bic     tmp3, tmp3, #0xffffff00
469         orr     tmp1, tmp1, tmp3
470         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
472         /* step 10. */
473         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
474         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
475         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
476         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT]
478         /* step 11. */
479 3:      ldr     tmp1, [pmc, #AT91_PMC_PLL_ISR0]
480         tst     tmp1, #0x1
481         beq     3b
482         b       2f
483 #endif
485         /* Restore PLLA setting */
486 4:      str     tmp2, [pmc, #AT91_CKGR_PLLAR]
488         /* Enable PLLA. */
489         tst     tmp2, #(AT91_PMC_MUL &  0xff0000)
490         bne     1f
491         tst     tmp2, #(AT91_PMC_MUL & ~0xff0000)
492         beq     2f
494 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
495         tst     tmp1, #AT91_PMC_LOCKA
496         beq     1b
498 .endm
500 ENTRY(at91_ulp_mode)
501         ldr     pmc, .pmc_base
502         ldr     tmp2, .mckr_offset
503         ldr     tmp3, .pm_mode
505         /* Save Master clock setting */
506         ldr     tmp1, [pmc, tmp2]
507         str     tmp1, .saved_mckr
509         /*
510          * Set master clock source to:
511          * - MAINCK if using ULP0 fast variant
512          * - slow clock, otherwise
513          */
514         bic     tmp1, tmp1, #AT91_PMC_CSS
515         cmp     tmp3, #AT91_PM_ULP0_FAST
516         bne     save_mck
517         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN
518 save_mck:
519         str     tmp1, [pmc, tmp2]
521         wait_mckrdy
523         at91_plla_disable
525         cmp     tmp3, #AT91_PM_ULP1
526         beq     ulp1_mode
528         at91_pm_ulp0_mode
529         b       ulp_exit
531 ulp1_mode:
532         at91_pm_ulp1_mode
533         b       ulp_exit
535 ulp_exit:
536         ldr     pmc, .pmc_base
538         at91_plla_enable
540         /*
541          * Restore master clock setting
542          */
543         ldr     tmp1, .mckr_offset
544         ldr     tmp2, .saved_mckr
545         str     tmp2, [pmc, tmp1]
547         wait_mckrdy
549         mov     pc, lr
550 ENDPROC(at91_ulp_mode)
553  * void at91_sramc_self_refresh(unsigned int is_active)
555  * @input param:
556  *      @r0: 1 - active self-refresh mode
557  *           0 - exit self-refresh mode
558  * register usage:
559  *      @r1: memory type
560  *      @r2: base address of the sram controller
561  */
563 ENTRY(at91_sramc_self_refresh)
564         ldr     r1, .memtype
565         ldr     r2, .sramc_base
567         cmp     r1, #AT91_MEMCTRL_MC
568         bne     ddrc_sf
570         /*
571          * at91rm9200 Memory controller
572          */
574          /*
575           * For exiting the self-refresh mode, do nothing,
576           * automatically exit the self-refresh mode.
577           */
578         tst     r0, #SRAMC_SELF_FRESH_ACTIVE
579         beq     exit_sramc_sf
581         /* Active SDRAM self-refresh mode */
582         mov     r3, #1
583         str     r3, [r2, #AT91_MC_SDRAMC_SRR]
584         b       exit_sramc_sf
586 ddrc_sf:
587         cmp     r1, #AT91_MEMCTRL_DDRSDR
588         bne     sdramc_sf
590         /*
591          * DDR Memory controller
592          */
593         tst     r0, #SRAMC_SELF_FRESH_ACTIVE
594         beq     ddrc_exit_sf
596         /* LPDDR1 --> force DDR2 mode during self-refresh */
597         ldr     r3, [r2, #AT91_DDRSDRC_MDR]
598         str     r3, .saved_sam9_mdr
599         bic     r3, r3, #~AT91_DDRSDRC_MD
600         cmp     r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
601         ldreq   r3, [r2, #AT91_DDRSDRC_MDR]
602         biceq   r3, r3, #AT91_DDRSDRC_MD
603         orreq   r3, r3, #AT91_DDRSDRC_MD_DDR2
604         streq   r3, [r2, #AT91_DDRSDRC_MDR]
606         /* Active DDRC self-refresh mode */
607         ldr     r3, [r2, #AT91_DDRSDRC_LPR]
608         str     r3, .saved_sam9_lpr
609         bic     r3, r3, #AT91_DDRSDRC_LPCB
610         orr     r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
611         str     r3, [r2, #AT91_DDRSDRC_LPR]
613         /* If using the 2nd ddr controller */
614         ldr     r2, .sramc1_base
615         cmp     r2, #0
616         beq     no_2nd_ddrc
618         ldr     r3, [r2, #AT91_DDRSDRC_MDR]
619         str     r3, .saved_sam9_mdr1
620         bic     r3, r3, #~AT91_DDRSDRC_MD
621         cmp     r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
622         ldreq   r3, [r2, #AT91_DDRSDRC_MDR]
623         biceq   r3, r3, #AT91_DDRSDRC_MD
624         orreq   r3, r3, #AT91_DDRSDRC_MD_DDR2
625         streq   r3, [r2, #AT91_DDRSDRC_MDR]
627         /* Active DDRC self-refresh mode */
628         ldr     r3, [r2, #AT91_DDRSDRC_LPR]
629         str     r3, .saved_sam9_lpr1
630         bic     r3, r3, #AT91_DDRSDRC_LPCB
631         orr     r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
632         str     r3, [r2, #AT91_DDRSDRC_LPR]
634 no_2nd_ddrc:
635         b       exit_sramc_sf
637 ddrc_exit_sf:
638         /* Restore MDR in case of LPDDR1 */
639         ldr     r3, .saved_sam9_mdr
640         str     r3, [r2, #AT91_DDRSDRC_MDR]
641         /* Restore LPR on AT91 with DDRAM */
642         ldr     r3, .saved_sam9_lpr
643         str     r3, [r2, #AT91_DDRSDRC_LPR]
645         /* If using the 2nd ddr controller */
646         ldr     r2, .sramc1_base
647         cmp     r2, #0
648         ldrne   r3, .saved_sam9_mdr1
649         strne   r3, [r2, #AT91_DDRSDRC_MDR]
650         ldrne   r3, .saved_sam9_lpr1
651         strne   r3, [r2, #AT91_DDRSDRC_LPR]
653         b       exit_sramc_sf
655         /*
656          * SDRAMC Memory controller
657          */
658 sdramc_sf:
659         tst     r0, #SRAMC_SELF_FRESH_ACTIVE
660         beq     sdramc_exit_sf
662         /* Active SDRAMC self-refresh mode */
663         ldr     r3, [r2, #AT91_SDRAMC_LPR]
664         str     r3, .saved_sam9_lpr
665         bic     r3, r3, #AT91_SDRAMC_LPCB
666         orr     r3, r3, #AT91_SDRAMC_LPCB_SELF_REFRESH
667         str     r3, [r2, #AT91_SDRAMC_LPR]
669 sdramc_exit_sf:
670         ldr     r3, .saved_sam9_lpr
671         str     r3, [r2, #AT91_SDRAMC_LPR]
673 exit_sramc_sf:
674         mov     pc, lr
675 ENDPROC(at91_sramc_self_refresh)
677 .pmc_base:
678         .word 0
679 .sramc_base:
680         .word 0
681 .sramc1_base:
682         .word 0
683 .shdwc:
684         .word 0
685 .sfrbu:
686         .word 0
687 .memtype:
688         .word 0
689 .pm_mode:
690         .word 0
691 .mckr_offset:
692         .word 0
693 .pmc_version:
694         .word 0
695 .saved_mckr:
696         .word 0
697 .saved_pllar:
698         .word 0
699 .saved_sam9_lpr:
700         .word 0
701 .saved_sam9_lpr1:
702         .word 0
703 .saved_sam9_mdr:
704         .word 0
705 .saved_sam9_mdr1:
706         .word 0
707 .saved_osc_status:
708         .word 0
710 ENTRY(at91_pm_suspend_in_sram_sz)
711         .word .-at91_pm_suspend_in_sram