cpufreq: Init cpufreq only for present CPUs
for_each_possible_cpu() is currently used to initialize cpufreq.
However, in cpu_dev_register_generic(), for_each_present_cpu()
is used to register CPU devices which means the CPU devices are
only registered for present CPUs and not all possible CPUs.
With nosmp or maxcpus=0, only the boot CPU is present, lead
to the cpufreq probe failure or defer probe due to no cpu device
available for not present CPUs.
Change for_each_possible_cpu() to for_each_present_cpu() in the
above cpufreq drivers to ensure it only registers cpufreq for
CPUs that are actually present.
Fixes: b0c69e1214 ("drivers: base: Use present CPUs in GENERIC_CPU_DEVICES")
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Jacky Bai <ping.bai@nxp.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
pull/1184/head
parent
be4ae8c194
commit
45f589b716
|
|
@ -47,7 +47,7 @@ static void __init armada_8k_get_sharing_cpus(struct clk *cur_clk,
|
|||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
struct device *cpu_dev;
|
||||
struct clk *clk;
|
||||
|
||||
|
|
|
|||
|
|
@ -283,7 +283,7 @@ static int dt_cpufreq_probe(struct platform_device *pdev)
|
|||
int ret, cpu;
|
||||
|
||||
/* Request resources early so we can return in case of -EPROBE_DEFER */
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
ret = dt_cpufreq_early_init(&pdev->dev, cpu);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -303,7 +303,7 @@ static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
|
|||
struct regulator *cpu_reg;
|
||||
|
||||
/* Make sure that all CPU supplies are available before proceeding. */
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
cpu_dev = get_cpu_device(cpu);
|
||||
if (!cpu_dev)
|
||||
return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
|
||||
|
|
|
|||
|
|
@ -631,7 +631,7 @@ static int mtk_cpufreq_probe(struct platform_device *pdev)
|
|||
return dev_err_probe(&pdev->dev, -ENODEV,
|
||||
"failed to get mtk cpufreq platform data\n");
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
info = mtk_cpu_dvfs_info_lookup(cpu);
|
||||
if (info)
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ static int __init armada_xp_pmsu_cpufreq_init(void)
|
|||
* it), and registers the clock notifier that will take care
|
||||
* of doing the PMSU part of a frequency transition.
|
||||
*/
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
struct device *cpu_dev;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ static void qcom_get_related_cpus(int index, struct cpumask *m)
|
|||
struct of_phandle_args args;
|
||||
int cpu, ret;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
cpu_np = of_cpu_device_node_get(cpu);
|
||||
if (!cpu_np)
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -489,7 +489,7 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
|
|||
nvmem_cell_put(speedbin_nvmem);
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
struct dev_pm_opp_config config = {
|
||||
.supported_hw = NULL,
|
||||
};
|
||||
|
|
@ -543,7 +543,7 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
|
|||
dev_err(cpu_dev, "Failed to register platform device\n");
|
||||
|
||||
free_opp:
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
dev_pm_domain_detach_list(drv->cpus[cpu].pd_list);
|
||||
dev_pm_opp_clear_config(drv->cpus[cpu].opp_token);
|
||||
}
|
||||
|
|
@ -557,7 +557,7 @@ static void qcom_cpufreq_remove(struct platform_device *pdev)
|
|||
|
||||
platform_device_unregister(cpufreq_dt_pdev);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
dev_pm_domain_detach_list(drv->cpus[cpu].pd_list);
|
||||
dev_pm_opp_clear_config(drv->cpus[cpu].opp_token);
|
||||
}
|
||||
|
|
@ -568,7 +568,7 @@ static int qcom_cpufreq_suspend(struct device *dev)
|
|||
struct qcom_cpufreq_drv *drv = dev_get_drvdata(dev);
|
||||
unsigned int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
for_each_present_cpu(cpu)
|
||||
qcom_cpufreq_suspend_pd_devs(drv, cpu);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ scmi_get_sharing_cpus(struct device *cpu_dev, int domain,
|
|||
int cpu, tdomain;
|
||||
struct device *tcpu_dev;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
if (cpu == cpu_dev->id)
|
||||
continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ scpi_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
|
|||
if (domain < 0)
|
||||
return domain;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
if (cpu == cpu_dev->id)
|
||||
continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -262,7 +262,7 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev)
|
|||
snprintf(name, sizeof(name), "speed%d", speed);
|
||||
config.prop_name = name;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
struct device *cpu_dev = get_cpu_device(cpu);
|
||||
|
||||
if (!cpu_dev) {
|
||||
|
|
@ -288,7 +288,7 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev)
|
|||
pr_err("Failed to register platform device\n");
|
||||
|
||||
free_opp:
|
||||
for_each_possible_cpu(cpu)
|
||||
for_each_present_cpu(cpu)
|
||||
dev_pm_opp_clear_config(opp_tokens[cpu]);
|
||||
kfree(opp_tokens);
|
||||
|
||||
|
|
@ -302,7 +302,7 @@ static void sun50i_cpufreq_nvmem_remove(struct platform_device *pdev)
|
|||
|
||||
platform_device_unregister(cpufreq_dt_pdev);
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
for_each_present_cpu(cpu)
|
||||
dev_pm_opp_clear_config(opp_tokens[cpu]);
|
||||
|
||||
kfree(opp_tokens);
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ static int virt_cpufreq_get_sharing_cpus(struct cpufreq_policy *policy)
|
|||
cur_perf_domain = readl_relaxed(base + policy->cpu *
|
||||
PER_CPU_OFFSET + REG_PERF_DOMAIN_OFFSET);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
for_each_present_cpu(cpu) {
|
||||
cpu_dev = get_cpu_device(cpu);
|
||||
if (!cpu_dev)
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Reference in New Issue