in arm_dsu_pmu.c [706:775]
static int dsu_pmu_device_probe(struct platform_device *pdev)
{
int irq, rc;
struct dsu_pmu *dsu_pmu;
struct fwnode_handle *fwnode = dev_fwnode(&pdev->dev);
char *name;
static atomic_t pmu_idx = ATOMIC_INIT(-1);
dsu_pmu = dsu_pmu_alloc(pdev);
if (IS_ERR(dsu_pmu))
return PTR_ERR(dsu_pmu);
if (is_of_node(fwnode))
rc = dsu_pmu_dt_get_cpus(&pdev->dev, &dsu_pmu->associated_cpus);
else if (is_acpi_device_node(fwnode))
rc = dsu_pmu_acpi_get_cpus(&pdev->dev, &dsu_pmu->associated_cpus);
else
return -ENOENT;
if (rc) {
dev_warn(&pdev->dev, "Failed to parse the CPUs\n");
return rc;
}
irq = platform_get_irq(pdev, 0);
if (irq < 0)
return -EINVAL;
name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_%d",
PMUNAME, atomic_inc_return(&pmu_idx));
if (!name)
return -ENOMEM;
rc = devm_request_irq(&pdev->dev, irq, dsu_pmu_handle_irq,
IRQF_NOBALANCING, name, dsu_pmu);
if (rc) {
dev_warn(&pdev->dev, "Failed to request IRQ %d\n", irq);
return rc;
}
dsu_pmu->irq = irq;
platform_set_drvdata(pdev, dsu_pmu);
rc = cpuhp_state_add_instance(dsu_pmu_cpuhp_state,
&dsu_pmu->cpuhp_node);
if (rc)
return rc;
dsu_pmu->pmu = (struct pmu) {
.task_ctx_nr = perf_invalid_context,
.module = THIS_MODULE,
.pmu_enable = dsu_pmu_enable,
.pmu_disable = dsu_pmu_disable,
.event_init = dsu_pmu_event_init,
.add = dsu_pmu_add,
.del = dsu_pmu_del,
.start = dsu_pmu_start,
.stop = dsu_pmu_stop,
.read = dsu_pmu_read,
.attr_groups = dsu_pmu_attr_groups,
.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
};
rc = perf_pmu_register(&dsu_pmu->pmu, name, -1);
if (rc) {
cpuhp_state_remove_instance(dsu_pmu_cpuhp_state,
&dsu_pmu->cpuhp_node);
}
return rc;
}