xref: /linux/arch/powerpc/platforms/52xx/mpc52xx_sleep.S (revision c0c914eca7f251c70facc37dfebeaf176601918d)
1#include <asm/reg.h>
2#include <asm/ppc_asm.h>
3#include <asm/processor.h>
4
5
6.text
7
8_GLOBAL(mpc52xx_deep_sleep)
9mpc52xx_deep_sleep: /* args r3-r6: SRAM, SDRAM regs, CDM regs, INTR regs */
10
11	/* enable interrupts */
12	mfmsr	r7
13	ori	r7, r7, 0x8000 /* EE */
14	mtmsr	r7
15	sync; isync;
16
17	li	r10, 0 /* flag that irq handler sets */
18
19	/* enable tmr7 (or any other) interrupt */
20	lwz	r8, 0x14(r6) /* intr->main_mask */
21	ori	r8, r8, 0x1
22	xori	r8, r8, 0x1
23	stw	r8, 0x14(r6)
24	sync
25
26	/* emulate tmr7 interrupt */
27	li	r8, 0x1
28	stw	r8, 0x40(r6) /* intr->main_emulate */
29	sync
30
31	/* wait for it to happen */
321:
33	cmpi	cr0, r10, 1
34	bne	cr0, 1b
35
36	/* lock icache */
37	mfspr	r10, SPRN_HID0
38	ori	r10, r10, 0x2000
39	sync; isync;
40	mtspr	SPRN_HID0, r10
41	sync; isync;
42
43
44	mflr	r9 /* save LR */
45
46	/* jump to sram */
47	mtlr	r3
48	blrl
49
50	mtlr	r9 /* restore LR */
51
52	/* unlock icache */
53	mfspr	r10, SPRN_HID0
54	ori	r10, r10, 0x2000
55	xori	r10, r10, 0x2000
56	sync; isync;
57	mtspr	SPRN_HID0, r10
58	sync; isync;
59
60
61	/* return to C code */
62	blr
63
64
65_GLOBAL(mpc52xx_ds_sram)
66mpc52xx_ds_sram:
67	/* put SDRAM into self-refresh */
68	lwz	r8, 0x4(r4)	/* sdram->ctrl */
69
70	oris	r8, r8, 0x8000 /* mode_en */
71	stw	r8, 0x4(r4)
72	sync
73
74	ori	r8, r8, 0x0002 /* soft_pre */
75	stw	r8, 0x4(r4)
76	sync
77	xori	r8, r8, 0x0002
78
79	xoris	r8, r8, 0x8000 /* !mode_en */
80	stw	r8, 0x4(r4)
81	sync
82
83	oris	r8, r8, 0x5000
84	xoris	r8, r8, 0x4000 /* ref_en !cke */
85	stw	r8, 0x4(r4)
86	sync
87
88	/* disable SDRAM clock */
89	lwz	r8, 0x14(r5) /* cdm->clkenable */
90	ori	r8, r8, 0x0008
91	xori	r8, r8, 0x0008
92	stw	r8, 0x14(r5)
93	sync
94
95
96	/* put mpc5200 to sleep */
97	mfmsr	r10
98	oris	r10, r10, 0x0004	/* POW = 1 */
99	sync; isync;
100	mtmsr	r10
101	sync; isync;
102
103
104	/* enable clock */
105	lwz	r8, 0x14(r5)
106	ori	r8, r8, 0x0008
107	stw	r8, 0x14(r5)
108	sync
109
110	/* get ram out of self-refresh */
111	lwz	r8, 0x4(r4)
112	oris	r8, r8, 0x5000 /* cke ref_en */
113	stw	r8, 0x4(r4)
114	sync
115
116	blr
117_GLOBAL(mpc52xx_ds_sram_size)
118mpc52xx_ds_sram_size:
119	.long $-mpc52xx_ds_sram
120
121
122/* ### interrupt handler for wakeup from deep-sleep ### */
123_GLOBAL(mpc52xx_ds_cached)
124mpc52xx_ds_cached:
125	mtspr	SPRN_SPRG0, r7
126	mtspr	SPRN_SPRG1, r8
127
128	/* disable emulated interrupt */
129	mfspr	r7, 311 /* MBAR */
130	addi	r7, r7, 0x540	/* intr->main_emul */
131	li	r8, 0
132	stw	r8, 0(r7)
133	sync
134	dcbf	0, r7
135
136	/* acknowledge wakeup, so CCS releases power pown */
137	mfspr	r7, 311	/* MBAR */
138	addi	r7, r7, 0x524	/* intr->enc_status */
139	lwz	r8, 0(r7)
140	ori	r8, r8, 0x0400
141	stw	r8, 0(r7)
142	sync
143	dcbf	0, r7
144
145	/* flag - we handled the interrupt */
146	li	r10, 1
147
148	mfspr	r8, SPRN_SPRG1
149	mfspr	r7, SPRN_SPRG0
150
151	rfi
152_GLOBAL(mpc52xx_ds_cached_size)
153mpc52xx_ds_cached_size:
154	.long $-mpc52xx_ds_cached
155