csky: Init pmu as a device
authorMao Han <han_mao@c-sky.com>
Tue, 4 Jun 2019 10:54:44 +0000 (18:54 +0800)
committerGuo Ren <ren_guo@c-sky.com>
Fri, 19 Jul 2019 06:21:36 +0000 (14:21 +0800)
This patch change the csky pmu initialization from arch init to
device init. The pmu can be configued with information from
device tree(pmu device name, irq number and etc.).

Signed-off-by: Mao Han <han_mao@c-sky.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
arch/csky/kernel/perf_event.c

index 376c972f5f372377b7672928763c2a35e2ebbde8..2282554840c628a7daac1275bff5f01bbc3e681e 100644 (file)
@@ -949,7 +949,7 @@ static int csky_pmu_add(struct perf_event *event, int flags)
        return 0;
 }
 
-int __init init_hw_perf_events(void)
+int init_hw_perf_events(void)
 {
        csky_pmu.pmu = (struct pmu) {
                .pmu_enable     = csky_pmu_enable,
@@ -1028,4 +1028,50 @@ int __init init_hw_perf_events(void)
 
        return perf_pmu_register(&csky_pmu.pmu, "cpu", PERF_TYPE_RAW);
 }
-arch_initcall(init_hw_perf_events);
+
+int csky_pmu_device_probe(struct platform_device *pdev,
+                         const struct of_device_id *of_table)
+{
+       int ret;
+
+       ret = init_hw_perf_events();
+       if (ret) {
+               pr_notice("[perf] failed to probe PMU!\n");
+               return ret;
+       }
+
+       return ret;
+}
+
+const static struct of_device_id csky_pmu_of_device_ids[] = {
+       {.compatible = "csky,csky-pmu"},
+       {},
+};
+
+static int csky_pmu_dev_probe(struct platform_device *pdev)
+{
+       return csky_pmu_device_probe(pdev, csky_pmu_of_device_ids);
+}
+
+static struct platform_driver csky_pmu_driver = {
+       .driver = {
+                  .name = "csky-pmu",
+                  .of_match_table = csky_pmu_of_device_ids,
+                  },
+       .probe = csky_pmu_dev_probe,
+};
+
+static int __init csky_pmu_probe(void)
+{
+       int ret;
+
+       ret = platform_driver_register(&csky_pmu_driver);
+       if (ret)
+               pr_notice("[perf] PMU initialization failed\n");
+       else
+               pr_notice("[perf] PMU initialization done\n");
+
+       return ret;
+}
+
+device_initcall(csky_pmu_probe);