xref: /openbmc/linux/arch/arm/mach-at91/pm_suspend.S (revision 2455f0e1)
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#ifdef CONFIG_CPU_V7
16.arch armv7-a
17#endif
18
19#define	SRAMC_SELF_FRESH_ACTIVE		0x01
20#define	SRAMC_SELF_FRESH_EXIT		0x00
21
22pmc	.req	r0
23tmp1	.req	r4
24tmp2	.req	r5
25tmp3	.req	r6
26
27/*
28 * Wait until master clock is ready (after switching master clock source)
29 *
30 * @r_mckid:	register holding master clock identifier
31 *
32 * Side effects: overwrites r7, r8
33 */
34	.macro wait_mckrdy r_mckid
35#ifdef CONFIG_SOC_SAMA7
36	cmp	\r_mckid, #0
37	beq	1f
38	mov	r7, #AT91_PMC_MCKXRDY
39	b	2f
40#endif
411:	mov	r7, #AT91_PMC_MCKRDY
422:	ldr	r8, [pmc, #AT91_PMC_SR]
43	and	r8, r7
44	cmp	r8, r7
45	bne	2b
46	.endm
47
48/*
49 * Wait until master oscillator has stabilized.
50 *
51 * Side effects: overwrites r7
52 */
53	.macro wait_moscrdy
541:	ldr	r7, [pmc, #AT91_PMC_SR]
55	tst	r7, #AT91_PMC_MOSCS
56	beq	1b
57	.endm
58
59/*
60 * Wait for main oscillator selection is done
61 *
62 * Side effects: overwrites r7
63 */
64	.macro wait_moscsels
651:	ldr	r7, [pmc, #AT91_PMC_SR]
66	tst	r7, #AT91_PMC_MOSCSELS
67	beq	1b
68	.endm
69
70/*
71 * Put the processor to enter the idle state
72 *
73 * Side effects: overwrites r7
74 */
75	.macro at91_cpu_idle
76
77#if defined(CONFIG_CPU_V7)
78	mov	r7, #AT91_PMC_PCK
79	str	r7, [pmc, #AT91_PMC_SCDR]
80
81	dsb
82
83	wfi		@ Wait For Interrupt
84#else
85	mcr	p15, 0, tmp1, c7, c0, 4
86#endif
87
88	.endm
89
90/**
91 * Set state for 2.5V low power regulator
92 * @ena: 0 - disable regulator
93 *	 1 - enable regulator
94 *
95 * Side effects: overwrites r7, r8, r9, r10
96 */
97	.macro at91_2_5V_reg_set_low_power ena
98#ifdef CONFIG_SOC_SAMA7
99	ldr	r7, .sfrbu
100	mov	r8, #\ena
101	ldr	r9, [r7, #AT91_SFRBU_25LDOCR]
102	orr	r9, r9, #AT91_SFRBU_25LDOCR_LP
103	cmp	r8, #1
104	beq	lp_done_\ena
105	bic	r9, r9, #AT91_SFRBU_25LDOCR_LP
106lp_done_\ena:
107	ldr	r10, =AT91_SFRBU_25LDOCR_LDOANAKEY
108	orr	r9, r9, r10
109	str	r9, [r7, #AT91_SFRBU_25LDOCR]
110#endif
111	.endm
112
113	.macro at91_backup_set_lpm reg
114#ifdef CONFIG_SOC_SAMA7
115	orr	\reg, \reg, #0x200000
116#endif
117	.endm
118
119	.text
120
121	.arm
122
123#ifdef CONFIG_SOC_SAMA7
124/**
125 * Enable self-refresh
126 *
127 * Side effects: overwrites r2, r3, tmp1, tmp2, tmp3, r7
128 */
129.macro at91_sramc_self_refresh_ena
130	ldr	r2, .sramc_base
131	ldr	r3, .sramc_phy_base
132	ldr	r7, .pm_mode
133
134	dsb
135
136	/* Disable all AXI ports. */
137	ldr	tmp1, [r2, #UDDRC_PCTRL_0]
138	bic	tmp1, tmp1, #0x1
139	str	tmp1, [r2, #UDDRC_PCTRL_0]
140
141	ldr	tmp1, [r2, #UDDRC_PCTRL_1]
142	bic	tmp1, tmp1, #0x1
143	str	tmp1, [r2, #UDDRC_PCTRL_1]
144
145	ldr	tmp1, [r2, #UDDRC_PCTRL_2]
146	bic	tmp1, tmp1, #0x1
147	str	tmp1, [r2, #UDDRC_PCTRL_2]
148
149	ldr	tmp1, [r2, #UDDRC_PCTRL_3]
150	bic	tmp1, tmp1, #0x1
151	str	tmp1, [r2, #UDDRC_PCTRL_3]
152
153	ldr	tmp1, [r2, #UDDRC_PCTRL_4]
154	bic	tmp1, tmp1, #0x1
155	str	tmp1, [r2, #UDDRC_PCTRL_4]
156
157sr_ena_1:
158	/* Wait for all ports to disable. */
159	ldr	tmp1, [r2, #UDDRC_PSTAT]
160	ldr	tmp2, =UDDRC_PSTAT_ALL_PORTS
161	tst	tmp1, tmp2
162	bne	sr_ena_1
163
164	/* Switch to self-refresh. */
165	ldr	tmp1, [r2, #UDDRC_PWRCTL]
166	orr	tmp1, tmp1, #UDDRC_PWRCTL_SELFREF_SW
167	str	tmp1, [r2, #UDDRC_PWRCTL]
168
169sr_ena_2:
170	/* Wait for self-refresh enter. */
171	ldr	tmp1, [r2, #UDDRC_STAT]
172	bic	tmp1, tmp1, #~UDDRC_STAT_SELFREF_TYPE_MSK
173	cmp	tmp1, #UDDRC_STAT_SELFREF_TYPE_SW
174	bne	sr_ena_2
175
176	/* Disable DX DLLs for non-backup modes. */
177	cmp	r7, #AT91_PM_BACKUP
178	beq	sr_ena_3
179
180	/* Do not soft reset the AC DLL. */
181	ldr	tmp1, [r3, DDR3PHY_ACDLLCR]
182	bic	tmp1, tmp1, DDR3PHY_ACDLLCR_DLLSRST
183	str	tmp1, [r3, DDR3PHY_ACDLLCR]
184
185	/* Disable DX DLLs. */
186	ldr	tmp1, [r3, #DDR3PHY_DX0DLLCR]
187	orr	tmp1, tmp1, #DDR3PHY_DXDLLCR_DLLDIS
188	str	tmp1, [r3, #DDR3PHY_DX0DLLCR]
189
190	ldr	tmp1, [r3, #DDR3PHY_DX1DLLCR]
191	orr	tmp1, tmp1, #DDR3PHY_DXDLLCR_DLLDIS
192	str	tmp1, [r3, #DDR3PHY_DX1DLLCR]
193
194sr_ena_3:
195	/* Power down DDR PHY data receivers. */
196	ldr	tmp1, [r3, #DDR3PHY_DXCCR]
197	orr	tmp1, tmp1, #DDR3PHY_DXCCR_DXPDR
198	str	tmp1, [r3, #DDR3PHY_DXCCR]
199
200	/* Power down ADDR/CMD IO. */
201	ldr	tmp1, [r3, #DDR3PHY_ACIOCR]
202	orr	tmp1, tmp1, #DDR3PHY_ACIORC_ACPDD
203	orr	tmp1, tmp1, #DDR3PHY_ACIOCR_CKPDD_CK0
204	orr	tmp1, tmp1, #DDR3PHY_ACIOCR_CSPDD_CS0
205	str	tmp1, [r3, #DDR3PHY_ACIOCR]
206
207	/* Power down ODT. */
208	ldr	tmp1, [r3, #DDR3PHY_DSGCR]
209	orr	tmp1, tmp1, #DDR3PHY_DSGCR_ODTPDD_ODT0
210	str	tmp1, [r3, #DDR3PHY_DSGCR]
211.endm
212
213/**
214 * Disable self-refresh
215 *
216 * Side effects: overwrites r2, r3, tmp1, tmp2, tmp3
217 */
218.macro at91_sramc_self_refresh_dis
219	ldr	r2, .sramc_base
220	ldr	r3, .sramc_phy_base
221
222	/* Power up DDR PHY data receivers. */
223	ldr	tmp1, [r3, #DDR3PHY_DXCCR]
224	bic	tmp1, tmp1, #DDR3PHY_DXCCR_DXPDR
225	str	tmp1, [r3, #DDR3PHY_DXCCR]
226
227	/* Power up the output of CK and CS pins. */
228	ldr	tmp1, [r3, #DDR3PHY_ACIOCR]
229	bic	tmp1, tmp1, #DDR3PHY_ACIORC_ACPDD
230	bic	tmp1, tmp1, #DDR3PHY_ACIOCR_CKPDD_CK0
231	bic	tmp1, tmp1, #DDR3PHY_ACIOCR_CSPDD_CS0
232	str	tmp1, [r3, #DDR3PHY_ACIOCR]
233
234	/* Power up ODT. */
235	ldr	tmp1, [r3, #DDR3PHY_DSGCR]
236	bic	tmp1, tmp1, #DDR3PHY_DSGCR_ODTPDD_ODT0
237	str	tmp1, [r3, #DDR3PHY_DSGCR]
238
239	/* Enable DX DLLs. */
240	ldr	tmp1, [r3, #DDR3PHY_DX0DLLCR]
241	bic	tmp1, tmp1, #DDR3PHY_DXDLLCR_DLLDIS
242	str	tmp1, [r3, #DDR3PHY_DX0DLLCR]
243
244	ldr	tmp1, [r3, #DDR3PHY_DX1DLLCR]
245	bic	tmp1, tmp1, #DDR3PHY_DXDLLCR_DLLDIS
246	str	tmp1, [r3, #DDR3PHY_DX1DLLCR]
247
248	/* Enable quasi-dynamic programming. */
249	mov	tmp1, #0
250	str	tmp1, [r2, #UDDRC_SWCTRL]
251
252	/* De-assert SDRAM initialization. */
253	ldr	tmp1, [r2, #UDDRC_DFIMISC]
254	bic	tmp1, tmp1, #UDDRC_DFIMISC_DFI_INIT_COMPLETE_EN
255	str	tmp1, [r2, #UDDRC_DFIMISC]
256
257	/* Quasi-dynamic programming done. */
258	mov	tmp1, #UDDRC_SWCTRL_SW_DONE
259	str	tmp1, [r2, #UDDRC_SWCTRL]
260
261sr_dis_1:
262	ldr	tmp1, [r2, #UDDRC_SWSTAT]
263	tst	tmp1, #UDDRC_SWSTAT_SW_DONE_ACK
264	beq	sr_dis_1
265
266	/* DLL soft-reset + DLL lock wait + ITM reset */
267	mov	tmp1, #(DDR3PHY_PIR_INIT | DDR3PHY_PIR_DLLSRST | \
268			DDR3PHY_PIR_DLLLOCK | DDR3PHY_PIR_ITMSRST)
269	str	tmp1, [r3, #DDR3PHY_PIR]
270
271sr_dis_4:
272	/* Wait for it. */
273	ldr	tmp1, [r3, #DDR3PHY_PGSR]
274	tst	tmp1, #DDR3PHY_PGSR_IDONE
275	beq	sr_dis_4
276
277	/* Enable quasi-dynamic programming. */
278	mov	tmp1, #0
279	str	tmp1, [r2, #UDDRC_SWCTRL]
280
281	/* Assert PHY init complete enable signal. */
282	ldr	tmp1, [r2, #UDDRC_DFIMISC]
283	orr	tmp1, tmp1, #UDDRC_DFIMISC_DFI_INIT_COMPLETE_EN
284	str	tmp1, [r2, #UDDRC_DFIMISC]
285
286	/* Programming is done. Set sw_done. */
287	mov	tmp1, #UDDRC_SWCTRL_SW_DONE
288	str	tmp1, [r2, #UDDRC_SWCTRL]
289
290sr_dis_5:
291	/* Wait for it. */
292	ldr	tmp1, [r2, #UDDRC_SWSTAT]
293	tst	tmp1, #UDDRC_SWSTAT_SW_DONE_ACK
294	beq	sr_dis_5
295
296	/* Trigger self-refresh exit. */
297	ldr	tmp1, [r2, #UDDRC_PWRCTL]
298	bic	tmp1, tmp1, #UDDRC_PWRCTL_SELFREF_SW
299	str	tmp1, [r2, #UDDRC_PWRCTL]
300
301sr_dis_6:
302	/* Wait for self-refresh exit done. */
303	ldr	tmp1, [r2, #UDDRC_STAT]
304	bic	tmp1, tmp1, #~UDDRC_STAT_OPMODE_MSK
305	cmp	tmp1, #UDDRC_STAT_OPMODE_NORMAL
306	bne	sr_dis_6
307
308	/* Enable all AXI ports. */
309	ldr	tmp1, [r2, #UDDRC_PCTRL_0]
310	orr	tmp1, tmp1, #0x1
311	str	tmp1, [r2, #UDDRC_PCTRL_0]
312
313	ldr	tmp1, [r2, #UDDRC_PCTRL_1]
314	orr	tmp1, tmp1, #0x1
315	str	tmp1, [r2, #UDDRC_PCTRL_1]
316
317	ldr	tmp1, [r2, #UDDRC_PCTRL_2]
318	orr	tmp1, tmp1, #0x1
319	str	tmp1, [r2, #UDDRC_PCTRL_2]
320
321	ldr	tmp1, [r2, #UDDRC_PCTRL_3]
322	orr	tmp1, tmp1, #0x1
323	str	tmp1, [r2, #UDDRC_PCTRL_3]
324
325	ldr	tmp1, [r2, #UDDRC_PCTRL_4]
326	orr	tmp1, tmp1, #0x1
327	str	tmp1, [r2, #UDDRC_PCTRL_4]
328
329	dsb
330.endm
331#else
332/**
333 * Enable self-refresh
334 *
335 * register usage:
336 * 	@r1: memory type
337 *	@r2: base address of the sram controller
338 *	@r3: temporary
339 */
340.macro at91_sramc_self_refresh_ena
341	ldr	r1, .memtype
342	ldr	r2, .sramc_base
343
344	cmp	r1, #AT91_MEMCTRL_MC
345	bne	sr_ena_ddrc_sf
346
347	/* Active SDRAM self-refresh mode */
348	mov	r3, #1
349	str	r3, [r2, #AT91_MC_SDRAMC_SRR]
350	b	sr_ena_exit
351
352sr_ena_ddrc_sf:
353	cmp	r1, #AT91_MEMCTRL_DDRSDR
354	bne	sr_ena_sdramc_sf
355
356	/*
357	 * DDR Memory controller
358	 */
359
360	/* LPDDR1 --> force DDR2 mode during self-refresh */
361	ldr	r3, [r2, #AT91_DDRSDRC_MDR]
362	str	r3, .saved_sam9_mdr
363	bic	r3, r3, #~AT91_DDRSDRC_MD
364	cmp	r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
365	ldreq	r3, [r2, #AT91_DDRSDRC_MDR]
366	biceq	r3, r3, #AT91_DDRSDRC_MD
367	orreq	r3, r3, #AT91_DDRSDRC_MD_DDR2
368	streq	r3, [r2, #AT91_DDRSDRC_MDR]
369
370	/* Active DDRC self-refresh mode */
371	ldr	r3, [r2, #AT91_DDRSDRC_LPR]
372	str	r3, .saved_sam9_lpr
373	bic	r3, r3, #AT91_DDRSDRC_LPCB
374	orr	r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
375	str	r3, [r2, #AT91_DDRSDRC_LPR]
376
377	/* If using the 2nd ddr controller */
378	ldr	r2, .sramc1_base
379	cmp	r2, #0
380	beq	sr_ena_no_2nd_ddrc
381
382	ldr	r3, [r2, #AT91_DDRSDRC_MDR]
383	str	r3, .saved_sam9_mdr1
384	bic	r3, r3, #~AT91_DDRSDRC_MD
385	cmp	r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
386	ldreq	r3, [r2, #AT91_DDRSDRC_MDR]
387	biceq	r3, r3, #AT91_DDRSDRC_MD
388	orreq	r3, r3, #AT91_DDRSDRC_MD_DDR2
389	streq	r3, [r2, #AT91_DDRSDRC_MDR]
390
391	/* Active DDRC self-refresh mode */
392	ldr	r3, [r2, #AT91_DDRSDRC_LPR]
393	str	r3, .saved_sam9_lpr1
394	bic	r3, r3, #AT91_DDRSDRC_LPCB
395	orr	r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
396	str	r3, [r2, #AT91_DDRSDRC_LPR]
397
398sr_ena_no_2nd_ddrc:
399	b	sr_ena_exit
400
401	/*
402	 * SDRAMC Memory controller
403	 */
404sr_ena_sdramc_sf:
405	/* Active SDRAMC self-refresh mode */
406	ldr	r3, [r2, #AT91_SDRAMC_LPR]
407	str	r3, .saved_sam9_lpr
408	bic	r3, r3, #AT91_SDRAMC_LPCB
409	orr	r3, r3, #AT91_SDRAMC_LPCB_SELF_REFRESH
410	str	r3, [r2, #AT91_SDRAMC_LPR]
411
412	ldr	r3, .saved_sam9_lpr
413	str	r3, [r2, #AT91_SDRAMC_LPR]
414
415sr_ena_exit:
416.endm
417
418/**
419 * Disable self-refresh
420 *
421 * register usage:
422 * 	@r1: memory type
423 *	@r2: base address of the sram controller
424 *	@r3: temporary
425 */
426.macro at91_sramc_self_refresh_dis
427	ldr	r1, .memtype
428	ldr	r2, .sramc_base
429
430	cmp	r1, #AT91_MEMCTRL_MC
431	bne	sr_dis_ddrc_exit_sf
432
433	/*
434	 * at91rm9200 Memory controller
435	 */
436
437	 /*
438	  * For exiting the self-refresh mode, do nothing,
439	  * automatically exit the self-refresh mode.
440	  */
441	b	sr_dis_exit
442
443sr_dis_ddrc_exit_sf:
444	cmp	r1, #AT91_MEMCTRL_DDRSDR
445	bne	sdramc_exit_sf
446
447	/* DDR Memory controller */
448
449	/* Restore MDR in case of LPDDR1 */
450	ldr	r3, .saved_sam9_mdr
451	str	r3, [r2, #AT91_DDRSDRC_MDR]
452	/* Restore LPR on AT91 with DDRAM */
453	ldr	r3, .saved_sam9_lpr
454	str	r3, [r2, #AT91_DDRSDRC_LPR]
455
456	/* If using the 2nd ddr controller */
457	ldr	r2, .sramc1_base
458	cmp	r2, #0
459	ldrne	r3, .saved_sam9_mdr1
460	strne	r3, [r2, #AT91_DDRSDRC_MDR]
461	ldrne	r3, .saved_sam9_lpr1
462	strne	r3, [r2, #AT91_DDRSDRC_LPR]
463
464	b	sr_dis_exit
465
466sdramc_exit_sf:
467	/* SDRAMC Memory controller */
468	ldr	r3, .saved_sam9_lpr
469	str	r3, [r2, #AT91_SDRAMC_LPR]
470
471sr_dis_exit:
472.endm
473#endif
474
475.macro at91_pm_ulp0_mode
476	ldr	pmc, .pmc_base
477	ldr	tmp2, .pm_mode
478	ldr	tmp3, .mckr_offset
479
480	/* Check if ULP0 fast variant has been requested. */
481	cmp	tmp2, #AT91_PM_ULP0_FAST
482	bne	0f
483
484	/* Set highest prescaler for power saving */
485	ldr	tmp1, [pmc, tmp3]
486	bic	tmp1, tmp1, #AT91_PMC_PRES
487	orr	tmp1, tmp1, #AT91_PMC_PRES_64
488	str	tmp1, [pmc, tmp3]
489
490	mov	tmp3, #0
491	wait_mckrdy tmp3
492	b	1f
493
4940:
495	/* Turn off the crystal oscillator */
496	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
497	bic	tmp1, tmp1, #AT91_PMC_MOSCEN
498	orr	tmp1, tmp1, #AT91_PMC_KEY
499	str	tmp1, [pmc, #AT91_CKGR_MOR]
500
501	/* Save RC oscillator state */
502	ldr	tmp1, [pmc, #AT91_PMC_SR]
503	str	tmp1, .saved_osc_status
504	tst	tmp1, #AT91_PMC_MOSCRCS
505	bne	1f
506
507	/* Turn off RC oscillator */
508	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
509	bic	tmp1, tmp1, #AT91_PMC_MOSCRCEN
510	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
511	orr	tmp1, tmp1, #AT91_PMC_KEY
512	str	tmp1, [pmc, #AT91_CKGR_MOR]
513
514	/* Wait main RC disabled done */
5152:	ldr	tmp1, [pmc, #AT91_PMC_SR]
516	tst	tmp1, #AT91_PMC_MOSCRCS
517	bne	2b
518
519	/* Wait for interrupt */
5201:	at91_cpu_idle
521
522	/* Check if ULP0 fast variant has been requested. */
523	cmp	tmp2, #AT91_PM_ULP0_FAST
524	bne	5f
525
526	/* Set lowest prescaler for fast resume. */
527	ldr	tmp3, .mckr_offset
528	ldr	tmp1, [pmc, tmp3]
529	bic	tmp1, tmp1, #AT91_PMC_PRES
530	str	tmp1, [pmc, tmp3]
531
532	mov	tmp3, #0
533	wait_mckrdy tmp3
534	b	6f
535
5365:	/* Restore RC oscillator state */
537	ldr	tmp1, .saved_osc_status
538	tst	tmp1, #AT91_PMC_MOSCRCS
539	beq	4f
540
541	/* Turn on RC oscillator */
542	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
543	orr	tmp1, tmp1, #AT91_PMC_MOSCRCEN
544	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
545	orr	tmp1, tmp1, #AT91_PMC_KEY
546	str	tmp1, [pmc, #AT91_CKGR_MOR]
547
548	/* Wait main RC stabilization */
5493:	ldr	tmp1, [pmc, #AT91_PMC_SR]
550	tst	tmp1, #AT91_PMC_MOSCRCS
551	beq	3b
552
553	/* Turn on the crystal oscillator */
5544:	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
555	orr	tmp1, tmp1, #AT91_PMC_MOSCEN
556	orr	tmp1, tmp1, #AT91_PMC_KEY
557	str	tmp1, [pmc, #AT91_CKGR_MOR]
558
559	wait_moscrdy
5606:
561.endm
562
563/**
564 * Note: This procedure only applies on the platform which uses
565 * the external crystal oscillator as a main clock source.
566 */
567.macro at91_pm_ulp1_mode
568	ldr	pmc, .pmc_base
569	ldr	tmp2, .mckr_offset
570	mov	tmp3, #0
571
572	/* Save RC oscillator state and check if it is enabled. */
573	ldr	tmp1, [pmc, #AT91_PMC_SR]
574	str	tmp1, .saved_osc_status
575	tst	tmp1, #AT91_PMC_MOSCRCS
576	bne	2f
577
578	/* Enable RC oscillator */
579	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
580	orr	tmp1, tmp1, #AT91_PMC_MOSCRCEN
581	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
582	orr	tmp1, tmp1, #AT91_PMC_KEY
583	str	tmp1, [pmc, #AT91_CKGR_MOR]
584
585	/* Wait main RC stabilization */
5861:	ldr	tmp1, [pmc, #AT91_PMC_SR]
587	tst	tmp1, #AT91_PMC_MOSCRCS
588	beq	1b
589
590	/* Switch the main clock source to 12-MHz RC oscillator */
5912:	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
592	bic	tmp1, tmp1, #AT91_PMC_MOSCSEL
593	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
594	orr	tmp1, tmp1, #AT91_PMC_KEY
595	str	tmp1, [pmc, #AT91_CKGR_MOR]
596
597	wait_moscsels
598
599	/* Disable the crystal oscillator */
600	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
601	bic	tmp1, tmp1, #AT91_PMC_MOSCEN
602	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
603	orr	tmp1, tmp1, #AT91_PMC_KEY
604	str	tmp1, [pmc, #AT91_CKGR_MOR]
605
606	/* Switch the master clock source to main clock */
607	ldr	tmp1, [pmc, tmp2]
608	bic	tmp1, tmp1, #AT91_PMC_CSS
609	orr	tmp1, tmp1, #AT91_PMC_CSS_MAIN
610	str	tmp1, [pmc, tmp2]
611
612	wait_mckrdy tmp3
613
614	/* Enter the ULP1 mode by set WAITMODE bit in CKGR_MOR */
615	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
616	orr	tmp1, tmp1, #AT91_PMC_WAITMODE
617	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
618	orr	tmp1, tmp1, #AT91_PMC_KEY
619	str	tmp1, [pmc, #AT91_CKGR_MOR]
620
621	/* Quirk for SAM9X60's PMC */
622	nop
623	nop
624
625	wait_mckrdy tmp3
626
627	/* Enable the crystal oscillator */
628	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
629	orr	tmp1, tmp1, #AT91_PMC_MOSCEN
630	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
631	orr	tmp1, tmp1, #AT91_PMC_KEY
632	str	tmp1, [pmc, #AT91_CKGR_MOR]
633
634	wait_moscrdy
635
636	/* Switch the master clock source to slow clock */
637	ldr	tmp1, [pmc, tmp2]
638	bic	tmp1, tmp1, #AT91_PMC_CSS
639	str	tmp1, [pmc, tmp2]
640
641	wait_mckrdy tmp3
642
643	/* Switch main clock source to crystal oscillator */
644	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
645	orr	tmp1, tmp1, #AT91_PMC_MOSCSEL
646	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
647	orr	tmp1, tmp1, #AT91_PMC_KEY
648	str	tmp1, [pmc, #AT91_CKGR_MOR]
649
650	wait_moscsels
651
652	/* Switch the master clock source to main clock */
653	ldr	tmp1, [pmc, tmp2]
654	bic	tmp1, tmp1, #AT91_PMC_CSS
655	orr	tmp1, tmp1, #AT91_PMC_CSS_MAIN
656	str	tmp1, [pmc, tmp2]
657
658	wait_mckrdy tmp3
659
660	/* Restore RC oscillator state */
661	ldr	tmp1, .saved_osc_status
662	tst	tmp1, #AT91_PMC_MOSCRCS
663	bne	3f
664
665	/* Disable RC oscillator */
666	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
667	bic	tmp1, tmp1, #AT91_PMC_MOSCRCEN
668	bic	tmp1, tmp1, #AT91_PMC_KEY_MASK
669	orr	tmp1, tmp1, #AT91_PMC_KEY
670	str	tmp1, [pmc, #AT91_CKGR_MOR]
671
672	/* Wait RC oscillator disable done */
6734:	ldr	tmp1, [pmc, #AT91_PMC_SR]
674	tst	tmp1, #AT91_PMC_MOSCRCS
675	bne	4b
676
6773:
678.endm
679
680.macro at91_plla_disable
681	/* Save PLLA setting and disable it */
682	ldr	tmp1, .pmc_version
683	cmp	tmp1, #AT91_PMC_V1
684	beq	1f
685
686#ifdef CONFIG_HAVE_AT91_SAM9X60_PLL
687	/* Save PLLA settings. */
688	ldr	tmp2, [pmc, #AT91_PMC_PLL_UPDT]
689	bic	tmp2, tmp2, #AT91_PMC_PLL_UPDT_ID
690	str	tmp2, [pmc, #AT91_PMC_PLL_UPDT]
691
692	/* save div. */
693	mov	tmp1, #0
694	ldr	tmp2, [pmc, #AT91_PMC_PLL_CTRL0]
695	bic	tmp2, tmp2, #0xffffff00
696	orr	tmp1, tmp1, tmp2
697
698	/* save mul. */
699	ldr	tmp2, [pmc, #AT91_PMC_PLL_CTRL1]
700	bic	tmp2, tmp2, #0xffffff
701	orr	tmp1, tmp1, tmp2
702	str	tmp1, .saved_pllar
703
704	/* step 2. */
705	ldr	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
706	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
707	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
708	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
709
710	/* step 3. */
711	ldr	tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
712	bic	tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLLCK
713	orr	tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLL
714	str	tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
715
716	/* step 4. */
717	ldr	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
718	orr	tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
719	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
720	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
721
722	/* step 5. */
723	ldr	tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
724	bic	tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLL
725	str	tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
726
727	/* step 7. */
728	ldr	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
729	orr	tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
730	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
731	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
732
733	b	2f
734#endif
735
7361:	/* Save PLLA setting and disable it */
737	ldr	tmp1, [pmc, #AT91_CKGR_PLLAR]
738	str	tmp1, .saved_pllar
739
740	/* Disable PLLA. */
741	mov	tmp1, #AT91_PMC_PLLCOUNT
742	orr	tmp1, tmp1, #(1 << 29)		/* bit 29 always set */
743	str	tmp1, [pmc, #AT91_CKGR_PLLAR]
7442:
745.endm
746
747.macro at91_plla_enable
748	ldr	tmp2, .saved_pllar
749	ldr	tmp3, .pmc_version
750	cmp	tmp3, #AT91_PMC_V1
751	beq	4f
752
753#ifdef CONFIG_HAVE_AT91_SAM9X60_PLL
754	/* step 1. */
755	ldr	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
756	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
757	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
758	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
759
760	/* step 2. */
761	ldr	tmp1, =AT91_PMC_PLL_ACR_DEFAULT_PLLA
762	str	tmp1, [pmc, #AT91_PMC_PLL_ACR]
763
764	/* step 3. */
765	ldr	tmp1, [pmc, #AT91_PMC_PLL_CTRL1]
766	mov	tmp3, tmp2
767	bic	tmp3, tmp3, #0xffffff
768	orr	tmp1, tmp1, tmp3
769	str	tmp1, [pmc, #AT91_PMC_PLL_CTRL1]
770
771	/* step 8. */
772	ldr	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
773	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
774	orr	tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
775	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
776
777	/* step 9. */
778	ldr	tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
779	orr	tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENLOCK
780	orr	tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLL
781	orr	tmp1, tmp1, #AT91_PMC_PLL_CTRL0_ENPLLCK
782	bic	tmp1, tmp1, #0xff
783	mov	tmp3, tmp2
784	bic	tmp3, tmp3, #0xffffff00
785	orr	tmp1, tmp1, tmp3
786	str	tmp1, [pmc, #AT91_PMC_PLL_CTRL0]
787
788	/* step 10. */
789	ldr	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
790	orr	tmp1, tmp1, #AT91_PMC_PLL_UPDT_UPDATE
791	bic	tmp1, tmp1, #AT91_PMC_PLL_UPDT_ID
792	str	tmp1, [pmc, #AT91_PMC_PLL_UPDT]
793
794	/* step 11. */
7953:	ldr	tmp1, [pmc, #AT91_PMC_PLL_ISR0]
796	tst	tmp1, #0x1
797	beq	3b
798	b	2f
799#endif
800
801	/* Restore PLLA setting */
8024:	str	tmp2, [pmc, #AT91_CKGR_PLLAR]
803
804	/* Enable PLLA. */
805	tst	tmp2, #(AT91_PMC_MUL &  0xff0000)
806	bne	1f
807	tst	tmp2, #(AT91_PMC_MUL & ~0xff0000)
808	beq	2f
809
8101:	ldr	tmp1, [pmc, #AT91_PMC_SR]
811	tst	tmp1, #AT91_PMC_LOCKA
812	beq	1b
8132:
814.endm
815
816/**
817 * at91_mckx_ps_enable:	save MCK1..4 settings and switch it to main clock
818 *
819 * Side effects: overwrites tmp1, tmp2
820 */
821.macro at91_mckx_ps_enable
822#ifdef CONFIG_SOC_SAMA7
823	ldr	pmc, .pmc_base
824
825	/* There are 4 MCKs we need to handle: MCK1..4 */
826	mov	tmp1, #1
827e_loop:	cmp	tmp1, #5
828	beq	e_done
829
830	/* Write MCK ID to retrieve the settings. */
831	str	tmp1, [pmc, #AT91_PMC_MCR_V2]
832	ldr	tmp2, [pmc, #AT91_PMC_MCR_V2]
833
834e_save_mck1:
835	cmp	tmp1, #1
836	bne	e_save_mck2
837	str	tmp2, .saved_mck1
838	b	e_ps
839
840e_save_mck2:
841	cmp	tmp1, #2
842	bne	e_save_mck3
843	str	tmp2, .saved_mck2
844	b	e_ps
845
846e_save_mck3:
847	cmp	tmp1, #3
848	bne	e_save_mck4
849	str	tmp2, .saved_mck3
850	b	e_ps
851
852e_save_mck4:
853	str	tmp2, .saved_mck4
854
855e_ps:
856	/* Use CSS=MAINCK and DIV=1. */
857	bic	tmp2, tmp2, #AT91_PMC_MCR_V2_CSS
858	bic	tmp2, tmp2, #AT91_PMC_MCR_V2_DIV
859	orr	tmp2, tmp2, #AT91_PMC_MCR_V2_CSS_MAINCK
860	orr	tmp2, tmp2, #AT91_PMC_MCR_V2_DIV1
861	str	tmp2, [pmc, #AT91_PMC_MCR_V2]
862
863	wait_mckrdy tmp1
864
865	add	tmp1, tmp1, #1
866	b	e_loop
867
868e_done:
869#endif
870.endm
871
872/**
873 * at91_mckx_ps_restore: restore MCK1..4 settings
874 *
875 * Side effects: overwrites tmp1, tmp2
876 */
877.macro at91_mckx_ps_restore
878#ifdef CONFIG_SOC_SAMA7
879	ldr	pmc, .pmc_base
880
881	/* There are 4 MCKs we need to handle: MCK1..4 */
882	mov	tmp1, #1
883r_loop:	cmp	tmp1, #5
884	beq	r_done
885
886r_save_mck1:
887	cmp	tmp1, #1
888	bne	r_save_mck2
889	ldr	tmp2, .saved_mck1
890	b	r_ps
891
892r_save_mck2:
893	cmp	tmp1, #2
894	bne	r_save_mck3
895	ldr	tmp2, .saved_mck2
896	b	r_ps
897
898r_save_mck3:
899	cmp	tmp1, #3
900	bne	r_save_mck4
901	ldr	tmp2, .saved_mck3
902	b	r_ps
903
904r_save_mck4:
905	ldr	tmp2, .saved_mck4
906
907r_ps:
908	/* Write MCK ID to retrieve the settings. */
909	str	tmp1, [pmc, #AT91_PMC_MCR_V2]
910	ldr	tmp3, [pmc, #AT91_PMC_MCR_V2]
911
912	/* We need to restore CSS and DIV. */
913	bic	tmp3, tmp3, #AT91_PMC_MCR_V2_CSS
914	bic	tmp3, tmp3, #AT91_PMC_MCR_V2_DIV
915	orr	tmp3, tmp3, tmp2
916	bic	tmp3, tmp3, #AT91_PMC_MCR_V2_ID_MSK
917	orr	tmp3, tmp3, tmp1
918	orr	tmp3, tmp3, #AT91_PMC_MCR_V2_CMD
919	str	tmp2, [pmc, #AT91_PMC_MCR_V2]
920
921	wait_mckrdy tmp1
922
923	add	tmp1, tmp1, #1
924	b	r_loop
925r_done:
926#endif
927.endm
928
929.macro at91_ulp_mode
930	at91_mckx_ps_enable
931
932	ldr	pmc, .pmc_base
933	ldr	tmp2, .mckr_offset
934	ldr	tmp3, .pm_mode
935
936	/* Save Master clock setting */
937	ldr	tmp1, [pmc, tmp2]
938	str	tmp1, .saved_mckr
939
940	/*
941	 * Set master clock source to:
942	 * - MAINCK if using ULP0 fast variant
943	 * - slow clock, otherwise
944	 */
945	bic	tmp1, tmp1, #AT91_PMC_CSS
946	cmp	tmp3, #AT91_PM_ULP0_FAST
947	bne	save_mck
948	orr	tmp1, tmp1, #AT91_PMC_CSS_MAIN
949save_mck:
950	str	tmp1, [pmc, tmp2]
951
952	mov	tmp3, #0
953	wait_mckrdy tmp3
954
955	at91_plla_disable
956
957	/* Enable low power mode for 2.5V regulator. */
958	at91_2_5V_reg_set_low_power 1
959
960	ldr	tmp3, .pm_mode
961	cmp	tmp3, #AT91_PM_ULP1
962	beq	ulp1_mode
963
964	at91_pm_ulp0_mode
965	b	ulp_exit
966
967ulp1_mode:
968	at91_pm_ulp1_mode
969	b	ulp_exit
970
971ulp_exit:
972	/* Disable low power mode for 2.5V regulator. */
973	at91_2_5V_reg_set_low_power 0
974
975	ldr	pmc, .pmc_base
976
977	at91_plla_enable
978
979	/*
980	 * Restore master clock setting
981	 */
982	ldr	tmp1, .mckr_offset
983	ldr	tmp2, .saved_mckr
984	str	tmp2, [pmc, tmp1]
985
986	mov	tmp3, #0
987	wait_mckrdy tmp3
988
989	at91_mckx_ps_restore
990.endm
991
992.macro at91_backup_mode
993	/* Switch the master clock source to slow clock. */
994	ldr	pmc, .pmc_base
995	ldr	tmp2, .mckr_offset
996	ldr	tmp1, [pmc, tmp2]
997	bic	tmp1, tmp1, #AT91_PMC_CSS
998	str	tmp1, [pmc, tmp2]
999
1000	mov	tmp3, #0
1001	wait_mckrdy tmp3
1002
1003	/*BUMEN*/
1004	ldr	r0, .sfrbu
1005	mov	tmp1, #0x1
1006	str	tmp1, [r0, #0x10]
1007
1008	/* Wait for it. */
10091:	ldr	tmp1, [r0, #0x10]
1010	tst	tmp1, #0x1
1011	beq	1b
1012
1013	/* Shutdown */
1014	ldr	r0, .shdwc
1015	mov	tmp1, #0xA5000000
1016	add	tmp1, tmp1, #0x1
1017	at91_backup_set_lpm tmp1
1018	str	tmp1, [r0, #0]
1019.endm
1020
1021/*
1022 * void at91_suspend_sram_fn(struct at91_pm_data*)
1023 * @input param:
1024 * 	@r0: base address of struct at91_pm_data
1025 */
1026/* at91_pm_suspend_in_sram must be 8-byte aligned per the requirements of fncpy() */
1027	.align 3
1028ENTRY(at91_pm_suspend_in_sram)
1029	/* Save registers on stack */
1030	stmfd	sp!, {r4 - r12, lr}
1031
1032	/* Drain write buffer */
1033	mov	tmp1, #0
1034	mcr	p15, 0, tmp1, c7, c10, 4
1035
1036	/* Flush tlb. */
1037	mov	r4, #0
1038	mcr	p15, 0, r4, c8, c7, 0
1039
1040	ldr	tmp1, [r0, #PM_DATA_PMC_MCKR_OFFSET]
1041	str	tmp1, .mckr_offset
1042	ldr	tmp1, [r0, #PM_DATA_PMC_VERSION]
1043	str	tmp1, .pmc_version
1044	ldr	tmp1, [r0, #PM_DATA_MEMCTRL]
1045	str	tmp1, .memtype
1046	ldr	tmp1, [r0, #PM_DATA_MODE]
1047	str	tmp1, .pm_mode
1048
1049	/*
1050	 * ldrne below are here to preload their address in the TLB as access
1051	 * to RAM may be limited while in self-refresh.
1052	 */
1053	ldr	tmp1, [r0, #PM_DATA_PMC]
1054	str	tmp1, .pmc_base
1055	cmp	tmp1, #0
1056	ldrne	tmp2, [tmp1, #0]
1057
1058	ldr	tmp1, [r0, #PM_DATA_RAMC0]
1059	str	tmp1, .sramc_base
1060	cmp	tmp1, #0
1061	ldrne	tmp2, [tmp1, #0]
1062
1063	ldr	tmp1, [r0, #PM_DATA_RAMC1]
1064	str	tmp1, .sramc1_base
1065	cmp	tmp1, #0
1066	ldrne	tmp2, [tmp1, #0]
1067
1068#ifndef CONFIG_SOC_SAM_V4_V5
1069	/* ldrne below are here to preload their address in the TLB */
1070	ldr	tmp1, [r0, #PM_DATA_RAMC_PHY]
1071	str	tmp1, .sramc_phy_base
1072	cmp	tmp1, #0
1073	ldrne	tmp2, [tmp1, #0]
1074
1075	ldr	tmp1, [r0, #PM_DATA_SHDWC]
1076	str	tmp1, .shdwc
1077	cmp	tmp1, #0
1078	ldrne	tmp2, [tmp1, #0]
1079
1080	ldr	tmp1, [r0, #PM_DATA_SFRBU]
1081	str	tmp1, .sfrbu
1082	cmp	tmp1, #0
1083	ldrne	tmp2, [tmp1, #0x10]
1084#endif
1085
1086	/* Active the self-refresh mode */
1087	at91_sramc_self_refresh_ena
1088
1089	ldr	r0, .pm_mode
1090	cmp	r0, #AT91_PM_STANDBY
1091	beq	standby
1092	cmp	r0, #AT91_PM_BACKUP
1093	beq	backup_mode
1094
1095	at91_ulp_mode
1096	b	exit_suspend
1097
1098standby:
1099	/* Wait for interrupt */
1100	ldr	pmc, .pmc_base
1101	at91_cpu_idle
1102	b	exit_suspend
1103
1104backup_mode:
1105	at91_backup_mode
1106
1107exit_suspend:
1108	/* Exit the self-refresh mode */
1109	at91_sramc_self_refresh_dis
1110
1111	/* Restore registers, and return */
1112	ldmfd	sp!, {r4 - r12, pc}
1113ENDPROC(at91_pm_suspend_in_sram)
1114
1115.pmc_base:
1116	.word 0
1117.sramc_base:
1118	.word 0
1119.sramc1_base:
1120	.word 0
1121.sramc_phy_base:
1122	.word 0
1123.shdwc:
1124	.word 0
1125.sfrbu:
1126	.word 0
1127.memtype:
1128	.word 0
1129.pm_mode:
1130	.word 0
1131.mckr_offset:
1132	.word 0
1133.pmc_version:
1134	.word 0
1135.saved_mckr:
1136	.word 0
1137.saved_pllar:
1138	.word 0
1139.saved_sam9_lpr:
1140	.word 0
1141.saved_sam9_lpr1:
1142	.word 0
1143.saved_sam9_mdr:
1144	.word 0
1145.saved_sam9_mdr1:
1146	.word 0
1147.saved_osc_status:
1148	.word 0
1149#ifdef CONFIG_SOC_SAMA7
1150.saved_mck1:
1151	.word 0
1152.saved_mck2:
1153	.word 0
1154.saved_mck3:
1155	.word 0
1156.saved_mck4:
1157	.word 0
1158#endif
1159
1160ENTRY(at91_pm_suspend_in_sram_sz)
1161	.word .-at91_pm_suspend_in_sram
1162