diff options
author | Simon Horman <horms@verge.net.au> | 2012-11-12 21:42:54 -0500 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2012-11-12 21:42:54 -0500 |
commit | 872b59832d920ba7398b7cf81b5d8fc9088f8259 (patch) | |
tree | 64bf75a878e4cac018b9c09181cdb2d57af13129 /arch | |
parent | d5bea23c82c724231d5077a240887748a5bcd25a (diff) |
Revert "ARM: shmobile: r8a7779: Replace modify_scu_cpu_psr with scu_power_mode"
This reverts commit cdc7594e5c5f7509a86b205edeedc58d72dd3999.
The code changes the flags of the wrong cpus - which breaks the whole
bootup of secondary CPUs.
Cc: Bastian Hecht <hechtb@gmail.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-shmobile/smp-r8a7779.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c index 9def0f22bf2..2ce6af9a6a3 100644 --- a/arch/arm/mach-shmobile/smp-r8a7779.c +++ b/arch/arm/mach-shmobile/smp-r8a7779.c | |||
@@ -61,6 +61,9 @@ static void __iomem *scu_base_addr(void) | |||
61 | return (void __iomem *)0xf0000000; | 61 | return (void __iomem *)0xf0000000; |
62 | } | 62 | } |
63 | 63 | ||
64 | static DEFINE_SPINLOCK(scu_lock); | ||
65 | static unsigned long tmp; | ||
66 | |||
64 | #ifdef CONFIG_HAVE_ARM_TWD | 67 | #ifdef CONFIG_HAVE_ARM_TWD |
65 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); | 68 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); |
66 | 69 | ||
@@ -70,6 +73,20 @@ void __init r8a7779_register_twd(void) | |||
70 | } | 73 | } |
71 | #endif | 74 | #endif |
72 | 75 | ||
76 | static void modify_scu_cpu_psr(unsigned long set, unsigned long clr) | ||
77 | { | ||
78 | void __iomem *scu_base = scu_base_addr(); | ||
79 | |||
80 | spin_lock(&scu_lock); | ||
81 | tmp = __raw_readl(scu_base + 8); | ||
82 | tmp &= ~clr; | ||
83 | tmp |= set; | ||
84 | spin_unlock(&scu_lock); | ||
85 | |||
86 | /* disable cache coherency after releasing the lock */ | ||
87 | __raw_writel(tmp, scu_base + 8); | ||
88 | } | ||
89 | |||
73 | static unsigned int __init r8a7779_get_core_count(void) | 90 | static unsigned int __init r8a7779_get_core_count(void) |
74 | { | 91 | { |
75 | void __iomem *scu_base = scu_base_addr(); | 92 | void __iomem *scu_base = scu_base_addr(); |
@@ -85,7 +102,7 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu) | |||
85 | cpu = cpu_logical_map(cpu); | 102 | cpu = cpu_logical_map(cpu); |
86 | 103 | ||
87 | /* disable cache coherency */ | 104 | /* disable cache coherency */ |
88 | scu_power_mode(scu_base_addr(), 3); | 105 | modify_scu_cpu_psr(3 << (cpu * 8), 0); |
89 | 106 | ||
90 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) | 107 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) |
91 | ch = r8a7779_ch_cpu[cpu]; | 108 | ch = r8a7779_ch_cpu[cpu]; |
@@ -128,7 +145,7 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct | |||
128 | cpu = cpu_logical_map(cpu); | 145 | cpu = cpu_logical_map(cpu); |
129 | 146 | ||
130 | /* enable cache coherency */ | 147 | /* enable cache coherency */ |
131 | scu_power_mode(scu_base_addr(), 0); | 148 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); |
132 | 149 | ||
133 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) | 150 | if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) |
134 | ch = r8a7779_ch_cpu[cpu]; | 151 | ch = r8a7779_ch_cpu[cpu]; |
@@ -141,13 +158,15 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct | |||
141 | 158 | ||
142 | static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) | 159 | static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) |
143 | { | 160 | { |
161 | int cpu = cpu_logical_map(0); | ||
162 | |||
144 | scu_enable(scu_base_addr()); | 163 | scu_enable(scu_base_addr()); |
145 | 164 | ||
146 | /* Map the reset vector (in headsmp.S) */ | 165 | /* Map the reset vector (in headsmp.S) */ |
147 | __raw_writel(__pa(shmobile_secondary_vector), AVECR); | 166 | __raw_writel(__pa(shmobile_secondary_vector), AVECR); |
148 | 167 | ||
149 | /* enable cache coherency on CPU0 */ | 168 | /* enable cache coherency on CPU0 */ |
150 | scu_power_mode(scu_base_addr(), 0); | 169 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); |
151 | 170 | ||
152 | r8a7779_pm_init(); | 171 | r8a7779_pm_init(); |
153 | 172 | ||