summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMao Han <han_mao@c-sky.com>2019-06-04 18:54:44 +0800
committerGuo Ren <ren_guo@c-sky.com>2019-07-19 14:21:36 +0800
commitf132076c8ff9ec1603c7079c3ce3b2cce8b72a89 (patch)
tree3840019f0765c0d7dee3a13745ccd786828c606d /arch
parent3158d28953fcd85492b28b1d2d5a5e20bb62a626 (diff)
downloadlinux-f132076c8ff9ec1603c7079c3ce3b2cce8b72a89.tar.bz2
csky: Init pmu as a device
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/csky/kernel/perf_event.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/arch/csky/kernel/perf_event.c b/arch/csky/kernel/perf_event.c
index 376c972f5f37..2282554840c6 100644
--- a/arch/csky/kernel/perf_event.c
+++ b/arch/csky/kernel/perf_event.c
@@ -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);