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
This commit is contained in:
commit
0a0cf5988f
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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) {
|
||||||
|
dev_err(priv.dev, "Failed to register cpufreq driver\n");
|
||||||
|
goto out_powersave;
|
||||||
|
}
|
||||||
|
|
||||||
|
of_node_put(np);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
dev_err(priv.dev, "Failed to register cpufreq driver\n");
|
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue