1332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks/* linux/arch/arm/mach-s3c2412/sleep.S
2332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks *
3332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * Copyright (c) 2007 Simtec Electronics
4332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks *	Ben Dooks <ben@simtec.co.uk>
5332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks *
6332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * S3C2412 Power Manager low-level sleep support
7332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks *
8332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * This program is free software; you can redistribute it and/or modify
9332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * it under the terms of the GNU General Public License as published by
10332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * the Free Software Foundation; either version 2 of the License, or
11332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * (at your option) any later version.
12332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks *
13332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * This program is distributed in the hope that it will be useful,
14332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * but WITHOUT ANY WARRANTY; without even the implied warranty of
15332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * GNU General Public License for more details.
17332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks *
18332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * You should have received a copy of the GNU General Public License
19332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * along with this program; if not, write to the Free Software
20332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks*/
22332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
23332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks#include <linux/linkage.h>
24332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks#include <asm/assembler.h>
25a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
26a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/map.h>
27332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
28a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/regs-irq.h>
29332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
30332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	.text
31332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
32332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	.global	s3c2412_sleep_enter
33332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
34332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dookss3c2412_sleep_enter:
35332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	mov	r0, #0			/* argument for coprocessors */
36332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	ldr	r1, =S3C2410_INTPND
37332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	ldr	r2, =S3C2410_SRCPND
38332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	ldr	r3, =S3C2410_EINTPEND
39332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
40332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	teq	r0, r0
41332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	bl	s3c2412_sleep_enter1
42332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	teq	pc, r0
43332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	bl	s3c2412_sleep_enter1
44332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
45332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	.align	5
46332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
47332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	/* this is called twice, first with the Z flag to ensure that the
48332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	 * instructions have been loaded into the cache, and the second
49332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	 * time to try and suspend the system.
50332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	*/
51332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dookss3c2412_sleep_enter1:
52332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	mcr	p15, 0, r0, c7, c10, 4
53332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	mcrne	p15, 0, r0, c7, c0, 4
54332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
55332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	/* if we return from here, it is because an interrupt was
56332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	 * active when we tried to shutdown. Try and ack the IRQ and
57332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	 * retry, as simply returning causes the system to lock.
58332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	*/
59332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
60332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	ldrne	r9, [ r1 ]
61332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	strne	r9, [ r1 ]
62332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	ldrne	r9, [ r2 ]
63332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	strne	r9, [ r2 ]
64332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	ldrne	r9, [ r3 ]
65332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	strne	r9, [ r3 ]
66332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	bne	s3c2412_sleep_enter1
67332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks
68332349518f1958b0bc1ae3febc2e4f75f214d255Ben Dooks	mov	pc, r14
69