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

cpufreq: Mark ARM drivers with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag

Sometimes boot loaders set CPU frequency to a value outside of frequency table
present with cpufreq core. In such cases CPU might be unstable if it has to run
on that frequency for long duration of time and so its better to set it to a
frequency which is specified in frequency table.

On some systems we can't really say what frequency we're running at the moment
and so for these we shouldn't check if we are running at a frequency present in
frequency table. And so we really can't force this for all the cpufreq drivers.

Hence we are created another flag here: CPUFREQ_NEED_INITIAL_FREQ_CHECK that
will be marked by platforms which want to go for this check at boot time.

Initially this is done for all ARM platforms but others may follow if required.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Viresh Kumar and committed by
Rafael J. Wysocki
ae6b4271 20b7cbe2

+31 -13
+2 -1
drivers/cpufreq/arm_big_little.c
··· 488 488 static struct cpufreq_driver bL_cpufreq_driver = { 489 489 .name = "arm-big-little", 490 490 .flags = CPUFREQ_STICKY | 491 - CPUFREQ_HAVE_GOVERNOR_PER_POLICY, 491 + CPUFREQ_HAVE_GOVERNOR_PER_POLICY | 492 + CPUFREQ_NEED_INITIAL_FREQ_CHECK, 492 493 .verify = cpufreq_generic_frequency_table_verify, 493 494 .target_index = bL_cpufreq_set_target, 494 495 .get = bL_cpufreq_get_rate,
+1 -1
drivers/cpufreq/davinci-cpufreq.c
··· 126 126 } 127 127 128 128 static struct cpufreq_driver davinci_driver = { 129 - .flags = CPUFREQ_STICKY, 129 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 130 130 .verify = davinci_verify_speed, 131 131 .target_index = davinci_target, 132 132 .get = davinci_getspeed,
+2 -1
drivers/cpufreq/dbx500-cpufreq.c
··· 48 48 } 49 49 50 50 static struct cpufreq_driver dbx500_cpufreq_driver = { 51 - .flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS, 51 + .flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS | 52 + CPUFREQ_NEED_INITIAL_FREQ_CHECK, 52 53 .verify = cpufreq_generic_frequency_table_verify, 53 54 .target_index = dbx500_cpufreq_target, 54 55 .get = dbx500_cpufreq_getspeed,
+1 -1
drivers/cpufreq/exynos-cpufreq.c
··· 218 218 } 219 219 220 220 static struct cpufreq_driver exynos_driver = { 221 - .flags = CPUFREQ_STICKY, 221 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 222 222 .verify = cpufreq_generic_frequency_table_verify, 223 223 .target_index = exynos_target, 224 224 .get = exynos_getspeed,
+2 -1
drivers/cpufreq/exynos5440-cpufreq.c
··· 312 312 } 313 313 314 314 static struct cpufreq_driver exynos_driver = { 315 - .flags = CPUFREQ_STICKY | CPUFREQ_ASYNC_NOTIFICATION, 315 + .flags = CPUFREQ_STICKY | CPUFREQ_ASYNC_NOTIFICATION | 316 + CPUFREQ_NEED_INITIAL_FREQ_CHECK, 316 317 .verify = cpufreq_generic_frequency_table_verify, 317 318 .target_index = exynos_target, 318 319 .get = exynos_getspeed,
+1
drivers/cpufreq/imx6q-cpufreq.c
··· 143 143 } 144 144 145 145 static struct cpufreq_driver imx6q_cpufreq_driver = { 146 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 146 147 .verify = cpufreq_generic_frequency_table_verify, 147 148 .target_index = imx6q_set_target, 148 149 .get = imx6q_get_speed,
+1
drivers/cpufreq/integrator-cpufreq.c
··· 190 190 } 191 191 192 192 static struct cpufreq_driver integrator_driver = { 193 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 193 194 .verify = integrator_verify_policy, 194 195 .target = integrator_set_target, 195 196 .get = integrator_get,
+1
drivers/cpufreq/kirkwood-cpufreq.c
··· 97 97 } 98 98 99 99 static struct cpufreq_driver kirkwood_cpufreq_driver = { 100 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 100 101 .get = kirkwood_cpufreq_get_cpu_frequency, 101 102 .verify = cpufreq_generic_frequency_table_verify, 102 103 .target_index = kirkwood_cpufreq_target,
+1 -1
drivers/cpufreq/omap-cpufreq.c
··· 162 162 } 163 163 164 164 static struct cpufreq_driver omap_driver = { 165 - .flags = CPUFREQ_STICKY, 165 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 166 166 .verify = cpufreq_generic_frequency_table_verify, 167 167 .target_index = omap_target, 168 168 .get = omap_getspeed,
+1
drivers/cpufreq/pxa2xx-cpufreq.c
··· 423 423 } 424 424 425 425 static struct cpufreq_driver pxa_cpufreq_driver = { 426 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 426 427 .verify = cpufreq_generic_frequency_table_verify, 427 428 .target_index = pxa_set_target, 428 429 .init = pxa_cpufreq_init,
+1
drivers/cpufreq/pxa3xx-cpufreq.c
··· 201 201 } 202 202 203 203 static struct cpufreq_driver pxa3xx_cpufreq_driver = { 204 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 204 205 .verify = cpufreq_generic_frequency_table_verify, 205 206 .target_index = pxa3xx_cpufreq_set, 206 207 .init = pxa3xx_cpufreq_init,
+1 -1
drivers/cpufreq/s3c2416-cpufreq.c
··· 481 481 } 482 482 483 483 static struct cpufreq_driver s3c2416_cpufreq_driver = { 484 - .flags = 0, 484 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 485 485 .verify = cpufreq_generic_frequency_table_verify, 486 486 .target_index = s3c2416_cpufreq_set_target, 487 487 .get = s3c2416_cpufreq_get_speed,
+1 -1
drivers/cpufreq/s3c24xx-cpufreq.c
··· 448 448 #endif 449 449 450 450 static struct cpufreq_driver s3c24xx_driver = { 451 - .flags = CPUFREQ_STICKY, 451 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 452 452 .target = s3c_cpufreq_target, 453 453 .get = s3c_cpufreq_get, 454 454 .init = s3c_cpufreq_init,
+1 -1
drivers/cpufreq/s3c64xx-cpufreq.c
··· 226 226 } 227 227 228 228 static struct cpufreq_driver s3c64xx_cpufreq_driver = { 229 - .flags = 0, 229 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 230 230 .verify = cpufreq_generic_frequency_table_verify, 231 231 .target_index = s3c64xx_cpufreq_set_target, 232 232 .get = s3c64xx_cpufreq_get_speed,
+1 -1
drivers/cpufreq/s5pv210-cpufreq.c
··· 560 560 } 561 561 562 562 static struct cpufreq_driver s5pv210_driver = { 563 - .flags = CPUFREQ_STICKY, 563 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 564 564 .verify = cpufreq_generic_frequency_table_verify, 565 565 .target_index = s5pv210_target, 566 566 .get = s5pv210_getspeed,
+1 -1
drivers/cpufreq/sa1100-cpufreq.c
··· 201 201 } 202 202 203 203 static struct cpufreq_driver sa1100_driver __refdata = { 204 - .flags = CPUFREQ_STICKY, 204 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 205 205 .verify = cpufreq_generic_frequency_table_verify, 206 206 .target_index = sa1100_target, 207 207 .get = sa11x0_getspeed,
+1 -1
drivers/cpufreq/sa1110-cpufreq.c
··· 312 312 /* sa1110_driver needs __refdata because it must remain after init registers 313 313 * it with cpufreq_register_driver() */ 314 314 static struct cpufreq_driver sa1110_driver __refdata = { 315 - .flags = CPUFREQ_STICKY, 315 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 316 316 .verify = cpufreq_generic_frequency_table_verify, 317 317 .target_index = sa1110_target, 318 318 .get = sa11x0_getspeed,
+1 -1
drivers/cpufreq/spear-cpufreq.c
··· 162 162 163 163 static struct cpufreq_driver spear_cpufreq_driver = { 164 164 .name = "cpufreq-spear", 165 - .flags = CPUFREQ_STICKY, 165 + .flags = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK, 166 166 .verify = cpufreq_generic_frequency_table_verify, 167 167 .target_index = spear_cpufreq_target, 168 168 .get = spear_cpufreq_get,
+1
drivers/cpufreq/tegra-cpufreq.c
··· 214 214 } 215 215 216 216 static struct cpufreq_driver tegra_cpufreq_driver = { 217 + .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK, 217 218 .verify = cpufreq_generic_frequency_table_verify, 218 219 .target_index = tegra_target, 219 220 .get = tegra_getspeed,
+9
include/linux/cpufreq.h
··· 252 252 */ 253 253 #define CPUFREQ_ASYNC_NOTIFICATION (1 << 4) 254 254 255 + /* 256 + * Set by drivers which want cpufreq core to check if CPU is running at a 257 + * frequency present in freq-table exposed by the driver. For these drivers if 258 + * CPU is found running at an out of table freq, we will try to set it to a freq 259 + * from the table. And if that fails, we will stop further boot process by 260 + * issuing a BUG_ON(). 261 + */ 262 + #define CPUFREQ_NEED_INITIAL_FREQ_CHECK (1 << 5) 263 + 255 264 int cpufreq_register_driver(struct cpufreq_driver *driver_data); 256 265 int cpufreq_unregister_driver(struct cpufreq_driver *driver_data); 257 266