diff options
Diffstat (limited to 'arch/mips/oprofile/op_model_mipsxx.c')
-rw-r--r-- | arch/mips/oprofile/op_model_mipsxx.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index 42821ae2d77e..01f721a85c5b 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
12 | #include <linux/smp.h> | 12 | #include <linux/smp.h> |
13 | #include <asm/irq_regs.h> | 13 | #include <asm/irq_regs.h> |
14 | #include <asm/time.h> | ||
14 | 15 | ||
15 | #include "op_impl.h" | 16 | #include "op_impl.h" |
16 | 17 | ||
@@ -35,6 +36,7 @@ | |||
35 | #define M_PERFCTL_COUNT_ALL_THREADS (1UL << 13) | 36 | #define M_PERFCTL_COUNT_ALL_THREADS (1UL << 13) |
36 | 37 | ||
37 | static int (*save_perf_irq)(void); | 38 | static int (*save_perf_irq)(void); |
39 | static int perfcount_irq; | ||
38 | 40 | ||
39 | /* | 41 | /* |
40 | * XLR has only one set of counters per core. Designate the | 42 | * XLR has only one set of counters per core. Designate the |
@@ -431,8 +433,16 @@ static int __init mipsxx_init(void) | |||
431 | save_perf_irq = perf_irq; | 433 | save_perf_irq = perf_irq; |
432 | perf_irq = mipsxx_perfcount_handler; | 434 | perf_irq = mipsxx_perfcount_handler; |
433 | 435 | ||
434 | if ((cp0_perfcount_irq >= 0) && (cp0_compare_irq != cp0_perfcount_irq)) | 436 | if (get_c0_perfcount_int) |
435 | return request_irq(cp0_perfcount_irq, mipsxx_perfcount_int, | 437 | perfcount_irq = get_c0_perfcount_int(); |
438 | else if ((cp0_perfcount_irq >= 0) && | ||
439 | (cp0_compare_irq != cp0_perfcount_irq)) | ||
440 | perfcount_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq; | ||
441 | else | ||
442 | perfcount_irq = -1; | ||
443 | |||
444 | if (perfcount_irq >= 0) | ||
445 | return request_irq(perfcount_irq, mipsxx_perfcount_int, | ||
436 | 0, "Perfcounter", save_perf_irq); | 446 | 0, "Perfcounter", save_perf_irq); |
437 | 447 | ||
438 | return 0; | 448 | return 0; |
@@ -442,8 +452,8 @@ static void mipsxx_exit(void) | |||
442 | { | 452 | { |
443 | int counters = op_model_mipsxx_ops.num_counters; | 453 | int counters = op_model_mipsxx_ops.num_counters; |
444 | 454 | ||
445 | if ((cp0_perfcount_irq >= 0) && (cp0_compare_irq != cp0_perfcount_irq)) | 455 | if (perfcount_irq >= 0) |
446 | free_irq(cp0_perfcount_irq, save_perf_irq); | 456 | free_irq(perfcount_irq, save_perf_irq); |
447 | 457 | ||
448 | counters = counters_per_cpu_to_total(counters); | 458 | counters = counters_per_cpu_to_total(counters); |
449 | on_each_cpu(reset_counters, (void *)(long)counters, 1); | 459 | on_each_cpu(reset_counters, (void *)(long)counters, 1); |