]> git.karo-electronics.de Git - linux-beck.git/commitdiff
arm: perf: share arm_pmu_device_probe
authorMark Rutland <mark.rutland@arm.com>
Tue, 26 May 2015 16:23:35 +0000 (17:23 +0100)
committerWill Deacon <will.deacon@arm.com>
Thu, 28 May 2015 15:54:06 +0000 (16:54 +0100)
Enable the probe function to be shared with other drivers, which will
inject the appropriate of_device_id and pmu_probe_info tables.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm/include/asm/pmu.h
arch/arm/kernel/perf_event_cpu.c

index 62464a425499d1ddd2d645d64041215d729b2d05..3fc87dfd77e61f89628958b6eed462b770719e08 100644 (file)
@@ -145,6 +145,10 @@ struct pmu_probe_info {
 #define XSCALE_PMU_PROBE(_version, _fn) \
        PMU_PROBE(ARM_CPU_IMP_INTEL << 24 | _version, ARM_PMU_XSCALE_MASK, _fn)
 
+int arm_pmu_device_probe(struct platform_device *pdev,
+                        const struct of_device_id *of_table,
+                        const struct pmu_probe_info *probe_table);
+
 #endif /* CONFIG_HW_PERF_EVENTS */
 
 #endif /* __ARM_PMU_H__ */
index 14a5a0a5ec1d8afb22857dc9e86ffd239b73e858..797b56999b0e2ed1f1e3fa6680e4380f915c0e7b 100644 (file)
@@ -286,16 +286,16 @@ static const struct pmu_probe_info pmu_probe_table[] = {
 /*
  * CPU PMU identification and probing.
  */
-static int probe_current_pmu(struct arm_pmu *pmu)
+static int probe_current_pmu(struct arm_pmu *pmu,
+                            const struct pmu_probe_info *info)
 {
        int cpu = get_cpu();
        unsigned int cpuid = read_cpuid_id();
        int ret = -ENODEV;
-       const struct pmu_probe_info *info;
 
        pr_info("probing PMU on CPU %d\n", cpu);
 
-       for (info = pmu_probe_table; info->init != NULL; info++) {
+       for (; info->init != NULL; info++) {
                if ((cpuid & info->mask) != info->cpuid)
                        continue;
                ret = info->init(pmu);
@@ -352,7 +352,9 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu)
        return 0;
 }
 
-static int cpu_pmu_device_probe(struct platform_device *pdev)
+int arm_pmu_device_probe(struct platform_device *pdev,
+                        const struct of_device_id *of_table,
+                        const struct pmu_probe_info *probe_table)
 {
        const struct of_device_id *of_id;
        const int (*init_fn)(struct arm_pmu *);
@@ -371,14 +373,14 @@ static int cpu_pmu_device_probe(struct platform_device *pdev)
 
        pmu->plat_device = pdev;
 
-       if (node && (of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node))) {
+       if (node && (of_id = of_match_node(of_table, pdev->dev.of_node))) {
                init_fn = of_id->data;
 
                ret = of_pmu_irq_cfg(pmu);
                if (!ret)
                        ret = init_fn(pmu);
        } else {
-               ret = probe_current_pmu(pmu);
+               ret = probe_current_pmu(pmu, probe_table);
                cpumask_setall(&pmu->supported_cpus);
        }
 
@@ -405,6 +407,12 @@ out_free:
        return ret;
 }
 
+static int cpu_pmu_device_probe(struct platform_device *pdev)
+{
+       return arm_pmu_device_probe(pdev, cpu_pmu_of_device_ids,
+                                   pmu_probe_table);
+}
+
 static struct platform_driver cpu_pmu_driver = {
        .driver         = {
                .name   = "arm-pmu",