Commit 49cd000d authored by Viresh Kumar's avatar Viresh Kumar

cpufreq: qcom-nvmem: Migrate to dev_pm_opp_set_config()

The OPP core now provides a unified API for setting all configuration
types, i.e. dev_pm_opp_set_config().

Lets start using it.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 11b9b663
...@@ -55,9 +55,7 @@ struct qcom_cpufreq_match_data { ...@@ -55,9 +55,7 @@ struct qcom_cpufreq_match_data {
}; };
struct qcom_cpufreq_drv { struct qcom_cpufreq_drv {
struct opp_table **names_opp_tables; int *opp_tokens;
struct opp_table **hw_opp_tables;
struct opp_table **genpd_opp_tables;
u32 versions; u32 versions;
const struct qcom_cpufreq_match_data *data; const struct qcom_cpufreq_match_data *data;
}; };
...@@ -315,72 +313,43 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) ...@@ -315,72 +313,43 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
} }
of_node_put(np); of_node_put(np);
drv->names_opp_tables = kcalloc(num_possible_cpus(), drv->opp_tokens = kcalloc(num_possible_cpus(), sizeof(*drv->opp_tokens),
sizeof(*drv->names_opp_tables),
GFP_KERNEL); GFP_KERNEL);
if (!drv->names_opp_tables) { if (!drv->opp_tokens) {
ret = -ENOMEM; ret = -ENOMEM;
goto free_drv; goto free_drv;
} }
drv->hw_opp_tables = kcalloc(num_possible_cpus(),
sizeof(*drv->hw_opp_tables),
GFP_KERNEL);
if (!drv->hw_opp_tables) {
ret = -ENOMEM;
goto free_opp_names;
}
drv->genpd_opp_tables = kcalloc(num_possible_cpus(),
sizeof(*drv->genpd_opp_tables),
GFP_KERNEL);
if (!drv->genpd_opp_tables) {
ret = -ENOMEM;
goto free_opp;
}
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
struct dev_pm_opp_config config = {
.supported_hw = NULL,
};
cpu_dev = get_cpu_device(cpu); cpu_dev = get_cpu_device(cpu);
if (NULL == cpu_dev) { if (NULL == cpu_dev) {
ret = -ENODEV; ret = -ENODEV;
goto free_genpd_opp; goto free_opp;
} }
if (drv->data->get_version) { if (drv->data->get_version) {
config.supported_hw = &drv->versions;
config.supported_hw_count = 1;
if (pvs_name) { if (pvs_name)
drv->names_opp_tables[cpu] = dev_pm_opp_set_prop_name( config.prop_name = pvs_name;
cpu_dev,
pvs_name);
if (IS_ERR(drv->names_opp_tables[cpu])) {
ret = PTR_ERR(drv->names_opp_tables[cpu]);
dev_err(cpu_dev, "Failed to add OPP name %s\n",
pvs_name);
goto free_opp;
}
}
drv->hw_opp_tables[cpu] = dev_pm_opp_set_supported_hw(
cpu_dev, &drv->versions, 1);
if (IS_ERR(drv->hw_opp_tables[cpu])) {
ret = PTR_ERR(drv->hw_opp_tables[cpu]);
dev_err(cpu_dev,
"Failed to set supported hardware\n");
goto free_genpd_opp;
}
} }
if (drv->data->genpd_names) { if (drv->data->genpd_names) {
drv->genpd_opp_tables[cpu] = config.genpd_names = drv->data->genpd_names;
dev_pm_opp_attach_genpd(cpu_dev, config.virt_devs = NULL;
drv->data->genpd_names, }
NULL);
if (IS_ERR(drv->genpd_opp_tables[cpu])) { if (config.supported_hw || config.genpd_names) {
ret = PTR_ERR(drv->genpd_opp_tables[cpu]); drv->opp_tokens[cpu] = dev_pm_opp_set_config(cpu_dev, &config);
if (ret != -EPROBE_DEFER) if (drv->opp_tokens[cpu] < 0) {
dev_err(cpu_dev, ret = drv->opp_tokens[cpu];
"Could not attach to pm_domain: %d\n", dev_err(cpu_dev, "Failed to set OPP config\n");
ret); goto free_opp;
goto free_genpd_opp;
} }
} }
} }
...@@ -395,27 +364,10 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) ...@@ -395,27 +364,10 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
ret = PTR_ERR(cpufreq_dt_pdev); ret = PTR_ERR(cpufreq_dt_pdev);
dev_err(cpu_dev, "Failed to register platform device\n"); dev_err(cpu_dev, "Failed to register platform device\n");
free_genpd_opp:
for_each_possible_cpu(cpu) {
if (IS_ERR(drv->genpd_opp_tables[cpu]))
break;
dev_pm_opp_detach_genpd(drv->genpd_opp_tables[cpu]);
}
kfree(drv->genpd_opp_tables);
free_opp: free_opp:
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu)
if (IS_ERR(drv->names_opp_tables[cpu])) dev_pm_opp_clear_config(drv->opp_tokens[cpu]);
break; kfree(drv->opp_tokens);
dev_pm_opp_put_prop_name(drv->names_opp_tables[cpu]);
}
for_each_possible_cpu(cpu) {
if (IS_ERR(drv->hw_opp_tables[cpu]))
break;
dev_pm_opp_put_supported_hw(drv->hw_opp_tables[cpu]);
}
kfree(drv->hw_opp_tables);
free_opp_names:
kfree(drv->names_opp_tables);
free_drv: free_drv:
kfree(drv); kfree(drv);
...@@ -429,15 +381,10 @@ static int qcom_cpufreq_remove(struct platform_device *pdev) ...@@ -429,15 +381,10 @@ static int qcom_cpufreq_remove(struct platform_device *pdev)
platform_device_unregister(cpufreq_dt_pdev); platform_device_unregister(cpufreq_dt_pdev);
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu)
dev_pm_opp_put_supported_hw(drv->names_opp_tables[cpu]); dev_pm_opp_clear_config(drv->opp_tokens[cpu]);
dev_pm_opp_put_supported_hw(drv->hw_opp_tables[cpu]);
dev_pm_opp_detach_genpd(drv->genpd_opp_tables[cpu]);
}
kfree(drv->names_opp_tables); kfree(drv->opp_tokens);
kfree(drv->hw_opp_tables);
kfree(drv->genpd_opp_tables);
kfree(drv); kfree(drv);
return 0; return 0;
......
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