Skip to content

Commit

Permalink
[POWERPC] Add 6xx-style HID0_SLEEP support.
Browse files Browse the repository at this point in the history
This adds a function to put a 6xx/7xx/7xxx/83xx family CPU into sleep
mode, and return after an interrupt has occurred.  It expects to be
called with interrupts disabled, and returns with interrupts disabled.
Interrupts are enabled while the processor is asleep, but the interrupt
that wakes the processor is not handled; it is still pending when this
function returns.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Scott Wood authored and Paul Mackerras committed May 16, 2008
1 parent a560643 commit 0b2cca8
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 0 deletions.
52 changes: 52 additions & 0 deletions arch/powerpc/sysdev/6xx-suspend.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Enter and leave sleep state on chips with 6xx-style HID0
* power management bits, which don't leave sleep state via reset.
*
* Author: Scott Wood <scottwood@freescale.com>
*
* Copyright (c) 2006-2007 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*/

#include <asm/ppc_asm.h>
#include <asm/reg.h>
#include <asm/thread_info.h>
#include <asm/asm-offsets.h>

_GLOBAL(mpc6xx_enter_standby)
mflr r4

mfspr r5, SPRN_HID0
rlwinm r5, r5, 0, ~(HID0_DOZE | HID0_NAP)
oris r5, r5, HID0_SLEEP@h
mtspr SPRN_HID0, r5
isync

lis r5, ret_from_standby@h
ori r5, r5, ret_from_standby@l
mtlr r5

rlwinm r5, r1, 0, 0, 31-THREAD_SHIFT
lwz r6, TI_LOCAL_FLAGS(r5)
ori r6, r6, _TLF_SLEEPING
stw r6, TI_LOCAL_FLAGS(r5)

mfmsr r5
ori r5, r5, MSR_EE
oris r5, r5, MSR_POW@h
sync
mtmsr r5
isync

1: b 1b

ret_from_standby:
mfspr r5, SPRN_HID0
rlwinm r5, r5, 0, ~HID0_SLEEP
mtspr SPRN_HID0, r5

mtlr r4
blr
4 changes: 4 additions & 0 deletions arch/powerpc/sysdev/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ obj-$(CONFIG_PPC_DCR) += dcr.o
obj-$(CONFIG_8xx) += mpc8xx_pic.o cpm1.o
obj-$(CONFIG_UCODE_PATCH) += micropatch.o
endif

ifeq ($(CONFIG_SUSPEND),y)
obj-$(CONFIG_6xx) += 6xx-suspend.o
endif
6 changes: 6 additions & 0 deletions include/asm-powerpc/mpc6xx.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef __ASM_POWERPC_MPC6xx_H
#define __ASM_POWERPC_MPC6xx_H

void mpc6xx_enter_standby(void);

#endif

0 comments on commit 0b2cca8

Please sign in to comment.