Skip to content

Commit 46770be

Browse files
vireshkrafaeljw
authored andcommitted
cpufreq: Register drivers only after CPU devices have been registered
The cpufreq core heavily depends on the availability of the struct device for CPUs and if they aren't available at the time cpufreq driver is registered, we will never succeed in making cpufreq work. This happens due to following sequence of events: - cpufreq_register_driver() - subsys_interface_register() - return 0; //successful registration of driver ... at a later point of time - register_cpu(); - device_register(); - bus_probe_device(); - sif->add_dev(); - cpufreq_add_dev(); - get_cpu_device(); //FAILS - per_cpu(cpu_sys_devices, num) = &cpu->dev; //used by get_cpu_device() - return 0; //CPU registered successfully Because the per-cpu variable cpu_sys_devices is set only after the CPU device is regsitered, cpufreq will never be able to get it when cpufreq_add_dev() is called. This patch avoids this failure by making sure device structure of at least CPU0 is available when the cpufreq driver is registered, else return -EPROBE_DEFER. Reported-by: Bjorn Andersson <[email protected]> Co-developed-by: Amit Kucheria <[email protected]> Signed-off-by: Viresh Kumar <[email protected]> Tested-by: Amit Kucheria <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent d9f7aef commit 46770be

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

drivers/cpufreq/cpufreq.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2637,6 +2637,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
26372637
if (cpufreq_disabled())
26382638
return -ENODEV;
26392639

2640+
/*
2641+
* The cpufreq core depends heavily on the availability of device
2642+
* structure, make sure they are available before proceeding further.
2643+
*/
2644+
if (!get_cpu_device(0))
2645+
return -EPROBE_DEFER;
2646+
26402647
if (!driver_data || !driver_data->verify || !driver_data->init ||
26412648
!(driver_data->setpolicy || driver_data->target_index ||
26422649
driver_data->target) ||

0 commit comments

Comments
 (0)