Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

thermal/drivers/cpufreq_cooling: Fix wrong frequency converted from power

The function cpu_power_to_freq is used to find a frequency and set the
cooling device to consume at most the power to be converted. For example,
if the power to be converted is 80mW, and the em table is as follow.
struct em_cap_state table[] = {
/* KHz mW */
{ 1008000, 36, 0 },
{ 1200000, 49, 0 },
{ 1296000, 59, 0 },
{ 1416000, 72, 0 },
{ 1512000, 86, 0 },
};
The target frequency should be 1416000KHz, not 1512000KHz.

Fixes: 349d39dc5739 ("thermal: cpu_cooling: merge frequency and power tables")
Cc: <stable@vger.kernel.org> # v4.13+
Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20200619090825.32747-1-finley.xiao@rock-chips.com

authored by

Finley Xiao and committed by
Daniel Lezcano
371a3bc7 3ecc8292

+3 -3
+3 -3
drivers/thermal/cpufreq_cooling.c
··· 123 123 { 124 124 int i; 125 125 126 - for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) { 127 - if (power > cpufreq_cdev->em->table[i].power) 126 + for (i = cpufreq_cdev->max_level; i >= 0; i--) { 127 + if (power >= cpufreq_cdev->em->table[i].power) 128 128 break; 129 129 } 130 130 131 - return cpufreq_cdev->em->table[i + 1].frequency; 131 + return cpufreq_cdev->em->table[i].frequency; 132 132 } 133 133 134 134 /**