diff options
Diffstat (limited to 'arch/blackfin/mach-bf561')
-rw-r--r-- | arch/blackfin/mach-bf561/boards/cm_bf561.c | 2 | ||||
-rw-r--r-- | arch/blackfin/mach-bf561/hotplug.c | 21 | ||||
-rw-r--r-- | arch/blackfin/mach-bf561/secondary.S | 35 | ||||
-rw-r--r-- | arch/blackfin/mach-bf561/smp.c | 15 |
4 files changed, 31 insertions, 42 deletions
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 3b67929d4c0a..87595cd38afe 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
@@ -541,7 +541,7 @@ static int __init cm_bf561_init(void) | |||
541 | #endif | 541 | #endif |
542 | 542 | ||
543 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 543 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
544 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | 544 | irq_set_status_flags(PATA_INT, IRQ_NOAUTOEN); |
545 | #endif | 545 | #endif |
546 | return 0; | 546 | return 0; |
547 | } | 547 | } |
diff --git a/arch/blackfin/mach-bf561/hotplug.c b/arch/blackfin/mach-bf561/hotplug.c index 4cd3b28cd046..42fc085629c7 100644 --- a/arch/blackfin/mach-bf561/hotplug.c +++ b/arch/blackfin/mach-bf561/hotplug.c | |||
@@ -5,30 +5,27 @@ | |||
5 | * Licensed under the GPL-2 or later. | 5 | * Licensed under the GPL-2 or later. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <linux/smp.h> | ||
8 | #include <asm/blackfin.h> | 9 | #include <asm/blackfin.h> |
9 | #include <asm/irq.h> | 10 | #include <mach/pll.h> |
10 | #include <asm/smp.h> | ||
11 | |||
12 | #define SIC_SYSIRQ(irq) (irq - (IRQ_CORETMR + 1)) | ||
13 | 11 | ||
14 | int hotplug_coreb; | 12 | int hotplug_coreb; |
15 | 13 | ||
16 | void platform_cpu_die(void) | 14 | void platform_cpu_die(void) |
17 | { | 15 | { |
18 | unsigned long iwr[2] = {0, 0}; | 16 | unsigned long iwr; |
19 | unsigned long bank = SIC_SYSIRQ(IRQ_SUPPLE_0) / 32; | ||
20 | unsigned long bit = 1 << (SIC_SYSIRQ(IRQ_SUPPLE_0) % 32); | ||
21 | |||
22 | hotplug_coreb = 1; | 17 | hotplug_coreb = 1; |
23 | 18 | ||
24 | iwr[bank] = bit; | ||
25 | |||
26 | /* disable core timer */ | 19 | /* disable core timer */ |
27 | bfin_write_TCNTL(0); | 20 | bfin_write_TCNTL(0); |
28 | 21 | ||
29 | /* clear ipi interrupt IRQ_SUPPLE_0 */ | 22 | /* clear ipi interrupt IRQ_SUPPLE_0 of CoreB */ |
30 | bfin_write_SICB_SYSCR(bfin_read_SICB_SYSCR() | (1 << (10 + 1))); | 23 | bfin_write_SICB_SYSCR(bfin_read_SICB_SYSCR() | (1 << (10 + 1))); |
31 | SSYNC(); | 24 | SSYNC(); |
32 | 25 | ||
33 | coreb_sleep(iwr[0], iwr[1], 0); | 26 | /* set CoreB wakeup by ipi0, iwr will be discarded */ |
27 | bfin_iwr_set_sup0(&iwr, &iwr, &iwr); | ||
28 | SSYNC(); | ||
29 | |||
30 | coreb_die(); | ||
34 | } | 31 | } |
diff --git a/arch/blackfin/mach-bf561/secondary.S b/arch/blackfin/mach-bf561/secondary.S index 4624eebbf9c4..4c462838f4e1 100644 --- a/arch/blackfin/mach-bf561/secondary.S +++ b/arch/blackfin/mach-bf561/secondary.S | |||
@@ -13,7 +13,11 @@ | |||
13 | #include <asm/asm-offsets.h> | 13 | #include <asm/asm-offsets.h> |
14 | #include <asm/trace.h> | 14 | #include <asm/trace.h> |
15 | 15 | ||
16 | __INIT | 16 | /* |
17 | * This code must come first as CoreB is hardcoded (in hardware) | ||
18 | * to start at the beginning of its L1 instruction memory. | ||
19 | */ | ||
20 | .section .l1.text.head | ||
17 | 21 | ||
18 | /* Lay the initial stack into the L1 scratch area of Core B */ | 22 | /* Lay the initial stack into the L1 scratch area of Core B */ |
19 | #define INITIAL_STACK (COREB_L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) | 23 | #define INITIAL_STACK (COREB_L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) |
@@ -160,43 +164,34 @@ ENTRY(_coreb_trampoline_start) | |||
160 | .LWAIT_HERE: | 164 | .LWAIT_HERE: |
161 | jump .LWAIT_HERE; | 165 | jump .LWAIT_HERE; |
162 | ENDPROC(_coreb_trampoline_start) | 166 | ENDPROC(_coreb_trampoline_start) |
163 | ENTRY(_coreb_trampoline_end) | ||
164 | 167 | ||
168 | #ifdef CONFIG_HOTPLUG_CPU | ||
165 | .section ".text" | 169 | .section ".text" |
166 | ENTRY(_set_sicb_iwr) | 170 | ENTRY(_coreb_die) |
167 | P0.H = hi(SICB_IWR0); | ||
168 | P0.L = lo(SICB_IWR0); | ||
169 | P1.H = hi(SICB_IWR1); | ||
170 | P1.L = lo(SICB_IWR1); | ||
171 | [P0] = R0; | ||
172 | [P1] = R1; | ||
173 | SSYNC; | ||
174 | RTS; | ||
175 | ENDPROC(_set_sicb_iwr) | ||
176 | |||
177 | ENTRY(_coreb_sleep) | ||
178 | sp.l = lo(INITIAL_STACK); | 171 | sp.l = lo(INITIAL_STACK); |
179 | sp.h = hi(INITIAL_STACK); | 172 | sp.h = hi(INITIAL_STACK); |
180 | fp = sp; | 173 | fp = sp; |
181 | usp = sp; | 174 | usp = sp; |
182 | 175 | ||
183 | call _set_sicb_iwr; | ||
184 | |||
185 | CLI R2; | 176 | CLI R2; |
186 | SSYNC; | 177 | SSYNC; |
187 | IDLE; | 178 | IDLE; |
188 | STI R2; | 179 | STI R2; |
189 | 180 | ||
190 | R0 = IWR_DISABLE_ALL; | 181 | R0 = IWR_DISABLE_ALL; |
191 | R1 = IWR_DISABLE_ALL; | 182 | P0.H = hi(SYSMMR_BASE); |
192 | call _set_sicb_iwr; | 183 | P0.L = lo(SYSMMR_BASE); |
184 | [P0 + (SICB_IWR0 - SYSMMR_BASE)] = R0; | ||
185 | [P0 + (SICB_IWR1 - SYSMMR_BASE)] = R0; | ||
186 | SSYNC; | ||
193 | 187 | ||
194 | p0.h = hi(COREB_L1_CODE_START); | 188 | p0.h = hi(COREB_L1_CODE_START); |
195 | p0.l = lo(COREB_L1_CODE_START); | 189 | p0.l = lo(COREB_L1_CODE_START); |
196 | jump (p0); | 190 | jump (p0); |
197 | ENDPROC(_coreb_sleep) | 191 | ENDPROC(_coreb_die) |
192 | #endif | ||
198 | 193 | ||
199 | __CPUINIT | 194 | __INIT |
200 | ENTRY(_coreb_start) | 195 | ENTRY(_coreb_start) |
201 | [--sp] = reti; | 196 | [--sp] = reti; |
202 | 197 | ||
diff --git a/arch/blackfin/mach-bf561/smp.c b/arch/blackfin/mach-bf561/smp.c index 1074a7ef81c7..5d68bf613b0b 100644 --- a/arch/blackfin/mach-bf561/smp.c +++ b/arch/blackfin/mach-bf561/smp.c | |||
@@ -30,18 +30,11 @@ void __init platform_init_cpus(void) | |||
30 | 30 | ||
31 | void __init platform_prepare_cpus(unsigned int max_cpus) | 31 | void __init platform_prepare_cpus(unsigned int max_cpus) |
32 | { | 32 | { |
33 | int len; | 33 | bfin_relocate_coreb_l1_mem(); |
34 | |||
35 | len = &coreb_trampoline_end - &coreb_trampoline_start + 1; | ||
36 | BUG_ON(len > L1_CODE_LENGTH); | ||
37 | |||
38 | dma_memcpy((void *)COREB_L1_CODE_START, &coreb_trampoline_start, len); | ||
39 | 34 | ||
40 | /* Both cores ought to be present on a bf561! */ | 35 | /* Both cores ought to be present on a bf561! */ |
41 | cpu_set(0, cpu_present_map); /* CoreA */ | 36 | cpu_set(0, cpu_present_map); /* CoreA */ |
42 | cpu_set(1, cpu_present_map); /* CoreB */ | 37 | cpu_set(1, cpu_present_map); /* CoreB */ |
43 | |||
44 | printk(KERN_INFO "CoreB bootstrap code to SRAM %p via DMA.\n", (void *)COREB_L1_CODE_START); | ||
45 | } | 38 | } |
46 | 39 | ||
47 | int __init setup_profiling_timer(unsigned int multiplier) /* not supported */ | 40 | int __init setup_profiling_timer(unsigned int multiplier) /* not supported */ |
@@ -161,9 +154,13 @@ void platform_clear_ipi(unsigned int cpu, int irq) | |||
161 | void __cpuinit bfin_local_timer_setup(void) | 154 | void __cpuinit bfin_local_timer_setup(void) |
162 | { | 155 | { |
163 | #if defined(CONFIG_TICKSOURCE_CORETMR) | 156 | #if defined(CONFIG_TICKSOURCE_CORETMR) |
157 | struct irq_chip *chip = get_irq_chip(IRQ_CORETMR); | ||
158 | struct irq_desc *desc = irq_to_desc(IRQ_CORETMR); | ||
159 | |||
164 | bfin_coretmr_init(); | 160 | bfin_coretmr_init(); |
165 | bfin_coretmr_clockevent_init(); | 161 | bfin_coretmr_clockevent_init(); |
166 | get_irq_chip(IRQ_CORETMR)->unmask(IRQ_CORETMR); | 162 | |
163 | chip->irq_unmask(&desc->irq_data); | ||
167 | #else | 164 | #else |
168 | /* Power down the core timer, just to play safe. */ | 165 | /* Power down the core timer, just to play safe. */ |
169 | bfin_write_TCNTL(0); | 166 | bfin_write_TCNTL(0); |