Commit 0a0cf598 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'cpufreq/arm/linux-next' of...

Merge branch 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm into pm-cpufreq

Pull ARM cpufreq drivers changes for v5.2 from Viresh Kumar:

"This pull request contains:

 - Fix for possible object reference leak for few drivers (Wen Yang).
 - Fix for armada frequency calculation (Gregory).
 - Code cleanup in maple driver (Viresh).

 This contains some non-ARM bits as well this time as the patches were
 picked up from a series."

* 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
  cpufreq: armada-37xx: fix frequency calculation for opp
  cpufreq: maple: Remove redundant code from maple_cpufreq_init()
  cpufreq: ppc_cbe: fix possible object reference leak
  cpufreq: pmac32: fix possible object reference leak
  cpufreq/pasemi: fix possible object reference leak
  cpufreq: maple: fix possible object reference leak
  cpufreq: kirkwood: fix possible object reference leak
  cpufreq: imx6q: fix possible object reference leak
  cpufreq: ap806: fix possible object reference leak
parents 75b0f847 8db82563
...@@ -359,11 +359,11 @@ static int __init armada37xx_cpufreq_driver_init(void) ...@@ -359,11 +359,11 @@ 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 long freq;
unsigned int cur_frequency; unsigned int cur_frequency, base_frequency;
struct regmap *nb_pm_base, *avs_base; struct regmap *nb_pm_base, *avs_base;
struct device *cpu_dev; struct device *cpu_dev;
int load_lvl, ret; int load_lvl, ret;
struct clk *clk; struct clk *clk, *parent;
nb_pm_base = nb_pm_base =
syscon_regmap_lookup_by_compatible("marvell,armada-3700-nb-pm"); syscon_regmap_lookup_by_compatible("marvell,armada-3700-nb-pm");
...@@ -399,6 +399,22 @@ static int __init armada37xx_cpufreq_driver_init(void) ...@@ -399,6 +399,22 @@ static int __init armada37xx_cpufreq_driver_init(void)
return PTR_ERR(clk); return PTR_ERR(clk);
} }
parent = clk_get_parent(clk);
if (IS_ERR(parent)) {
dev_err(cpu_dev, "Cannot get parent clock for CPU0\n");
clk_put(clk);
return PTR_ERR(parent);
}
/* Get parent CPU frequency */
base_frequency = clk_get_rate(parent);
if (!base_frequency) {
dev_err(cpu_dev, "Failed to get parent clock rate for CPU\n");
clk_put(clk);
return -EINVAL;
}
/* Get nominal (current) CPU frequency */ /* Get nominal (current) CPU frequency */
cur_frequency = clk_get_rate(clk); cur_frequency = clk_get_rate(clk);
if (!cur_frequency) { if (!cur_frequency) {
...@@ -431,7 +447,7 @@ static int __init armada37xx_cpufreq_driver_init(void) ...@@ -431,7 +447,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
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 u_volt = avs_map[dvfs->avs[load_lvl]] * 1000; unsigned long u_volt = avs_map[dvfs->avs[load_lvl]] * 1000;
freq = cur_frequency / dvfs->divider[load_lvl]; freq = base_frequency / dvfs->divider[load_lvl];
ret = dev_pm_opp_add(cpu_dev, freq, u_volt); ret = dev_pm_opp_add(cpu_dev, freq, u_volt);
if (ret) if (ret)
goto remove_opp; goto remove_opp;
......
...@@ -132,6 +132,7 @@ static int __init armada_8k_cpufreq_init(void) ...@@ -132,6 +132,7 @@ static int __init armada_8k_cpufreq_init(void)
of_node_put(node); of_node_put(node);
return -ENODEV; return -ENODEV;
} }
of_node_put(node);
nb_cpus = num_possible_cpus(); nb_cpus = num_possible_cpus();
freq_tables = kcalloc(nb_cpus, sizeof(*freq_tables), GFP_KERNEL); freq_tables = kcalloc(nb_cpus, sizeof(*freq_tables), GFP_KERNEL);
......
...@@ -388,11 +388,11 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev) ...@@ -388,11 +388,11 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev)
ret = imx6ul_opp_check_speed_grading(cpu_dev); ret = imx6ul_opp_check_speed_grading(cpu_dev);
if (ret) { if (ret) {
if (ret == -EPROBE_DEFER) if (ret == -EPROBE_DEFER)
return ret; goto put_node;
dev_err(cpu_dev, "failed to read ocotp: %d\n", dev_err(cpu_dev, "failed to read ocotp: %d\n",
ret); ret);
return ret; goto put_node;
} }
} else { } else {
imx6q_opp_check_speed_grading(cpu_dev); imx6q_opp_check_speed_grading(cpu_dev);
......
...@@ -124,13 +124,14 @@ static int kirkwood_cpufreq_probe(struct platform_device *pdev) ...@@ -124,13 +124,14 @@ static int kirkwood_cpufreq_probe(struct platform_device *pdev)
priv.cpu_clk = of_clk_get_by_name(np, "cpu_clk"); priv.cpu_clk = of_clk_get_by_name(np, "cpu_clk");
if (IS_ERR(priv.cpu_clk)) { if (IS_ERR(priv.cpu_clk)) {
dev_err(priv.dev, "Unable to get cpuclk\n"); dev_err(priv.dev, "Unable to get cpuclk\n");
return PTR_ERR(priv.cpu_clk); err = PTR_ERR(priv.cpu_clk);
goto out_node;
} }
err = clk_prepare_enable(priv.cpu_clk); err = clk_prepare_enable(priv.cpu_clk);
if (err) { if (err) {
dev_err(priv.dev, "Unable to prepare cpuclk\n"); dev_err(priv.dev, "Unable to prepare cpuclk\n");
return err; goto out_node;
} }
kirkwood_freq_table[0].frequency = clk_get_rate(priv.cpu_clk) / 1000; kirkwood_freq_table[0].frequency = clk_get_rate(priv.cpu_clk) / 1000;
...@@ -161,20 +162,22 @@ static int kirkwood_cpufreq_probe(struct platform_device *pdev) ...@@ -161,20 +162,22 @@ static int kirkwood_cpufreq_probe(struct platform_device *pdev)
goto out_ddr; goto out_ddr;
} }
of_node_put(np);
np = NULL;
err = cpufreq_register_driver(&kirkwood_cpufreq_driver); err = cpufreq_register_driver(&kirkwood_cpufreq_driver);
if (!err) if (err) {
return 0; dev_err(priv.dev, "Failed to register cpufreq driver\n");
goto out_powersave;
}
dev_err(priv.dev, "Failed to register cpufreq driver\n"); of_node_put(np);
return 0;
out_powersave:
clk_disable_unprepare(priv.powersave_clk); clk_disable_unprepare(priv.powersave_clk);
out_ddr: out_ddr:
clk_disable_unprepare(priv.ddr_clk); clk_disable_unprepare(priv.ddr_clk);
out_cpu: out_cpu:
clk_disable_unprepare(priv.cpu_clk); clk_disable_unprepare(priv.cpu_clk);
out_node:
of_node_put(np); of_node_put(np);
return err; return err;
......
...@@ -210,7 +210,7 @@ static int __init maple_cpufreq_init(void) ...@@ -210,7 +210,7 @@ static int __init maple_cpufreq_init(void)
*/ */
valp = of_get_property(cpunode, "clock-frequency", NULL); valp = of_get_property(cpunode, "clock-frequency", NULL);
if (!valp) if (!valp)
return -ENODEV; goto bail_noprops;
max_freq = (*valp)/1000; max_freq = (*valp)/1000;
maple_cpu_freqs[0].frequency = max_freq; maple_cpu_freqs[0].frequency = max_freq;
maple_cpu_freqs[1].frequency = max_freq/2; maple_cpu_freqs[1].frequency = max_freq/2;
...@@ -231,10 +231,6 @@ static int __init maple_cpufreq_init(void) ...@@ -231,10 +231,6 @@ static int __init maple_cpufreq_init(void)
rc = cpufreq_register_driver(&maple_cpufreq_driver); rc = cpufreq_register_driver(&maple_cpufreq_driver);
of_node_put(cpunode);
return rc;
bail_noprops: bail_noprops:
of_node_put(cpunode); of_node_put(cpunode);
......
...@@ -146,6 +146,7 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) ...@@ -146,6 +146,7 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)
cpu = of_get_cpu_node(policy->cpu, NULL); cpu = of_get_cpu_node(policy->cpu, NULL);
of_node_put(cpu);
if (!cpu) if (!cpu)
goto out; goto out;
......
...@@ -552,6 +552,7 @@ static int pmac_cpufreq_init_7447A(struct device_node *cpunode) ...@@ -552,6 +552,7 @@ static int pmac_cpufreq_init_7447A(struct device_node *cpunode)
volt_gpio_np = of_find_node_by_name(NULL, "cpu-vcore-select"); volt_gpio_np = of_find_node_by_name(NULL, "cpu-vcore-select");
if (volt_gpio_np) if (volt_gpio_np)
voltage_gpio = read_gpio(volt_gpio_np); voltage_gpio = read_gpio(volt_gpio_np);
of_node_put(volt_gpio_np);
if (!voltage_gpio){ if (!voltage_gpio){
pr_err("missing cpu-vcore-select gpio\n"); pr_err("missing cpu-vcore-select gpio\n");
return 1; return 1;
...@@ -588,6 +589,7 @@ static int pmac_cpufreq_init_750FX(struct device_node *cpunode) ...@@ -588,6 +589,7 @@ static int pmac_cpufreq_init_750FX(struct device_node *cpunode)
if (volt_gpio_np) if (volt_gpio_np)
voltage_gpio = read_gpio(volt_gpio_np); voltage_gpio = read_gpio(volt_gpio_np);
of_node_put(volt_gpio_np);
pvr = mfspr(SPRN_PVR); pvr = mfspr(SPRN_PVR);
has_cpu_l2lve = !((pvr & 0xf00) == 0x100); has_cpu_l2lve = !((pvr & 0xf00) == 0x100);
......
...@@ -86,6 +86,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy) ...@@ -86,6 +86,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy *policy)
if (!cbe_get_cpu_pmd_regs(policy->cpu) || if (!cbe_get_cpu_pmd_regs(policy->cpu) ||
!cbe_get_cpu_mic_tm_regs(policy->cpu)) { !cbe_get_cpu_mic_tm_regs(policy->cpu)) {
pr_info("invalid CBE regs pointers for cpufreq\n"); pr_info("invalid CBE regs pointers for cpufreq\n");
of_node_put(cpu);
return -EINVAL; return -EINVAL;
} }
......
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