Commit cfd84631 authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

cpufreq: armada: Free resources on error paths

The resources weren't freed on failures, free them properly.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Tested-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 67782701
...@@ -166,6 +166,7 @@ static int __init armada37xx_cpufreq_driver_init(void) ...@@ -166,6 +166,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
{ {
struct armada_37xx_dvfs *dvfs; struct armada_37xx_dvfs *dvfs;
struct platform_device *pdev; struct platform_device *pdev;
unsigned long freq;
unsigned int cur_frequency; unsigned int cur_frequency;
struct regmap *nb_pm_base; struct regmap *nb_pm_base;
struct device *cpu_dev; struct device *cpu_dev;
...@@ -207,33 +208,43 @@ static int __init armada37xx_cpufreq_driver_init(void) ...@@ -207,33 +208,43 @@ static int __init armada37xx_cpufreq_driver_init(void)
} }
dvfs = armada_37xx_cpu_freq_info_get(cur_frequency); dvfs = armada_37xx_cpu_freq_info_get(cur_frequency);
if (!dvfs) if (!dvfs) {
clk_put(clk);
return -EINVAL; return -EINVAL;
}
armada37xx_cpufreq_dvfs_setup(nb_pm_base, clk, dvfs->divider); armada37xx_cpufreq_dvfs_setup(nb_pm_base, clk, dvfs->divider);
clk_put(clk); clk_put(clk);
for (load_lvl = ARMADA_37XX_DVFS_LOAD_0; load_lvl < LOAD_LEVEL_NR; for (load_lvl = ARMADA_37XX_DVFS_LOAD_0; load_lvl < LOAD_LEVEL_NR;
load_lvl++) { load_lvl++) {
unsigned long freq = cur_frequency / dvfs->divider[load_lvl]; freq = cur_frequency / dvfs->divider[load_lvl];
ret = dev_pm_opp_add(cpu_dev, freq, 0); ret = dev_pm_opp_add(cpu_dev, freq, 0);
if (ret) { if (ret)
/* clean-up the already added opp before leaving */ goto remove_opp;
while (load_lvl-- > ARMADA_37XX_DVFS_LOAD_0) {
freq = cur_frequency / dvfs->divider[load_lvl];
dev_pm_opp_remove(cpu_dev, freq);
}
return ret;
}
} }
/* Now that everything is setup, enable the DVFS at hardware level */ /* Now that everything is setup, enable the DVFS at hardware level */
armada37xx_cpufreq_enable_dvfs(nb_pm_base); armada37xx_cpufreq_enable_dvfs(nb_pm_base);
pdev = platform_device_register_simple("cpufreq-dt", -1, NULL, 0); pdev = platform_device_register_simple("cpufreq-dt", -1, NULL, 0);
ret = PTR_ERR_OR_ZERO(pdev);
if (ret)
goto disable_dvfs;
return 0;
disable_dvfs:
armada37xx_cpufreq_disable_dvfs(nb_pm_base);
remove_opp:
/* clean-up the already added opp before leaving */
while (load_lvl-- > ARMADA_37XX_DVFS_LOAD_0) {
freq = cur_frequency / dvfs->divider[load_lvl];
dev_pm_opp_remove(cpu_dev, freq);
}
return PTR_ERR_OR_ZERO(pdev); return ret;
} }
/* late_initcall, to guarantee the driver is loaded after A37xx clock driver */ /* late_initcall, to guarantee the driver is loaded after A37xx clock driver */
late_initcall(armada37xx_cpufreq_driver_init); late_initcall(armada37xx_cpufreq_driver_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment