xref: /OK3568_Linux_fs/kernel/arch/arm/mach-s3c/sleep-s3c2412.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * Copyright (c) 2007 Simtec Electronics
4*4882a593Smuzhiyun *	Ben Dooks <ben@simtec.co.uk>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * S3C2412 Power Manager low-level sleep support
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun#include <linux/linkage.h>
10*4882a593Smuzhiyun#include <asm/assembler.h>
11*4882a593Smuzhiyun#include "map.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun#include "regs-irq.h"
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun	.text
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun	.global	s3c2412_sleep_enter
18*4882a593Smuzhiyun
19*4882a593Smuzhiyuns3c2412_sleep_enter:
20*4882a593Smuzhiyun	mov	r0, #0			/* argument for coprocessors */
21*4882a593Smuzhiyun	ldr	r1, =S3C2410_INTPND
22*4882a593Smuzhiyun	ldr	r2, =S3C2410_SRCPND
23*4882a593Smuzhiyun	ldr	r3, =S3C2410_EINTPEND
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun	teq	r0, r0
26*4882a593Smuzhiyun	bl	s3c2412_sleep_enter1
27*4882a593Smuzhiyun	teq	pc, r0
28*4882a593Smuzhiyun	bl	s3c2412_sleep_enter1
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun	.align	5
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	/* this is called twice, first with the Z flag to ensure that the
33*4882a593Smuzhiyun	 * instructions have been loaded into the cache, and the second
34*4882a593Smuzhiyun	 * time to try and suspend the system.
35*4882a593Smuzhiyun	*/
36*4882a593Smuzhiyuns3c2412_sleep_enter1:
37*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c10, 4
38*4882a593Smuzhiyun	mcrne	p15, 0, r0, c7, c0, 4
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun	/* if we return from here, it is because an interrupt was
41*4882a593Smuzhiyun	 * active when we tried to shutdown. Try and ack the IRQ and
42*4882a593Smuzhiyun	 * retry, as simply returning causes the system to lock.
43*4882a593Smuzhiyun	*/
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	ldrne	r9, [r1]
46*4882a593Smuzhiyun	strne	r9, [r1]
47*4882a593Smuzhiyun	ldrne	r9, [r2]
48*4882a593Smuzhiyun	strne	r9, [r2]
49*4882a593Smuzhiyun	ldrne	r9, [r3]
50*4882a593Smuzhiyun	strne	r9, [r3]
51*4882a593Smuzhiyun	bne	s3c2412_sleep_enter1
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun	ret	lr
54