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