[PATCH v2] cpufreq: apple-soc: Fix OPP table cleanup
Haoxiang Li <[email protected]>
| Newsgroups | dev.linux.lists.asahi,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[email protected]> |
dev_pm_opp_of_add_table() adds the DT OPP table but not all failure paths remove it. The driver also uses dev_pm_opp_remove_all_dynamic(), which is not the right cleanup helper for OPPs loaded from firmware. Remove the DT OPP table with dev_pm_opp_of_remove_table() on init failure paths and from apple_soc_cpufreq_exit(). Signed-off-by: Haoxiang Li <[email protected]> --- Changes in v2: - Remove unnecessary cleanup calls. - Remove OPP table from apple_soc_cpufreq_exit(). Thanks, Viresh! --- drivers/cpufreq/apple-soc-cpufreq.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/cpufreq/apple-soc-cpufreq.c b/drivers/cpufreq/apple-soc-cpufreq.c index 638e5bf72185..977d56fc4fa0 100644 --- a/drivers/cpufreq/apple-soc-cpufreq.c +++ b/drivers/cpufreq/apple-soc-cpufreq.c @@ -258,7 +258,7 @@ static int apple_soc_cpufreq_init(struct cpufreq_policy *policy) ret = apple_soc_cpufreq_find_cluster(policy, ®_base, &info); if (ret) { dev_err(cpu_dev, "%s: failed to get cluster info: %d\n", __func__, ret); - return ret; + goto out_remove_opp_table; } ret = dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); @@ -271,13 +271,13 @@ static int apple_soc_cpufreq_init(struct cpufreq_policy *policy) if (ret <= 0) { dev_dbg(cpu_dev, "OPP table is not ready, deferring probe\n"); ret = -EPROBE_DEFER; - goto out_free_opp; + goto out_iounmap; } priv = kzalloc_obj(*priv); if (!priv) { ret = -ENOMEM; - goto out_free_opp; + goto out_iounmap; } ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); @@ -320,10 +320,10 @@ static int apple_soc_cpufreq_init(struct cpufreq_policy *policy) dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); out_free_priv: kfree(priv); -out_free_opp: - dev_pm_opp_remove_all_dynamic(cpu_dev); out_iounmap: iounmap(reg_base); +out_remove_opp_table: + dev_pm_opp_of_remove_table(cpu_dev); return ret; } @@ -332,7 +332,7 @@ static void apple_soc_cpufreq_exit(struct cpufreq_policy *policy) struct apple_cpu_priv *priv = policy->driver_data; dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); - dev_pm_opp_remove_all_dynamic(priv->cpu_dev); + dev_pm_opp_of_remove_table(priv->cpu_dev); iounmap(priv->reg_base); kfree(priv); } -- 2.25.1