ARM: 7347/1: SCU: use cpu_logical_map for per-CPU low power mode
authorWill Deacon <will.deacon@arm.com>
Fri, 24 Feb 2012 11:20:16 +0000 (12:20 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 28 Apr 2012 16:31:37 +0000 (17:31 +0100)
scu_power_mode changes the power mode for the current CPU, which it
determines from smp_processor_id(). However, this assumes that the
physical CPU number is equal to Linux's logical CPU number and if this
is not true, we will power off the wrong CPU.

This patch uses cpu_logical_map to translate the logical CPU number
into a physical one in scu_power_mode.

Reported-by: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/smp_scu.c

index 8f5dd7963356e9cef5116d067e53b75fb5f61636..b9f015e843d8d10c461197c4399663942fb721e9 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/init.h>
 #include <linux/io.h>
 
+#include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
 #include <asm/cacheflush.h>
 #include <asm/cputype.h>
@@ -74,7 +75,7 @@ void scu_enable(void __iomem *scu_base)
 int scu_power_mode(void __iomem *scu_base, unsigned int mode)
 {
        unsigned int val;
-       int cpu = smp_processor_id();
+       int cpu = cpu_logical_map(smp_processor_id());
 
        if (mode > 3 || mode == 1 || cpu > 3)
                return -EINVAL;