Initial Contribution
msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142
Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index 2b5b142..c998282 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/spinlock.h>
#include <linux/uaccess.h>
+#include <linux/irq.h>
#include <asm/cputype.h>
#include <asm/irq.h>
@@ -71,6 +72,10 @@
enum arm_perf_pmu_ids id;
const char *name;
irqreturn_t (*handle_irq)(int irq_num, void *dev);
+#ifdef CONFIG_SMP
+ void (*secondary_enable)(unsigned int irq);
+ void (*secondary_disable)(unsigned int irq);
+#endif
void (*enable)(struct hw_perf_event *evt, int idx);
void (*disable)(struct hw_perf_event *evt, int idx);
int (*get_event_idx)(struct cpu_hw_events *cpuc,
@@ -426,6 +431,10 @@
pr_warning("unable to request IRQ%d for ARM perf "
"counters\n", irq);
break;
+#ifdef CONFIG_SMP
+ } else if (armpmu->secondary_enable) {
+ armpmu->secondary_enable(irq);
+#endif
}
}
@@ -449,8 +458,13 @@
for (i = pmu_device->num_resources - 1; i >= 0; --i) {
irq = platform_get_irq(pmu_device, i);
- if (irq >= 0)
+ if (irq >= 0) {
free_irq(irq, NULL);
+#ifdef CONFIG_SMP
+ if (armpmu->secondary_disable)
+ armpmu->secondary_disable(irq);
+#endif
+ }
}
armpmu->stop();
@@ -624,6 +638,10 @@
#include "perf_event_xscale.c"
#include "perf_event_v6.c"
#include "perf_event_v7.c"
+#include "perf_event_msm.c"
+#include "perf_event_msm_l2.c"
+#include "perf_event_msm_krait.c"
+#include "perf_event_msm_krait_l2.c"
/*
* Ensure the PMU has sane values out of reset.
@@ -674,6 +692,22 @@
armpmu = xscale2pmu_init();
break;
}
+ /* Qualcomm CPUs */
+ } else if (0x51 == implementor) {
+ switch (part_number) {
+ case 0x00F0: /* 8x50 & 7x30*/
+ armpmu = armv7_scorpion_pmu_init();
+ break;
+ case 0x02D0: /* 8x60 */
+ armpmu = armv7_scorpionmp_pmu_init();
+ scorpionmp_l2_pmu_init();
+ break;
+ case 0x0490: /* 8960 sim */
+ case 0x04D0: /* 8960 */
+ armpmu = armv7_krait_pmu_init();
+ krait_l2_pmu_init();
+ break;
+ }
}
if (armpmu) {