android_kernel_samsung_a7y1.../drivers/cpufreq
Viresh Kumar 48ac4d6dc3 cpufreq: Register drivers only after CPU devices have been registered
[ Upstream commit 46770be0cf94149ca48be87719bda1d951066644 ]

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 <bjorn.andersson@linaro.org>
Co-developed-by: Amit Kucheria <amit.kucheria@linaro.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Tested-by: Amit Kucheria <amit.kucheria@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-04-07 13:21:35 +02:00
..
acpi-cpufreq.c
amd_freq_sensitivity.c
arm_big_little_dt.c
arm_big_little.c
arm_big_little.h
at32ap-cpufreq.c
blackfin-cpufreq.c
cppc_cpufreq.c
cpufreq_conservative.c
cpufreq_governor_attr_set.c
cpufreq_governor.c
cpufreq_governor.h
cpufreq_interactive.c
cpufreq_ondemand.c
cpufreq_performance.c
cpufreq_powersave.c
cpufreq_stats.c
cpufreq_times.c
cpufreq_userspace.c
cpufreq-dt.c
cpufreq-nforce2.c
cpufreq.c cpufreq: Register drivers only after CPU devices have been registered 2020-04-07 13:21:35 +02:00
cris-artpec3-cpufreq.c
cris-etraxfs-cpufreq.c
davinci-cpufreq.c
dbx500-cpufreq.c
e_powersaver.c
elanfreq.c
exynos-acme.c
exynos-acme.h
exynos-ff.h
exynos-ufc.c
exynos-ufc.h
exynos5440-cpufreq.c
freq_table.c
gx-suspmod.c
highbank-cpufreq.c
hisi-acpu-cpufreq.c
ia64-acpi-cpufreq.c
imx6q-cpufreq.c
integrator-cpufreq.c
intel_pstate.c
Kconfig
Kconfig.arm
Kconfig.powerpc
Kconfig.x86
kirkwood-cpufreq.c
longhaul.c
longhaul.h
longrun.c
loongson2_cpufreq.c
ls1x-cpufreq.c
Makefile
maple-cpufreq.c
mt8173-cpufreq.c
omap-cpufreq.c
p4-clockmod.c
pasemi-cpufreq.c cpufreq/pasemi: fix use-after-free in pas_cpufreq_cpu_init() 2020-04-06 20:38:49 +02:00
pcc-cpufreq.c
pmac32-cpufreq.c cpufreq: pmac32: fix possible object reference leak 2020-04-06 18:19:31 +02:00
pmac64-cpufreq.c
powernow-k6.c
powernow-k7.c
powernow-k7.h
powernow-k8.c
powernow-k8.h
powernv-cpufreq.c
ppc_cbe_cpufreq_pervasive.c
ppc_cbe_cpufreq_pmi.c
ppc_cbe_cpufreq.c
ppc_cbe_cpufreq.h
pxa2xx-cpufreq.c
pxa3xx-cpufreq.c
qoriq-cpufreq.c
s3c24xx-cpufreq-debugfs.c
s3c24xx-cpufreq.c
s3c64xx-cpufreq.c
s3c2410-cpufreq.c
s3c2412-cpufreq.c
s3c2416-cpufreq.c
s3c2440-cpufreq.c
s5pv210-cpufreq.c
sa1100-cpufreq.c
sa1110-cpufreq.c
sc520_freq.c
scpi-cpufreq.c
sfi-cpufreq.c
sh-cpufreq.c
sparc-us2e-cpufreq.c
sparc-us3-cpufreq.c
spear-cpufreq.c
speedstep-centrino.c
speedstep-ich.c
speedstep-lib.c
speedstep-lib.h
speedstep-smi.c
tegra20-cpufreq.c
tegra124-cpufreq.c
unicore2-cpufreq.c
vexpress-spc-cpufreq.c