Linux Audio

Check our new training course

Loading...
v4.10.11
  1/*
  2 * Copyright 2002 Embedded Edge, LLC
  3 * Author: dan@embeddededge.com
  4 *
  5 * Sleep helper for Au1xxx sleep mode.
  6 *
  7 * This program is free software; you can redistribute	it and/or modify it
  8 * under  the terms of	the GNU General	 Public License as published by the
  9 * Free Software Foundation;  either version 2 of the  License, or (at your
 10 * option) any later version.
 11 */
 12
 13#include <asm/asm.h>
 14#include <asm/mipsregs.h>
 15#include <asm/regdef.h>
 16#include <asm/stackframe.h>
 17
 18	.extern __flush_cache_all
 19
 20	.text
 21	.set noreorder
 22	.set noat
 23	.align	5
 24
 25
 26/* preparatory stuff */
 27.macro	SETUP_SLEEP
 28	subu	sp, PT_SIZE
 29	sw	$1, PT_R1(sp)
 30	sw	$2, PT_R2(sp)
 31	sw	$3, PT_R3(sp)
 32	sw	$4, PT_R4(sp)
 33	sw	$5, PT_R5(sp)
 34	sw	$6, PT_R6(sp)
 35	sw	$7, PT_R7(sp)
 36	sw	$16, PT_R16(sp)
 37	sw	$17, PT_R17(sp)
 38	sw	$18, PT_R18(sp)
 39	sw	$19, PT_R19(sp)
 40	sw	$20, PT_R20(sp)
 41	sw	$21, PT_R21(sp)
 42	sw	$22, PT_R22(sp)
 43	sw	$23, PT_R23(sp)
 44	sw	$26, PT_R26(sp)
 45	sw	$27, PT_R27(sp)
 46	sw	$28, PT_R28(sp)
 47	sw	$30, PT_R30(sp)
 48	sw	$31, PT_R31(sp)
 49	mfc0	k0, CP0_STATUS
 50	sw	k0, 0x20(sp)
 51	mfc0	k0, CP0_CONTEXT
 52	sw	k0, 0x1c(sp)
 53	mfc0	k0, CP0_PAGEMASK
 54	sw	k0, 0x18(sp)
 55	mfc0	k0, CP0_CONFIG
 56	sw	k0, 0x14(sp)
 57
 58	/* flush caches to make sure context is in memory */
 59	la	t1, __flush_cache_all
 60	lw	t0, 0(t1)
 61	jalr	t0
 62	 nop
 63
 64	/* Now set up the scratch registers so the boot rom will
 65	 * return to this point upon wakeup.
 66	 * sys_scratch0 : SP
 67	 * sys_scratch1 : RA
 68	 */
 69	lui	t3, 0xb190		/* sys_xxx */
 70	sw	sp, 0x0018(t3)
 71	la	k0, alchemy_sleep_wakeup	/* resume path */
 72	sw	k0, 0x001c(t3)
 73.endm
 74
 75.macro	DO_SLEEP
 76	/* put power supply and processor to sleep */
 77	sw	zero, 0x0078(t3)	/* sys_slppwr */
 78	sync
 79	sw	zero, 0x007c(t3)	/* sys_sleep */
 80	sync
 81	nop
 82	nop
 83	nop
 84	nop
 85	nop
 86	nop
 87	nop
 88	nop
 89.endm
 90
 91/* sleep code for Au1000/Au1100/Au1500 memory controller type */
 92LEAF(alchemy_sleep_au1000)
 93
 94	SETUP_SLEEP
 95
 96	/* cache following instructions, as memory gets put to sleep */
 97	la	t0, 1f
 98	.set	arch=r4000
 99	cache	0x14, 0(t0)
100	cache	0x14, 32(t0)
101	cache	0x14, 64(t0)
102	cache	0x14, 96(t0)
103	.set	mips0
104
1051:	lui	a0, 0xb400		/* mem_xxx */
106	sw	zero, 0x001c(a0)	/* Precharge */
107	sync
108	sw	zero, 0x0020(a0)	/* Auto Refresh */
109	sync
110	sw	zero, 0x0030(a0)	/* Sleep */
111	sync
112
113	DO_SLEEP
114
115END(alchemy_sleep_au1000)
116
117/* sleep code for Au1550/Au1200 memory controller type */
118LEAF(alchemy_sleep_au1550)
119
120	SETUP_SLEEP
121
122	/* cache following instructions, as memory gets put to sleep */
123	la	t0, 1f
124	.set	arch=r4000
125	cache	0x14, 0(t0)
126	cache	0x14, 32(t0)
127	cache	0x14, 64(t0)
128	cache	0x14, 96(t0)
129	.set	mips0
130
1311:	lui	a0, 0xb400		/* mem_xxx */
132	sw	zero, 0x08c0(a0)	/* Precharge */
133	sync
134	sw	zero, 0x08d0(a0)	/* Self Refresh */
135	sync
136
137	/* wait for sdram to enter self-refresh mode */
138	lui	t0, 0x0100
1392:	lw	t1, 0x0850(a0)		/* mem_sdstat */
140	and	t2, t1, t0
141	beq	t2, zero, 2b
142	 nop
143
144	/* disable SDRAM clocks */
145	lui	t0, 0xcfff
146	ori	t0, t0, 0xffff
147	lw	t1, 0x0840(a0)		/* mem_sdconfiga */
148	and	t1, t0, t1		/* clear CE[1:0] */
149	sw	t1, 0x0840(a0)		/* mem_sdconfiga */
150	sync
151
152	DO_SLEEP
153
154END(alchemy_sleep_au1550)
155
156/* sleepcode for Au1300 memory controller type */
157LEAF(alchemy_sleep_au1300)
158
159	SETUP_SLEEP
160
161	/* cache following instructions, as memory gets put to sleep */
162	la	t0, 2f
163	la	t1, 4f
164	subu	t2, t1, t0
165
166	.set	arch=r4000
167
1681:	cache	0x14, 0(t0)
169	subu	t2, t2, 32
170	bgez	t2, 1b
171	 addu	t0, t0, 32
172
173	.set	mips0
174
1752:	lui	a0, 0xb400		/* mem_xxx */
176
177	/* disable all ports in mem_sdportcfga */
178	sw	zero, 0x868(a0)		/* mem_sdportcfga */
179	sync
180
181	/* disable ODT */
182	li	t0, 0x03010000
183	sw	t0, 0x08d8(a0)		/* mem_sdcmd0 */
184	sw	t0, 0x08dc(a0)		/* mem_sdcmd1 */
185	sync
186
187	/* precharge */
188	li	t0, 0x23000400
189	sw	t0, 0x08dc(a0)		/* mem_sdcmd1 */
190	sw	t0, 0x08d8(a0)		/* mem_sdcmd0 */
191	sync
192
193	/* auto refresh */
194	sw	zero, 0x08c8(a0)	/* mem_sdautoref */
195	sync
196
197	/* block access to the DDR */
198	lw	t0, 0x0848(a0)		/* mem_sdconfigb */
199	li	t1, (1 << 7 | 0x3F)
200	or	t0, t0, t1
201	sw	t0, 0x0848(a0)		/* mem_sdconfigb */
202	sync
203
204	/* issue the Self Refresh command */
205	li	t0, 0x10000000
206	sw	t0, 0x08dc(a0)		/* mem_sdcmd1 */
207	sw	t0, 0x08d8(a0)		/* mem_sdcmd0 */
208	sync
209
210	/* wait for sdram to enter self-refresh mode */
211	lui	t0, 0x0300
2123:	lw	t1, 0x0850(a0)		/* mem_sdstat */
213	and	t2, t1, t0
214	bne	t2, t0, 3b
215	 nop
216
217	/* disable SDRAM clocks */
218	li	t0, ~(3<<28)
219	lw	t1, 0x0840(a0)		/* mem_sdconfiga */
220	and	t1, t1, t0		/* clear CE[1:0] */
221	sw	t1, 0x0840(a0)		/* mem_sdconfiga */
222	sync
223
224	DO_SLEEP
2254:
226
227END(alchemy_sleep_au1300)
228
229
230	/* This is where we return upon wakeup.
231	 * Reload all of the registers and return.
232	 */
233LEAF(alchemy_sleep_wakeup)
234	lw	k0, 0x20(sp)
235	mtc0	k0, CP0_STATUS
236	lw	k0, 0x1c(sp)
237	mtc0	k0, CP0_CONTEXT
238	lw	k0, 0x18(sp)
239	mtc0	k0, CP0_PAGEMASK
240	lw	k0, 0x14(sp)
241	mtc0	k0, CP0_CONFIG
242
243	/* We need to catch the early Alchemy SOCs with
244	 * the write-only Config[OD] bit and set it back to one...
245	 */
246	jal	au1x00_fixup_config_od
247	 nop
248	lw	$1, PT_R1(sp)
249	lw	$2, PT_R2(sp)
250	lw	$3, PT_R3(sp)
251	lw	$4, PT_R4(sp)
252	lw	$5, PT_R5(sp)
253	lw	$6, PT_R6(sp)
254	lw	$7, PT_R7(sp)
255	lw	$16, PT_R16(sp)
256	lw	$17, PT_R17(sp)
257	lw	$18, PT_R18(sp)
258	lw	$19, PT_R19(sp)
259	lw	$20, PT_R20(sp)
260	lw	$21, PT_R21(sp)
261	lw	$22, PT_R22(sp)
262	lw	$23, PT_R23(sp)
263	lw	$26, PT_R26(sp)
264	lw	$27, PT_R27(sp)
265	lw	$28, PT_R28(sp)
266	lw	$30, PT_R30(sp)
267	lw	$31, PT_R31(sp)
268	jr	ra
269	 addiu	sp, PT_SIZE
270END(alchemy_sleep_wakeup)
v4.17
  1/*
  2 * Copyright 2002 Embedded Edge, LLC
  3 * Author: dan@embeddededge.com
  4 *
  5 * Sleep helper for Au1xxx sleep mode.
  6 *
  7 * This program is free software; you can redistribute	it and/or modify it
  8 * under  the terms of	the GNU General	 Public License as published by the
  9 * Free Software Foundation;  either version 2 of the  License, or (at your
 10 * option) any later version.
 11 */
 12
 13#include <asm/asm.h>
 14#include <asm/mipsregs.h>
 15#include <asm/regdef.h>
 16#include <asm/stackframe.h>
 17
 18	.extern __flush_cache_all
 19
 20	.text
 21	.set noreorder
 22	.set noat
 23	.align	5
 24
 25
 26/* preparatory stuff */
 27.macro	SETUP_SLEEP
 28	subu	sp, PT_SIZE
 29	sw	$1, PT_R1(sp)
 30	sw	$2, PT_R2(sp)
 31	sw	$3, PT_R3(sp)
 32	sw	$4, PT_R4(sp)
 33	sw	$5, PT_R5(sp)
 34	sw	$6, PT_R6(sp)
 35	sw	$7, PT_R7(sp)
 36	sw	$16, PT_R16(sp)
 37	sw	$17, PT_R17(sp)
 38	sw	$18, PT_R18(sp)
 39	sw	$19, PT_R19(sp)
 40	sw	$20, PT_R20(sp)
 41	sw	$21, PT_R21(sp)
 42	sw	$22, PT_R22(sp)
 43	sw	$23, PT_R23(sp)
 44	sw	$26, PT_R26(sp)
 45	sw	$27, PT_R27(sp)
 46	sw	$28, PT_R28(sp)
 47	sw	$30, PT_R30(sp)
 48	sw	$31, PT_R31(sp)
 49	mfc0	k0, CP0_STATUS
 50	sw	k0, 0x20(sp)
 51	mfc0	k0, CP0_CONTEXT
 52	sw	k0, 0x1c(sp)
 53	mfc0	k0, CP0_PAGEMASK
 54	sw	k0, 0x18(sp)
 55	mfc0	k0, CP0_CONFIG
 56	sw	k0, 0x14(sp)
 57
 58	/* flush caches to make sure context is in memory */
 59	la	t1, __flush_cache_all
 60	lw	t0, 0(t1)
 61	jalr	t0
 62	 nop
 63
 64	/* Now set up the scratch registers so the boot rom will
 65	 * return to this point upon wakeup.
 66	 * sys_scratch0 : SP
 67	 * sys_scratch1 : RA
 68	 */
 69	lui	t3, 0xb190		/* sys_xxx */
 70	sw	sp, 0x0018(t3)
 71	la	k0, alchemy_sleep_wakeup	/* resume path */
 72	sw	k0, 0x001c(t3)
 73.endm
 74
 75.macro	DO_SLEEP
 76	/* put power supply and processor to sleep */
 77	sw	zero, 0x0078(t3)	/* sys_slppwr */
 78	sync
 79	sw	zero, 0x007c(t3)	/* sys_sleep */
 80	sync
 81	nop
 82	nop
 83	nop
 84	nop
 85	nop
 86	nop
 87	nop
 88	nop
 89.endm
 90
 91/* sleep code for Au1000/Au1100/Au1500 memory controller type */
 92LEAF(alchemy_sleep_au1000)
 93
 94	SETUP_SLEEP
 95
 96	/* cache following instructions, as memory gets put to sleep */
 97	la	t0, 1f
 98	.set	arch=r4000
 99	cache	0x14, 0(t0)
100	cache	0x14, 32(t0)
101	cache	0x14, 64(t0)
102	cache	0x14, 96(t0)
103	.set	mips0
104
1051:	lui	a0, 0xb400		/* mem_xxx */
106	sw	zero, 0x001c(a0)	/* Precharge */
107	sync
108	sw	zero, 0x0020(a0)	/* Auto Refresh */
109	sync
110	sw	zero, 0x0030(a0)	/* Sleep */
111	sync
112
113	DO_SLEEP
114
115END(alchemy_sleep_au1000)
116
117/* sleep code for Au1550/Au1200 memory controller type */
118LEAF(alchemy_sleep_au1550)
119
120	SETUP_SLEEP
121
122	/* cache following instructions, as memory gets put to sleep */
123	la	t0, 1f
124	.set	arch=r4000
125	cache	0x14, 0(t0)
126	cache	0x14, 32(t0)
127	cache	0x14, 64(t0)
128	cache	0x14, 96(t0)
129	.set	mips0
130
1311:	lui	a0, 0xb400		/* mem_xxx */
132	sw	zero, 0x08c0(a0)	/* Precharge */
133	sync
134	sw	zero, 0x08d0(a0)	/* Self Refresh */
135	sync
136
137	/* wait for sdram to enter self-refresh mode */
138	lui	t0, 0x0100
1392:	lw	t1, 0x0850(a0)		/* mem_sdstat */
140	and	t2, t1, t0
141	beq	t2, zero, 2b
142	 nop
143
144	/* disable SDRAM clocks */
145	lui	t0, 0xcfff
146	ori	t0, t0, 0xffff
147	lw	t1, 0x0840(a0)		/* mem_sdconfiga */
148	and	t1, t0, t1		/* clear CE[1:0] */
149	sw	t1, 0x0840(a0)		/* mem_sdconfiga */
150	sync
151
152	DO_SLEEP
153
154END(alchemy_sleep_au1550)
155
156/* sleepcode for Au1300 memory controller type */
157LEAF(alchemy_sleep_au1300)
158
159	SETUP_SLEEP
160
161	/* cache following instructions, as memory gets put to sleep */
162	la	t0, 2f
163	la	t1, 4f
164	subu	t2, t1, t0
165
166	.set	arch=r4000
167
1681:	cache	0x14, 0(t0)
169	subu	t2, t2, 32
170	bgez	t2, 1b
171	 addu	t0, t0, 32
172
173	.set	mips0
174
1752:	lui	a0, 0xb400		/* mem_xxx */
176
177	/* disable all ports in mem_sdportcfga */
178	sw	zero, 0x868(a0)		/* mem_sdportcfga */
179	sync
180
181	/* disable ODT */
182	li	t0, 0x03010000
183	sw	t0, 0x08d8(a0)		/* mem_sdcmd0 */
184	sw	t0, 0x08dc(a0)		/* mem_sdcmd1 */
185	sync
186
187	/* precharge */
188	li	t0, 0x23000400
189	sw	t0, 0x08dc(a0)		/* mem_sdcmd1 */
190	sw	t0, 0x08d8(a0)		/* mem_sdcmd0 */
191	sync
192
193	/* auto refresh */
194	sw	zero, 0x08c8(a0)	/* mem_sdautoref */
195	sync
196
197	/* block access to the DDR */
198	lw	t0, 0x0848(a0)		/* mem_sdconfigb */
199	li	t1, (1 << 7 | 0x3F)
200	or	t0, t0, t1
201	sw	t0, 0x0848(a0)		/* mem_sdconfigb */
202	sync
203
204	/* issue the Self Refresh command */
205	li	t0, 0x10000000
206	sw	t0, 0x08dc(a0)		/* mem_sdcmd1 */
207	sw	t0, 0x08d8(a0)		/* mem_sdcmd0 */
208	sync
209
210	/* wait for sdram to enter self-refresh mode */
211	lui	t0, 0x0300
2123:	lw	t1, 0x0850(a0)		/* mem_sdstat */
213	and	t2, t1, t0
214	bne	t2, t0, 3b
215	 nop
216
217	/* disable SDRAM clocks */
218	li	t0, ~(3<<28)
219	lw	t1, 0x0840(a0)		/* mem_sdconfiga */
220	and	t1, t1, t0		/* clear CE[1:0] */
221	sw	t1, 0x0840(a0)		/* mem_sdconfiga */
222	sync
223
224	DO_SLEEP
2254:
226
227END(alchemy_sleep_au1300)
228
229
230	/* This is where we return upon wakeup.
231	 * Reload all of the registers and return.
232	 */
233LEAF(alchemy_sleep_wakeup)
234	lw	k0, 0x20(sp)
235	mtc0	k0, CP0_STATUS
236	lw	k0, 0x1c(sp)
237	mtc0	k0, CP0_CONTEXT
238	lw	k0, 0x18(sp)
239	mtc0	k0, CP0_PAGEMASK
240	lw	k0, 0x14(sp)
241	mtc0	k0, CP0_CONFIG
242
243	/* We need to catch the early Alchemy SOCs with
244	 * the write-only Config[OD] bit and set it back to one...
245	 */
246	jal	au1x00_fixup_config_od
247	 nop
248	lw	$1, PT_R1(sp)
249	lw	$2, PT_R2(sp)
250	lw	$3, PT_R3(sp)
251	lw	$4, PT_R4(sp)
252	lw	$5, PT_R5(sp)
253	lw	$6, PT_R6(sp)
254	lw	$7, PT_R7(sp)
255	lw	$16, PT_R16(sp)
256	lw	$17, PT_R17(sp)
257	lw	$18, PT_R18(sp)
258	lw	$19, PT_R19(sp)
259	lw	$20, PT_R20(sp)
260	lw	$21, PT_R21(sp)
261	lw	$22, PT_R22(sp)
262	lw	$23, PT_R23(sp)
263	lw	$26, PT_R26(sp)
264	lw	$27, PT_R27(sp)
265	lw	$28, PT_R28(sp)
266	lw	$30, PT_R30(sp)
267	lw	$31, PT_R31(sp)
268	jr	ra
269	 addiu	sp, PT_SIZE
270END(alchemy_sleep_wakeup)