1/*
2 * Copyright (C) 2006-2007 PA Semi, Inc
3 *
4 * Maintained by: Olof Johansson <olof@lixom.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 *
19 */
20
21#include <asm/processor.h>
22#include <asm/page.h>
23#include <asm/ppc_asm.h>
24#include <asm/cputable.h>
25#include <asm/cache.h>
26#include <asm/thread_info.h>
27#include <asm/asm-offsets.h>
28
29/* Power savings opcodes since not all binutils have them at this time */
30#define DOZE	.long	0x4c000324
31#define NAP	.long	0x4c000364
32#define SLEEP	.long	0x4c0003a4
33#define RVW	.long	0x4c0003e4
34
35/* Common sequence to do before going to any of the
36 * powersavings modes.
37 */
38
39#define PRE_SLEEP_SEQUENCE	\
40	std	r3,8(r1);	\
41	ptesync	;		\
42	ld	r3,8(r1);	\
431:	cmpd 	r3,r3;		\
44	bne	1b
45
46_doze:
47	PRE_SLEEP_SEQUENCE
48	DOZE
49	b	.
50
51
52_GLOBAL(idle_spin)
53	blr
54
55_GLOBAL(idle_doze)
56	LOAD_REG_ADDR(r3, _doze)
57	b	sleep_common
58
59/* Add more modes here later */
60
61sleep_common:
62	mflr	r0
63	std	r0, 16(r1)
64	stdu	r1,-64(r1)
65
66	LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
67	mfmsr	r4
68	andc	r5,r4,r6
69	mtmsrd	r5,0
70
71	mtctr	r3
72	bctrl
73
74	mtmsrd	r4,0
75
76	addi	r1,r1,64
77	ld	r0,16(r1)
78	mtlr	r0
79	blr
80
81