]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/alpha/kernel/perf_event.c
perf: Register PMU implementations
[mv-sheeva.git] / arch / alpha / kernel / perf_event.c
index 56fa4159038164ce4e2fe5fdc53116073ade6001..19660b5c298f2a4737593bda896add54c858e1ed 100644 (file)
@@ -642,34 +642,39 @@ static int __hw_perf_event_init(struct perf_event *event)
        return 0;
 }
 
-static struct pmu pmu = {
-       .enable         = alpha_pmu_enable,
-       .disable        = alpha_pmu_disable,
-       .read           = alpha_pmu_read,
-       .unthrottle     = alpha_pmu_unthrottle,
-};
-
-
 /*
  * Main entry point to initialise a HW performance event.
  */
-struct pmu *hw_perf_event_init(struct perf_event *event)
+static int alpha_pmu_event_init(struct perf_event *event)
 {
        int err;
 
+       switch (event->attr.type) {
+       case PERF_TYPE_RAW:
+       case PERF_TYPE_HARDWARE:
+       case PERF_TYPE_HW_CACHE:
+               break;
+
+       default:
+               return -ENOENT;
+       }
+
        if (!alpha_pmu)
-               return ERR_PTR(-ENODEV);
+               return -ENODEV;
 
        /* Do the real initialisation work. */
        err = __hw_perf_event_init(event);
 
-       if (err)
-               return ERR_PTR(err);
-
-       return &pmu;
+       return err;
 }
 
-
+static struct pmu pmu = {
+       .event_init     = alpha_pmu_event_init,
+       .enable         = alpha_pmu_enable,
+       .disable        = alpha_pmu_disable,
+       .read           = alpha_pmu_read,
+       .unthrottle     = alpha_pmu_unthrottle,
+};
 
 /*
  * Main entry point - enable HW performance counters.
@@ -838,5 +843,7 @@ void __init init_hw_perf_events(void)
        /* And set up PMU specification */
        alpha_pmu = &ev67_pmu;
        perf_max_events = alpha_pmu->num_pmcs;
+
+       perf_pmu_register(&pmu);
 }