diff options
Diffstat (limited to 'drivers/perf/fsl_imx8_ddr_perf.c')
| -rw-r--r-- | drivers/perf/fsl_imx8_ddr_perf.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c index 55083c67b2bb..95dca2cb5265 100644 --- a/drivers/perf/fsl_imx8_ddr_perf.c +++ b/drivers/perf/fsl_imx8_ddr_perf.c @@ -633,13 +633,17 @@ static int ddr_perf_probe(struct platform_device *pdev)  	if (ret < 0) {  		dev_err(&pdev->dev, "cpuhp_setup_state_multi failed\n"); -		goto ddr_perf_err; +		goto cpuhp_state_err;  	}  	pmu->cpuhp_state = ret;  	/* Register the pmu instance for cpu hotplug */ -	cpuhp_state_add_instance_nocalls(pmu->cpuhp_state, &pmu->node); +	ret = cpuhp_state_add_instance_nocalls(pmu->cpuhp_state, &pmu->node); +	if (ret) { +		dev_err(&pdev->dev, "Error %d registering hotplug\n", ret); +		goto cpuhp_instance_err; +	}  	/* Request irq */  	irq = of_irq_get(np, 0); @@ -673,9 +677,10 @@ static int ddr_perf_probe(struct platform_device *pdev)  	return 0;  ddr_perf_err: -	if (pmu->cpuhp_state) -		cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node); - +	cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node); +cpuhp_instance_err: +	cpuhp_remove_multi_state(pmu->cpuhp_state); +cpuhp_state_err:  	ida_simple_remove(&ddr_ida, pmu->id);  	dev_warn(&pdev->dev, "i.MX8 DDR Perf PMU failed (%d), disabled\n", ret);  	return ret; @@ -686,6 +691,7 @@ static int ddr_perf_remove(struct platform_device *pdev)  	struct ddr_pmu *pmu = platform_get_drvdata(pdev);  	cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node); +	cpuhp_remove_multi_state(pmu->cpuhp_state);  	irq_set_affinity_hint(pmu->irq, NULL);  	perf_pmu_unregister(&pmu->pmu);  |