aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSimon Horman <horms@verge.net.au>2012-11-12 21:42:54 -0500
committerSimon Horman <horms@verge.net.au>2012-11-12 21:42:54 -0500
commit872b59832d920ba7398b7cf81b5d8fc9088f8259 (patch)
tree64bf75a878e4cac018b9c09181cdb2d57af13129 /arch
parentd5bea23c82c724231d5077a240887748a5bcd25a (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.c25
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
64static DEFINE_SPINLOCK(scu_lock);
65static unsigned long tmp;
66
64#ifdef CONFIG_HAVE_ARM_TWD 67#ifdef CONFIG_HAVE_ARM_TWD
65static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29); 68static 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
76static 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
73static unsigned int __init r8a7779_get_core_count(void) 90static 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
142static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) 159static 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