ARM: mvebu: fix cpuidle implementation to work on big-endian systems
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Mon, 30 Jun 2014 12:09:25 +0000 (14:09 +0200)
committerJason Cooper <jason@lakedaemon.net>
Mon, 30 Jun 2014 18:15:11 +0000 (18:15 +0000)
commit6509dc74c9f55ffaa558738b96c4da8b98d39571
tree12c6dbdf141658a4851db2a9b32f535eab62d595
parent011788907ba955f87875fcfb4914881b28f7f99d
ARM: mvebu: fix cpuidle implementation to work on big-endian systems

On Marvell Armada XP, when a CPU comes back from deep idle state of
cpuidle, it restarts its execution at armada_370_xp_cpu_resume(),
which puts back the CPU into the coherency, and then calls the generic
cpu_resume() function.

While this works on little-endian configurations, it doesn't work on
big-endian configurations because the CPU restarts in little-endian,
and therefore must be switched back to big-endian to operate
properly. To achieve this, a 'setend be' instruction must be executed
in big-endian configurations. However, the ARM_BE8() macro that is
used to implement nice compile-time conditional for ARM LE vs. ARM BE8
is not easily usable in inline assembly.

Therefore, this patch moves the armada_370_xp_cpu_resume() C function,
which was anyway just a block of inline assembly, into a proper
pmsu_ll.S file, and adds the appropriate ARM_BE8(setend be)
instruction.

Without this patch, an Armada XP big endian configuration with cpuidle
enabled fails to boot, as it hangs as soon as one of the CPU hits the
deep idle state.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Link: https://lkml.kernel.org/r/1404130165-3593-1-git-send-email-thomas.petazzoni@free-electrons.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
arch/arm/mach-mvebu/Makefile
arch/arm/mach-mvebu/pmsu.c
arch/arm/mach-mvebu/pmsu_ll.S [new file with mode: 0644]