diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/cpufreq/cpufreq_userspace.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c index 860345c7799a..b1348ff9fcf4 100644 --- a/drivers/cpufreq/cpufreq_userspace.c +++ b/drivers/cpufreq/cpufreq_userspace.c | |||
@@ -37,6 +37,7 @@ static unsigned int cpu_set_freq[NR_CPUS]; /* CPU freq desired by userspace */ | |||
37 | static unsigned int cpu_is_managed[NR_CPUS]; | 37 | static unsigned int cpu_is_managed[NR_CPUS]; |
38 | 38 | ||
39 | static DEFINE_MUTEX (userspace_mutex); | 39 | static DEFINE_MUTEX (userspace_mutex); |
40 | static int cpus_using_userspace_governor; | ||
40 | 41 | ||
41 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg) | 42 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg) |
42 | 43 | ||
@@ -47,7 +48,11 @@ userspace_cpufreq_notifier(struct notifier_block *nb, unsigned long val, | |||
47 | { | 48 | { |
48 | struct cpufreq_freqs *freq = data; | 49 | struct cpufreq_freqs *freq = data; |
49 | 50 | ||
50 | dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n", freq->cpu, freq->new); | 51 | if (!cpu_is_managed[freq->cpu]) |
52 | return 0; | ||
53 | |||
54 | dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n", | ||
55 | freq->cpu, freq->new); | ||
51 | cpu_cur_freq[freq->cpu] = freq->new; | 56 | cpu_cur_freq[freq->cpu] = freq->new; |
52 | 57 | ||
53 | return 0; | 58 | return 0; |
@@ -142,6 +147,13 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy, | |||
142 | if (rc) | 147 | if (rc) |
143 | goto start_out; | 148 | goto start_out; |
144 | 149 | ||
150 | if (cpus_using_userspace_governor == 0) { | ||
151 | cpufreq_register_notifier( | ||
152 | &userspace_cpufreq_notifier_block, | ||
153 | CPUFREQ_TRANSITION_NOTIFIER); | ||
154 | } | ||
155 | cpus_using_userspace_governor++; | ||
156 | |||
145 | cpu_is_managed[cpu] = 1; | 157 | cpu_is_managed[cpu] = 1; |
146 | cpu_min_freq[cpu] = policy->min; | 158 | cpu_min_freq[cpu] = policy->min; |
147 | cpu_max_freq[cpu] = policy->max; | 159 | cpu_max_freq[cpu] = policy->max; |
@@ -153,6 +165,13 @@ start_out: | |||
153 | break; | 165 | break; |
154 | case CPUFREQ_GOV_STOP: | 166 | case CPUFREQ_GOV_STOP: |
155 | mutex_lock(&userspace_mutex); | 167 | mutex_lock(&userspace_mutex); |
168 | cpus_using_userspace_governor--; | ||
169 | if (cpus_using_userspace_governor == 0) { | ||
170 | cpufreq_unregister_notifier( | ||
171 | &userspace_cpufreq_notifier_block, | ||
172 | CPUFREQ_TRANSITION_NOTIFIER); | ||
173 | } | ||
174 | |||
156 | cpu_is_managed[cpu] = 0; | 175 | cpu_is_managed[cpu] = 0; |
157 | cpu_min_freq[cpu] = 0; | 176 | cpu_min_freq[cpu] = 0; |
158 | cpu_max_freq[cpu] = 0; | 177 | cpu_max_freq[cpu] = 0; |
@@ -198,7 +217,6 @@ EXPORT_SYMBOL(cpufreq_gov_userspace); | |||
198 | 217 | ||
199 | static int __init cpufreq_gov_userspace_init(void) | 218 | static int __init cpufreq_gov_userspace_init(void) |
200 | { | 219 | { |
201 | cpufreq_register_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER); | ||
202 | return cpufreq_register_governor(&cpufreq_gov_userspace); | 220 | return cpufreq_register_governor(&cpufreq_gov_userspace); |
203 | } | 221 | } |
204 | 222 | ||
@@ -206,7 +224,6 @@ static int __init cpufreq_gov_userspace_init(void) | |||
206 | static void __exit cpufreq_gov_userspace_exit(void) | 224 | static void __exit cpufreq_gov_userspace_exit(void) |
207 | { | 225 | { |
208 | cpufreq_unregister_governor(&cpufreq_gov_userspace); | 226 | cpufreq_unregister_governor(&cpufreq_gov_userspace); |
209 | cpufreq_unregister_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER); | ||
210 | } | 227 | } |
211 | 228 | ||
212 | 229 | ||