diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-01-04 17:10:47 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-01-04 17:10:47 -0500 |
commit | f3ea36aa87400baafd17d548a873de5fe1ecdfcd (patch) | |
tree | 1966f6b5b6786a58605ccd283cad29f8fd8c6b67 | |
parent | 3eef2455f350708269fe42fab07b8c73efca83dc (diff) | |
parent | 1e15f295408e21873dba5fdf17efcbd05fcb6729 (diff) |
Merge branch 'pm-cpufreq'
* pm-cpufreq:
cpufreq / governor: Fix problem with cpufreq_ondemand or cpufreq_conservative
cpufreq / Longhaul: Disable driver by default
cpufreq / stats: fix race between stats allocation and first usage
-rw-r--r-- | drivers/cpufreq/Kconfig | 5 | ||||
-rw-r--r-- | drivers/cpufreq/Makefile | 5 | ||||
-rw-r--r-- | drivers/cpufreq/cpufreq_stats.c | 11 | ||||
-rw-r--r-- | drivers/cpufreq/longhaul.c | 10 |
4 files changed, 24 insertions, 7 deletions
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index ea512f47b789..e0a899f25e37 100644 --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig | |||
@@ -20,6 +20,9 @@ if CPU_FREQ | |||
20 | config CPU_FREQ_TABLE | 20 | config CPU_FREQ_TABLE |
21 | tristate | 21 | tristate |
22 | 22 | ||
23 | config CPU_FREQ_GOV_COMMON | ||
24 | bool | ||
25 | |||
23 | config CPU_FREQ_STAT | 26 | config CPU_FREQ_STAT |
24 | tristate "CPU frequency translation statistics" | 27 | tristate "CPU frequency translation statistics" |
25 | select CPU_FREQ_TABLE | 28 | select CPU_FREQ_TABLE |
@@ -141,6 +144,7 @@ config CPU_FREQ_GOV_USERSPACE | |||
141 | config CPU_FREQ_GOV_ONDEMAND | 144 | config CPU_FREQ_GOV_ONDEMAND |
142 | tristate "'ondemand' cpufreq policy governor" | 145 | tristate "'ondemand' cpufreq policy governor" |
143 | select CPU_FREQ_TABLE | 146 | select CPU_FREQ_TABLE |
147 | select CPU_FREQ_GOV_COMMON | ||
144 | help | 148 | help |
145 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. | 149 | 'ondemand' - This driver adds a dynamic cpufreq policy governor. |
146 | The governor does a periodic polling and | 150 | The governor does a periodic polling and |
@@ -159,6 +163,7 @@ config CPU_FREQ_GOV_ONDEMAND | |||
159 | config CPU_FREQ_GOV_CONSERVATIVE | 163 | config CPU_FREQ_GOV_CONSERVATIVE |
160 | tristate "'conservative' cpufreq governor" | 164 | tristate "'conservative' cpufreq governor" |
161 | depends on CPU_FREQ | 165 | depends on CPU_FREQ |
166 | select CPU_FREQ_GOV_COMMON | ||
162 | help | 167 | help |
163 | 'conservative' - this driver is rather similar to the 'ondemand' | 168 | 'conservative' - this driver is rather similar to the 'ondemand' |
164 | governor both in its source code and its purpose, the difference is | 169 | governor both in its source code and its purpose, the difference is |
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile index 1f254ec087c1..fadc4d496e2f 100644 --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile | |||
@@ -7,8 +7,9 @@ obj-$(CONFIG_CPU_FREQ_STAT) += cpufreq_stats.o | |||
7 | obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o | 7 | obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o |
8 | obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o | 8 | obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o |
9 | obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o | 9 | obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o |
10 | obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o cpufreq_governor.o | 10 | obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o |
11 | obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o cpufreq_governor.o | 11 | obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o |
12 | obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o | ||
12 | 13 | ||
13 | # CPUfreq cross-arch helpers | 14 | # CPUfreq cross-arch helpers |
14 | obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o | 15 | obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o |
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index e40e50809644..9d7732b81044 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
@@ -364,18 +364,21 @@ static int __init cpufreq_stats_init(void) | |||
364 | if (ret) | 364 | if (ret) |
365 | return ret; | 365 | return ret; |
366 | 366 | ||
367 | register_hotcpu_notifier(&cpufreq_stat_cpu_notifier); | ||
368 | for_each_online_cpu(cpu) | ||
369 | cpufreq_update_policy(cpu); | ||
370 | |||
367 | ret = cpufreq_register_notifier(¬ifier_trans_block, | 371 | ret = cpufreq_register_notifier(¬ifier_trans_block, |
368 | CPUFREQ_TRANSITION_NOTIFIER); | 372 | CPUFREQ_TRANSITION_NOTIFIER); |
369 | if (ret) { | 373 | if (ret) { |
370 | cpufreq_unregister_notifier(¬ifier_policy_block, | 374 | cpufreq_unregister_notifier(¬ifier_policy_block, |
371 | CPUFREQ_POLICY_NOTIFIER); | 375 | CPUFREQ_POLICY_NOTIFIER); |
376 | unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier); | ||
377 | for_each_online_cpu(cpu) | ||
378 | cpufreq_stats_free_table(cpu); | ||
372 | return ret; | 379 | return ret; |
373 | } | 380 | } |
374 | 381 | ||
375 | register_hotcpu_notifier(&cpufreq_stat_cpu_notifier); | ||
376 | for_each_online_cpu(cpu) { | ||
377 | cpufreq_update_policy(cpu); | ||
378 | } | ||
379 | return 0; | 382 | return 0; |
380 | } | 383 | } |
381 | static void __exit cpufreq_stats_exit(void) | 384 | static void __exit cpufreq_stats_exit(void) |
diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c index f1fa500ac105..1180d536d1eb 100644 --- a/drivers/cpufreq/longhaul.c +++ b/drivers/cpufreq/longhaul.c | |||
@@ -77,7 +77,7 @@ static unsigned int longhaul_index; | |||
77 | static int scale_voltage; | 77 | static int scale_voltage; |
78 | static int disable_acpi_c3; | 78 | static int disable_acpi_c3; |
79 | static int revid_errata; | 79 | static int revid_errata; |
80 | 80 | static int enable; | |
81 | 81 | ||
82 | /* Clock ratios multiplied by 10 */ | 82 | /* Clock ratios multiplied by 10 */ |
83 | static int mults[32]; | 83 | static int mults[32]; |
@@ -965,6 +965,10 @@ static int __init longhaul_init(void) | |||
965 | if (!x86_match_cpu(longhaul_id)) | 965 | if (!x86_match_cpu(longhaul_id)) |
966 | return -ENODEV; | 966 | return -ENODEV; |
967 | 967 | ||
968 | if (!enable) { | ||
969 | printk(KERN_ERR PFX "Option \"enable\" not set. Aborting.\n"); | ||
970 | return -ENODEV; | ||
971 | } | ||
968 | #ifdef CONFIG_SMP | 972 | #ifdef CONFIG_SMP |
969 | if (num_online_cpus() > 1) { | 973 | if (num_online_cpus() > 1) { |
970 | printk(KERN_ERR PFX "More than 1 CPU detected, " | 974 | printk(KERN_ERR PFX "More than 1 CPU detected, " |
@@ -1021,6 +1025,10 @@ MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | |||
1021 | * such. */ | 1025 | * such. */ |
1022 | module_param(revid_errata, int, 0644); | 1026 | module_param(revid_errata, int, 0644); |
1023 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); | 1027 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); |
1028 | /* By default driver is disabled to prevent incompatible | ||
1029 | * system freeze. */ | ||
1030 | module_param(enable, int, 0644); | ||
1031 | MODULE_PARM_DESC(enable, "Enable driver"); | ||
1024 | 1032 | ||
1025 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 1033 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); |
1026 | MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors."); | 1034 | MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors."); |