![Russell King](/assets/img/avatar_default.png)
ARMv6 and greater introduced a new instruction ("bx") which can be used to return from function calls. Recent CPUs perform better when the "bx lr" instruction is used rather than the "mov pc, lr" instruction, and this sequence is strongly recommended to be used by the ARM architecture manual (section A.4.1.1). We provide a new macro "ret" with all its variants for the condition code which will resolve to the appropriate instruction. Rather than doing this piecemeal, and miss some instances, change all the "mov pc" instances to use the new macro, with the exception of the "movs" instruction and the kprobes code. This allows us to detect the "mov pc, lr" case and fix it up - and also gives us the possibility of deploying this for other registers depending on the CPU selection. Reported-by: Will Deacon <will.deacon@arm.com> Tested-by: Stephen Warren <swarren@nvidia.com> # Tegra Jetson TK1 Tested-by: Robert Jarzmik <robert.jarzmik@free.fr> # mioa701_bootresume.S Tested-by: Andrew Lunn <andrew@lunn.ch> # Kirkwood Tested-by: Shawn Guo <shawn.guo@freescale.com> Tested-by: Tony Lindgren <tony@atomide.com> # OMAPs Tested-by: Gregory CLEMENT <gregory.clement@free-electrons.com> # Armada XP, 375, 385 Acked-by: Sekhar Nori <nsekhar@ti.com> # DaVinci Acked-by: Christoffer Dall <christoffer.dall@linaro.org> # kvm/hyp Acked-by: Haojian Zhuang <haojian.zhuang@gmail.com> # PXA3xx Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> # Xen Tested-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> # ARMv7M Tested-by: Simon Horman <horms+renesas@verge.net.au> # Shmobile Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
70 lines
2 KiB
ArmAsm
70 lines
2 KiB
ArmAsm
/* linux/arch/arm/mach-s3c2410/sleep.S
|
|
*
|
|
* Copyright (c) 2004 Simtec Electronics
|
|
* Ben Dooks <ben@simtec.co.uk>
|
|
*
|
|
* S3C2410 Power Manager (Suspend-To-RAM) support
|
|
*
|
|
* Based on PXA/SA1100 sleep code by:
|
|
* Nicolas Pitre, (c) 2002 Monta Vista Software Inc
|
|
* Cliff Brake, (c) 2001
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <linux/serial_s3c.h>
|
|
#include <asm/assembler.h>
|
|
#include <mach/hardware.h>
|
|
#include <mach/map.h>
|
|
|
|
#include <mach/regs-gpio.h>
|
|
#include <mach/regs-clock.h>
|
|
|
|
#include "regs-mem.h"
|
|
|
|
/* s3c2410_cpu_suspend
|
|
*
|
|
* put the cpu into sleep mode
|
|
*/
|
|
|
|
ENTRY(s3c2410_cpu_suspend)
|
|
@@ prepare cpu to sleep
|
|
|
|
ldr r4, =S3C2410_REFRESH
|
|
ldr r5, =S3C24XX_MISCCR
|
|
ldr r6, =S3C2410_CLKCON
|
|
ldr r7, [r4] @ get REFRESH (and ensure in TLB)
|
|
ldr r8, [r5] @ get MISCCR (and ensure in TLB)
|
|
ldr r9, [r6] @ get CLKCON (and ensure in TLB)
|
|
|
|
orr r7, r7, #S3C2410_REFRESH_SELF @ SDRAM sleep command
|
|
orr r8, r8, #S3C2410_MISCCR_SDSLEEP @ SDRAM power-down signals
|
|
orr r9, r9, #S3C2410_CLKCON_POWER @ power down command
|
|
|
|
teq pc, #0 @ first as a trial-run to load cache
|
|
bl s3c2410_do_sleep
|
|
teq r0, r0 @ now do it for real
|
|
b s3c2410_do_sleep @
|
|
|
|
@@ align next bit of code to cache line
|
|
.align 5
|
|
s3c2410_do_sleep:
|
|
streq r7, [r4] @ SDRAM sleep command
|
|
streq r8, [r5] @ SDRAM power-down config
|
|
streq r9, [r6] @ CPU sleep
|
|
1: beq 1b
|
|
ret lr
|