diff options
Diffstat (limited to 'arch/sparc/kernel/leon_smp.c')
-rw-r--r-- | arch/sparc/kernel/leon_smp.c | 34 |
1 files changed, 4 insertions, 30 deletions
diff --git a/arch/sparc/kernel/leon_smp.c b/arch/sparc/kernel/leon_smp.c index 1210fde18740..6173f4d82ded 100644 --- a/arch/sparc/kernel/leon_smp.c +++ b/arch/sparc/kernel/leon_smp.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/pm.h> | 23 | #include <linux/pm.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/gfp.h> | 25 | #include <linux/gfp.h> |
26 | #include <linux/cpu.h> | ||
27 | #include <linux/clockchips.h> | ||
26 | 28 | ||
27 | #include <asm/cacheflush.h> | 29 | #include <asm/cacheflush.h> |
28 | #include <asm/tlbflush.h> | 30 | #include <asm/tlbflush.h> |
@@ -42,6 +44,7 @@ | |||
42 | #include <asm/asi.h> | 44 | #include <asm/asi.h> |
43 | #include <asm/leon.h> | 45 | #include <asm/leon.h> |
44 | #include <asm/leon_amba.h> | 46 | #include <asm/leon_amba.h> |
47 | #include <asm/timer.h> | ||
45 | 48 | ||
46 | #include "kernel.h" | 49 | #include "kernel.h" |
47 | 50 | ||
@@ -68,8 +71,6 @@ static inline unsigned long do_swap(volatile unsigned long *ptr, | |||
68 | return val; | 71 | return val; |
69 | } | 72 | } |
70 | 73 | ||
71 | static void smp_setup_percpu_timer(void); | ||
72 | |||
73 | void __cpuinit leon_callin(void) | 74 | void __cpuinit leon_callin(void) |
74 | { | 75 | { |
75 | int cpuid = hard_smpleon_processor_id(); | 76 | int cpuid = hard_smpleon_processor_id(); |
@@ -79,7 +80,7 @@ void __cpuinit leon_callin(void) | |||
79 | leon_configure_cache_smp(); | 80 | leon_configure_cache_smp(); |
80 | 81 | ||
81 | /* Get our local ticker going. */ | 82 | /* Get our local ticker going. */ |
82 | smp_setup_percpu_timer(); | 83 | register_percpu_ce(cpuid); |
83 | 84 | ||
84 | calibrate_delay(); | 85 | calibrate_delay(); |
85 | smp_store_cpu_info(cpuid); | 86 | smp_store_cpu_info(cpuid); |
@@ -196,7 +197,6 @@ void __init leon_boot_cpus(void) | |||
196 | leon_smp_setbroadcast(1 << LEON3_IRQ_TICKER); | 197 | leon_smp_setbroadcast(1 << LEON3_IRQ_TICKER); |
197 | 198 | ||
198 | leon_configure_cache_smp(); | 199 | leon_configure_cache_smp(); |
199 | smp_setup_percpu_timer(); | ||
200 | local_flush_cache_all(); | 200 | local_flush_cache_all(); |
201 | 201 | ||
202 | } | 202 | } |
@@ -489,32 +489,6 @@ void leon_cross_call_irq(void) | |||
489 | ccall_info.processors_out[i] = 1; | 489 | ccall_info.processors_out[i] = 1; |
490 | } | 490 | } |
491 | 491 | ||
492 | irqreturn_t leon_percpu_timer_interrupt(int irq, void *unused) | ||
493 | { | ||
494 | int cpu = smp_processor_id(); | ||
495 | |||
496 | leon_clear_profile_irq(cpu); | ||
497 | |||
498 | profile_tick(CPU_PROFILING); | ||
499 | |||
500 | if (!--prof_counter(cpu)) { | ||
501 | int user = user_mode(get_irq_regs()); | ||
502 | |||
503 | update_process_times(user); | ||
504 | |||
505 | prof_counter(cpu) = prof_multiplier(cpu); | ||
506 | } | ||
507 | |||
508 | return IRQ_HANDLED; | ||
509 | } | ||
510 | |||
511 | static void __init smp_setup_percpu_timer(void) | ||
512 | { | ||
513 | int cpu = smp_processor_id(); | ||
514 | |||
515 | prof_counter(cpu) = prof_multiplier(cpu) = 1; | ||
516 | } | ||
517 | |||
518 | void __init leon_blackbox_id(unsigned *addr) | 492 | void __init leon_blackbox_id(unsigned *addr) |
519 | { | 493 | { |
520 | int rd = *addr & 0x3e000000; | 494 | int rd = *addr & 0x3e000000; |