GNU Linux-libre 5.4.274-gnu1
[releases.git] / arch / arm / mach-at91 / pm_suspend.S
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"
14
15 #define SRAMC_SELF_FRESH_ACTIVE         0x01
16 #define SRAMC_SELF_FRESH_EXIT           0x00
17
18 pmc     .req    r0
19 tmp1    .req    r4
20 tmp2    .req    r5
21
22 /*
23  * Wait until master clock is ready (after switching master clock source)
24  */
25         .macro wait_mckrdy
26 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
27         tst     tmp1, #AT91_PMC_MCKRDY
28         beq     1b
29         .endm
30
31 /*
32  * Wait until master oscillator has stabilized.
33  */
34         .macro wait_moscrdy
35 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
36         tst     tmp1, #AT91_PMC_MOSCS
37         beq     1b
38         .endm
39
40 /*
41  * Wait for main oscillator selection is done
42  */
43         .macro wait_moscsels
44 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
45         tst     tmp1, #AT91_PMC_MOSCSELS
46         beq     1b
47         .endm
48
49 /*
50  * Put the processor to enter the idle state
51  */
52         .macro at91_cpu_idle
53
54 #if defined(CONFIG_CPU_V7)
55         mov     tmp1, #AT91_PMC_PCK
56         str     tmp1, [pmc, #AT91_PMC_SCDR]
57
58         dsb
59
60         wfi             @ Wait For Interrupt
61 #else
62         mcr     p15, 0, tmp1, c7, c0, 4
63 #endif
64
65         .endm
66
67         .text
68
69         .arm
70
71 /*
72  * void at91_suspend_sram_fn(struct at91_pm_data*)
73  * @input param:
74  *      @r0: base address of struct at91_pm_data
75  */
76 /* at91_pm_suspend_in_sram must be 8-byte aligned per the requirements of fncpy() */
77         .align 3
78 ENTRY(at91_pm_suspend_in_sram)
79         /* Save registers on stack */
80         stmfd   sp!, {r4 - r12, lr}
81
82         /* Drain write buffer */
83         mov     tmp1, #0
84         mcr     p15, 0, tmp1, c7, c10, 4
85
86         ldr     tmp1, [r0, #PM_DATA_PMC]
87         str     tmp1, .pmc_base
88         ldr     tmp1, [r0, #PM_DATA_RAMC0]
89         str     tmp1, .sramc_base
90         ldr     tmp1, [r0, #PM_DATA_RAMC1]
91         str     tmp1, .sramc1_base
92         ldr     tmp1, [r0, #PM_DATA_MEMCTRL]
93         str     tmp1, .memtype
94         ldr     tmp1, [r0, #PM_DATA_MODE]
95         str     tmp1, .pm_mode
96         /* Both ldrne below are here to preload their address in the TLB */
97         ldr     tmp1, [r0, #PM_DATA_SHDWC]
98         str     tmp1, .shdwc
99         cmp     tmp1, #0
100         ldrne   tmp2, [tmp1, #0]
101         ldr     tmp1, [r0, #PM_DATA_SFRBU]
102         str     tmp1, .sfr
103         cmp     tmp1, #0
104         ldrne   tmp2, [tmp1, #0x10]
105
106         /* Active the self-refresh mode */
107         mov     r0, #SRAMC_SELF_FRESH_ACTIVE
108         bl      at91_sramc_self_refresh
109
110         ldr     r0, .pm_mode
111         cmp     r0, #AT91_PM_STANDBY
112         beq     standby
113         cmp     r0, #AT91_PM_BACKUP
114         beq     backup_mode
115
116         bl      at91_ulp_mode
117         b       exit_suspend
118
119 standby:
120         /* Wait for interrupt */
121         ldr     pmc, .pmc_base
122         at91_cpu_idle
123         b       exit_suspend
124
125 backup_mode:
126         bl      at91_backup_mode
127         b       exit_suspend
128
129 exit_suspend:
130         /* Exit the self-refresh mode */
131         mov     r0, #SRAMC_SELF_FRESH_EXIT
132         bl      at91_sramc_self_refresh
133
134         /* Restore registers, and return */
135         ldmfd   sp!, {r4 - r12, pc}
136 ENDPROC(at91_pm_suspend_in_sram)
137
138 ENTRY(at91_backup_mode)
139         /* Switch the master clock source to slow clock. */
140         ldr     pmc, .pmc_base
141         ldr     tmp1, [pmc, #AT91_PMC_MCKR]
142         bic     tmp1, tmp1, #AT91_PMC_CSS
143         str     tmp1, [pmc, #AT91_PMC_MCKR]
144
145         wait_mckrdy
146
147         /*BUMEN*/
148         ldr     r0, .sfr
149         mov     tmp1, #0x1
150         str     tmp1, [r0, #0x10]
151
152         /* Shutdown */
153         ldr     r0, .shdwc
154         mov     tmp1, #0xA5000000
155         add     tmp1, tmp1, #0x1
156         str     tmp1, [r0, #0]
157 ENDPROC(at91_backup_mode)
158
159 .macro at91_pm_ulp0_mode
160         ldr     pmc, .pmc_base
161
162         /* Turn off the crystal oscillator */
163         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
164         bic     tmp1, tmp1, #AT91_PMC_MOSCEN
165         orr     tmp1, tmp1, #AT91_PMC_KEY
166         str     tmp1, [pmc, #AT91_CKGR_MOR]
167
168         /* Save RC oscillator state */
169         ldr     tmp1, [pmc, #AT91_PMC_SR]
170         str     tmp1, .saved_osc_status
171         tst     tmp1, #AT91_PMC_MOSCRCS
172         bne     1f
173
174         /* Turn off RC oscillator */
175         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
176         bic     tmp1, tmp1, #AT91_PMC_MOSCRCEN
177         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
178         orr     tmp1, tmp1, #AT91_PMC_KEY
179         str     tmp1, [pmc, #AT91_CKGR_MOR]
180
181         /* Wait main RC disabled done */
182 2:      ldr     tmp1, [pmc, #AT91_PMC_SR]
183         tst     tmp1, #AT91_PMC_MOSCRCS
184         bne     2b
185
186         /* Wait for interrupt */
187 1:      at91_cpu_idle
188
189         /* Restore RC oscillator state */
190         ldr     tmp1, .saved_osc_status
191         tst     tmp1, #AT91_PMC_MOSCRCS
192         beq     4f
193
194         /* Turn on RC oscillator */
195         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
196         orr     tmp1, tmp1, #AT91_PMC_MOSCRCEN
197         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
198         orr     tmp1, tmp1, #AT91_PMC_KEY
199         str     tmp1, [pmc, #AT91_CKGR_MOR]
200
201         /* Wait main RC stabilization */
202 3:      ldr     tmp1, [pmc, #AT91_PMC_SR]
203         tst     tmp1, #AT91_PMC_MOSCRCS
204         beq     3b
205
206         /* Turn on the crystal oscillator */
207 4:      ldr     tmp1, [pmc, #AT91_CKGR_MOR]
208         orr     tmp1, tmp1, #AT91_PMC_MOSCEN
209         orr     tmp1, tmp1, #AT91_PMC_KEY
210         str     tmp1, [pmc, #AT91_CKGR_MOR]
211
212         wait_moscrdy
213 .endm
214
215 /**
216  * Note: This procedure only applies on the platform which uses
217  * the external crystal oscillator as a main clock source.
218  */
219 .macro at91_pm_ulp1_mode
220         ldr     pmc, .pmc_base
221
222         /* Save RC oscillator state and check if it is enabled. */
223         ldr     tmp1, [pmc, #AT91_PMC_SR]
224         str     tmp1, .saved_osc_status
225         tst     tmp1, #AT91_PMC_MOSCRCS
226         bne     2f
227
228         /* Enable RC oscillator */
229         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
230         orr     tmp1, tmp1, #AT91_PMC_MOSCRCEN
231         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
232         orr     tmp1, tmp1, #AT91_PMC_KEY
233         str     tmp1, [pmc, #AT91_CKGR_MOR]
234
235         /* Wait main RC stabilization */
236 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]
237         tst     tmp1, #AT91_PMC_MOSCRCS
238         beq     1b
239
240         /* Switch the main clock source to 12-MHz RC oscillator */
241 2:      ldr     tmp1, [pmc, #AT91_CKGR_MOR]
242         bic     tmp1, tmp1, #AT91_PMC_MOSCSEL
243         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
244         orr     tmp1, tmp1, #AT91_PMC_KEY
245         str     tmp1, [pmc, #AT91_CKGR_MOR]
246
247         wait_moscsels
248
249         /* Disable the crystal oscillator */
250         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
251         bic     tmp1, tmp1, #AT91_PMC_MOSCEN
252         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
253         orr     tmp1, tmp1, #AT91_PMC_KEY
254         str     tmp1, [pmc, #AT91_CKGR_MOR]
255
256         /* Switch the master clock source to main clock */
257         ldr     tmp1, [pmc, #AT91_PMC_MCKR]
258         bic     tmp1, tmp1, #AT91_PMC_CSS
259         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN
260         str     tmp1, [pmc, #AT91_PMC_MCKR]
261
262         wait_mckrdy
263
264         /* Enter the ULP1 mode by set WAITMODE bit in CKGR_MOR */
265         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
266         orr     tmp1, tmp1, #AT91_PMC_WAITMODE
267         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
268         orr     tmp1, tmp1, #AT91_PMC_KEY
269         str     tmp1, [pmc, #AT91_CKGR_MOR]
270
271         /* Quirk for SAM9X60's PMC */
272         nop
273         nop
274
275         wait_mckrdy
276
277         /* Enable the crystal oscillator */
278         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
279         orr     tmp1, tmp1, #AT91_PMC_MOSCEN
280         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
281         orr     tmp1, tmp1, #AT91_PMC_KEY
282         str     tmp1, [pmc, #AT91_CKGR_MOR]
283
284         wait_moscrdy
285
286         /* Switch the master clock source to slow clock */
287         ldr     tmp1, [pmc, #AT91_PMC_MCKR]
288         bic     tmp1, tmp1, #AT91_PMC_CSS
289         str     tmp1, [pmc, #AT91_PMC_MCKR]
290
291         wait_mckrdy
292
293         /* Switch main clock source to crystal oscillator */
294         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
295         orr     tmp1, tmp1, #AT91_PMC_MOSCSEL
296         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
297         orr     tmp1, tmp1, #AT91_PMC_KEY
298         str     tmp1, [pmc, #AT91_CKGR_MOR]
299
300         wait_moscsels
301
302         /* Switch the master clock source to main clock */
303         ldr     tmp1, [pmc, #AT91_PMC_MCKR]
304         bic     tmp1, tmp1, #AT91_PMC_CSS
305         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN
306         str     tmp1, [pmc, #AT91_PMC_MCKR]
307
308         wait_mckrdy
309
310         /* Restore RC oscillator state */
311         ldr     tmp1, .saved_osc_status
312         tst     tmp1, #AT91_PMC_MOSCRCS
313         bne     3f
314
315         /* Disable RC oscillator */
316         ldr     tmp1, [pmc, #AT91_CKGR_MOR]
317         bic     tmp1, tmp1, #AT91_PMC_MOSCRCEN
318         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK
319         orr     tmp1, tmp1, #AT91_PMC_KEY
320         str     tmp1, [pmc, #AT91_CKGR_MOR]
321
322         /* Wait RC oscillator disable done */
323 4:      ldr     tmp1, [pmc, #AT91_PMC_SR]
324         tst     tmp1, #AT91_PMC_MOSCRCS
325         bne     4b
326
327 3:
328 .endm
329
330 ENTRY(at91_ulp_mode)
331         ldr     pmc, .pmc_base
332
333         /* Save Master clock setting */
334         ldr     tmp1, [pmc, #AT91_PMC_MCKR]
335         str     tmp1, .saved_mckr
336
337         /*
338          * Set the Master clock source to slow clock
339          */
340         bic     tmp1, tmp1, #AT91_PMC_CSS
341         str     tmp1, [pmc, #AT91_PMC_MCKR]
342
343         wait_mckrdy
344
345         ldr     r0, .pm_mode
346         cmp     r0, #AT91_PM_ULP1
347         beq     ulp1_mode
348
349         at91_pm_ulp0_mode
350         b       ulp_exit
351
352 ulp1_mode:
353         at91_pm_ulp1_mode
354         b       ulp_exit
355
356 ulp_exit:
357         ldr     pmc, .pmc_base
358
359         /*
360          * Restore master clock setting
361          */
362         ldr     tmp1, .saved_mckr
363         str     tmp1, [pmc, #AT91_PMC_MCKR]
364
365         wait_mckrdy
366
367         mov     pc, lr
368 ENDPROC(at91_ulp_mode)
369
370 /*
371  * void at91_sramc_self_refresh(unsigned int is_active)
372  *
373  * @input param:
374  *      @r0: 1 - active self-refresh mode
375  *           0 - exit self-refresh mode
376  * register usage:
377  *      @r1: memory type
378  *      @r2: base address of the sram controller
379  */
380
381 ENTRY(at91_sramc_self_refresh)
382         ldr     r1, .memtype
383         ldr     r2, .sramc_base
384
385         cmp     r1, #AT91_MEMCTRL_MC
386         bne     ddrc_sf
387
388         /*
389          * at91rm9200 Memory controller
390          */
391
392          /*
393           * For exiting the self-refresh mode, do nothing,
394           * automatically exit the self-refresh mode.
395           */
396         tst     r0, #SRAMC_SELF_FRESH_ACTIVE
397         beq     exit_sramc_sf
398
399         /* Active SDRAM self-refresh mode */
400         mov     r3, #1
401         str     r3, [r2, #AT91_MC_SDRAMC_SRR]
402         b       exit_sramc_sf
403
404 ddrc_sf:
405         cmp     r1, #AT91_MEMCTRL_DDRSDR
406         bne     sdramc_sf
407
408         /*
409          * DDR Memory controller
410          */
411         tst     r0, #SRAMC_SELF_FRESH_ACTIVE
412         beq     ddrc_exit_sf
413
414         /* LPDDR1 --> force DDR2 mode during self-refresh */
415         ldr     r3, [r2, #AT91_DDRSDRC_MDR]
416         str     r3, .saved_sam9_mdr
417         bic     r3, r3, #~AT91_DDRSDRC_MD
418         cmp     r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
419         ldreq   r3, [r2, #AT91_DDRSDRC_MDR]
420         biceq   r3, r3, #AT91_DDRSDRC_MD
421         orreq   r3, r3, #AT91_DDRSDRC_MD_DDR2
422         streq   r3, [r2, #AT91_DDRSDRC_MDR]
423
424         /* Active DDRC self-refresh mode */
425         ldr     r3, [r2, #AT91_DDRSDRC_LPR]
426         str     r3, .saved_sam9_lpr
427         bic     r3, r3, #AT91_DDRSDRC_LPCB
428         orr     r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
429         str     r3, [r2, #AT91_DDRSDRC_LPR]
430
431         /* If using the 2nd ddr controller */
432         ldr     r2, .sramc1_base
433         cmp     r2, #0
434         beq     no_2nd_ddrc
435
436         ldr     r3, [r2, #AT91_DDRSDRC_MDR]
437         str     r3, .saved_sam9_mdr1
438         bic     r3, r3, #~AT91_DDRSDRC_MD
439         cmp     r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
440         ldreq   r3, [r2, #AT91_DDRSDRC_MDR]
441         biceq   r3, r3, #AT91_DDRSDRC_MD
442         orreq   r3, r3, #AT91_DDRSDRC_MD_DDR2
443         streq   r3, [r2, #AT91_DDRSDRC_MDR]
444
445         /* Active DDRC self-refresh mode */
446         ldr     r3, [r2, #AT91_DDRSDRC_LPR]
447         str     r3, .saved_sam9_lpr1
448         bic     r3, r3, #AT91_DDRSDRC_LPCB
449         orr     r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
450         str     r3, [r2, #AT91_DDRSDRC_LPR]
451
452 no_2nd_ddrc:
453         b       exit_sramc_sf
454
455 ddrc_exit_sf:
456         /* Restore MDR in case of LPDDR1 */
457         ldr     r3, .saved_sam9_mdr
458         str     r3, [r2, #AT91_DDRSDRC_MDR]
459         /* Restore LPR on AT91 with DDRAM */
460         ldr     r3, .saved_sam9_lpr
461         str     r3, [r2, #AT91_DDRSDRC_LPR]
462
463         /* If using the 2nd ddr controller */
464         ldr     r2, .sramc1_base
465         cmp     r2, #0
466         ldrne   r3, .saved_sam9_mdr1
467         strne   r3, [r2, #AT91_DDRSDRC_MDR]
468         ldrne   r3, .saved_sam9_lpr1
469         strne   r3, [r2, #AT91_DDRSDRC_LPR]
470
471         b       exit_sramc_sf
472
473         /*
474          * SDRAMC Memory controller
475          */
476 sdramc_sf:
477         tst     r0, #SRAMC_SELF_FRESH_ACTIVE
478         beq     sdramc_exit_sf
479
480         /* Active SDRAMC self-refresh mode */
481         ldr     r3, [r2, #AT91_SDRAMC_LPR]
482         str     r3, .saved_sam9_lpr
483         bic     r3, r3, #AT91_SDRAMC_LPCB
484         orr     r3, r3, #AT91_SDRAMC_LPCB_SELF_REFRESH
485         str     r3, [r2, #AT91_SDRAMC_LPR]
486
487 sdramc_exit_sf:
488         ldr     r3, .saved_sam9_lpr
489         str     r3, [r2, #AT91_SDRAMC_LPR]
490
491 exit_sramc_sf:
492         mov     pc, lr
493 ENDPROC(at91_sramc_self_refresh)
494
495 .pmc_base:
496         .word 0
497 .sramc_base:
498         .word 0
499 .sramc1_base:
500         .word 0
501 .shdwc:
502         .word 0
503 .sfr:
504         .word 0
505 .memtype:
506         .word 0
507 .pm_mode:
508         .word 0
509 .saved_mckr:
510         .word 0
511 .saved_sam9_lpr:
512         .word 0
513 .saved_sam9_lpr1:
514         .word 0
515 .saved_sam9_mdr:
516         .word 0
517 .saved_sam9_mdr1:
518         .word 0
519 .saved_osc_status:
520         .word 0
521
522 ENTRY(at91_pm_suspend_in_sram_sz)
523         .word .-at91_pm_suspend_in_sram