[CPUFREQ] Bail out of cpufreq_add_dev if the link for a managed CPU got created
[deliverable/linux.git] / drivers / cpufreq / cpufreq.c
CommitLineData
1da177e4
LT
1/*
2 * linux/drivers/cpufreq/cpufreq.c
3 *
4 * Copyright (C) 2001 Russell King
5 * (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
6 *
c32b6b8e 7 * Oct 2005 - Ashok Raj <ashok.raj@intel.com>
32ee8c3e 8 * Added handling for CPU hotplug
8ff69732
DJ
9 * Feb 2006 - Jacob Shin <jacob.shin@amd.com>
10 * Fix handling for CPU hotplug -- affected CPUs
c32b6b8e 11 *
1da177e4
LT
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 *
16 */
17
1da177e4
LT
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/init.h>
21#include <linux/notifier.h>
22#include <linux/cpufreq.h>
23#include <linux/delay.h>
24#include <linux/interrupt.h>
25#include <linux/spinlock.h>
26#include <linux/device.h>
27#include <linux/slab.h>
28#include <linux/cpu.h>
29#include <linux/completion.h>
3fc54d37 30#include <linux/mutex.h>
1da177e4 31
e08f5f5b
GS
32#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, \
33 "cpufreq-core", msg)
1da177e4
LT
34
35/**
cd878479 36 * The "cpufreq driver" - the arch- or hardware-dependent low
1da177e4
LT
37 * level driver of CPUFreq support, and its spinlock. This lock
38 * also protects the cpufreq_cpu_data array.
39 */
7d5e350f 40static struct cpufreq_driver *cpufreq_driver;
7a6aedfa 41static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
084f3493
TR
42#ifdef CONFIG_HOTPLUG_CPU
43/* This one keeps track of the previously set governor of a removed CPU */
7a6aedfa 44static DEFINE_PER_CPU(struct cpufreq_governor *, cpufreq_cpu_governor);
084f3493 45#endif
1da177e4
LT
46static DEFINE_SPINLOCK(cpufreq_driver_lock);
47
5a01f2e8
VP
48/*
49 * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
50 * all cpufreq/hotplug/workqueue/etc related lock issues.
51 *
52 * The rules for this semaphore:
53 * - Any routine that wants to read from the policy structure will
54 * do a down_read on this semaphore.
55 * - Any routine that will write to the policy structure and/or may take away
56 * the policy altogether (eg. CPU hotplug), will hold this lock in write
57 * mode before doing so.
58 *
59 * Additional rules:
60 * - All holders of the lock should check to make sure that the CPU they
61 * are concerned with are online after they get the lock.
62 * - Governor routines that can be called in cpufreq hotplug path should not
63 * take this sem as top level hotplug notifier handler takes this.
64 */
65static DEFINE_PER_CPU(int, policy_cpu);
66static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
67
68#define lock_policy_rwsem(mode, cpu) \
69int lock_policy_rwsem_##mode \
70(int cpu) \
71{ \
72 int policy_cpu = per_cpu(policy_cpu, cpu); \
73 BUG_ON(policy_cpu == -1); \
74 down_##mode(&per_cpu(cpu_policy_rwsem, policy_cpu)); \
75 if (unlikely(!cpu_online(cpu))) { \
76 up_##mode(&per_cpu(cpu_policy_rwsem, policy_cpu)); \
77 return -1; \
78 } \
79 \
80 return 0; \
81}
82
83lock_policy_rwsem(read, cpu);
84EXPORT_SYMBOL_GPL(lock_policy_rwsem_read);
85
86lock_policy_rwsem(write, cpu);
87EXPORT_SYMBOL_GPL(lock_policy_rwsem_write);
88
89void unlock_policy_rwsem_read(int cpu)
90{
91 int policy_cpu = per_cpu(policy_cpu, cpu);
92 BUG_ON(policy_cpu == -1);
93 up_read(&per_cpu(cpu_policy_rwsem, policy_cpu));
94}
95EXPORT_SYMBOL_GPL(unlock_policy_rwsem_read);
96
97void unlock_policy_rwsem_write(int cpu)
98{
99 int policy_cpu = per_cpu(policy_cpu, cpu);
100 BUG_ON(policy_cpu == -1);
101 up_write(&per_cpu(cpu_policy_rwsem, policy_cpu));
102}
103EXPORT_SYMBOL_GPL(unlock_policy_rwsem_write);
104
105
1da177e4 106/* internal prototypes */
29464f28
DJ
107static int __cpufreq_governor(struct cpufreq_policy *policy,
108 unsigned int event);
5a01f2e8 109static unsigned int __cpufreq_get(unsigned int cpu);
65f27f38 110static void handle_update(struct work_struct *work);
1da177e4
LT
111
112/**
32ee8c3e
DJ
113 * Two notifier lists: the "policy" list is involved in the
114 * validation process for a new CPU frequency policy; the
1da177e4
LT
115 * "transition" list for kernel code that needs to handle
116 * changes to devices when the CPU clock speed changes.
117 * The mutex locks both lists.
118 */
e041c683 119static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
b4dfdbb3 120static struct srcu_notifier_head cpufreq_transition_notifier_list;
1da177e4 121
74212ca4 122static bool init_cpufreq_transition_notifier_list_called;
b4dfdbb3
AS
123static int __init init_cpufreq_transition_notifier_list(void)
124{
125 srcu_init_notifier_head(&cpufreq_transition_notifier_list);
74212ca4 126 init_cpufreq_transition_notifier_list_called = true;
b4dfdbb3
AS
127 return 0;
128}
b3438f82 129pure_initcall(init_cpufreq_transition_notifier_list);
1da177e4
LT
130
131static LIST_HEAD(cpufreq_governor_list);
29464f28 132static DEFINE_MUTEX(cpufreq_governor_mutex);
1da177e4 133
7d5e350f 134struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
1da177e4
LT
135{
136 struct cpufreq_policy *data;
137 unsigned long flags;
138
7a6aedfa 139 if (cpu >= nr_cpu_ids)
1da177e4
LT
140 goto err_out;
141
142 /* get the cpufreq driver */
143 spin_lock_irqsave(&cpufreq_driver_lock, flags);
144
145 if (!cpufreq_driver)
146 goto err_out_unlock;
147
148 if (!try_module_get(cpufreq_driver->owner))
149 goto err_out_unlock;
150
151
152 /* get the CPU */
7a6aedfa 153 data = per_cpu(cpufreq_cpu_data, cpu);
1da177e4
LT
154
155 if (!data)
156 goto err_out_put_module;
157
158 if (!kobject_get(&data->kobj))
159 goto err_out_put_module;
160
1da177e4 161 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1da177e4
LT
162 return data;
163
7d5e350f 164err_out_put_module:
1da177e4 165 module_put(cpufreq_driver->owner);
7d5e350f 166err_out_unlock:
1da177e4 167 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
7d5e350f 168err_out:
1da177e4
LT
169 return NULL;
170}
171EXPORT_SYMBOL_GPL(cpufreq_cpu_get);
172
7d5e350f 173
1da177e4
LT
174void cpufreq_cpu_put(struct cpufreq_policy *data)
175{
176 kobject_put(&data->kobj);
177 module_put(cpufreq_driver->owner);
178}
179EXPORT_SYMBOL_GPL(cpufreq_cpu_put);
180
181
182/*********************************************************************
183 * UNIFIED DEBUG HELPERS *
184 *********************************************************************/
185#ifdef CONFIG_CPU_FREQ_DEBUG
186
187/* what part(s) of the CPUfreq subsystem are debugged? */
188static unsigned int debug;
189
190/* is the debug output ratelimit'ed using printk_ratelimit? User can
191 * set or modify this value.
192 */
193static unsigned int debug_ratelimit = 1;
194
195/* is the printk_ratelimit'ing enabled? It's enabled after a successful
196 * loading of a cpufreq driver, temporarily disabled when a new policy
197 * is set, and disabled upon cpufreq driver removal
198 */
199static unsigned int disable_ratelimit = 1;
200static DEFINE_SPINLOCK(disable_ratelimit_lock);
201
858119e1 202static void cpufreq_debug_enable_ratelimit(void)
1da177e4
LT
203{
204 unsigned long flags;
205
206 spin_lock_irqsave(&disable_ratelimit_lock, flags);
207 if (disable_ratelimit)
208 disable_ratelimit--;
209 spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
210}
211
858119e1 212static void cpufreq_debug_disable_ratelimit(void)
1da177e4
LT
213{
214 unsigned long flags;
215
216 spin_lock_irqsave(&disable_ratelimit_lock, flags);
217 disable_ratelimit++;
218 spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
219}
220
e08f5f5b 221void cpufreq_debug_printk(unsigned int type, const char *prefix,
905d77cd 222 const char *fmt, ...)
1da177e4
LT
223{
224 char s[256];
225 va_list args;
226 unsigned int len;
227 unsigned long flags;
32ee8c3e 228
1da177e4
LT
229 WARN_ON(!prefix);
230 if (type & debug) {
231 spin_lock_irqsave(&disable_ratelimit_lock, flags);
e08f5f5b
GS
232 if (!disable_ratelimit && debug_ratelimit
233 && !printk_ratelimit()) {
1da177e4
LT
234 spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
235 return;
236 }
237 spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
238
239 len = snprintf(s, 256, KERN_DEBUG "%s: ", prefix);
240
241 va_start(args, fmt);
242 len += vsnprintf(&s[len], (256 - len), fmt, args);
243 va_end(args);
244
245 printk(s);
246
247 WARN_ON(len < 5);
248 }
249}
250EXPORT_SYMBOL(cpufreq_debug_printk);
251
252
253module_param(debug, uint, 0644);
e08f5f5b
GS
254MODULE_PARM_DESC(debug, "CPUfreq debugging: add 1 to debug core,"
255 " 2 to debug drivers, and 4 to debug governors.");
1da177e4
LT
256
257module_param(debug_ratelimit, uint, 0644);
e08f5f5b
GS
258MODULE_PARM_DESC(debug_ratelimit, "CPUfreq debugging:"
259 " set to 0 to disable ratelimiting.");
1da177e4
LT
260
261#else /* !CONFIG_CPU_FREQ_DEBUG */
262
263static inline void cpufreq_debug_enable_ratelimit(void) { return; }
264static inline void cpufreq_debug_disable_ratelimit(void) { return; }
265
266#endif /* CONFIG_CPU_FREQ_DEBUG */
267
268
269/*********************************************************************
270 * EXTERNALLY AFFECTING FREQUENCY CHANGES *
271 *********************************************************************/
272
273/**
274 * adjust_jiffies - adjust the system "loops_per_jiffy"
275 *
276 * This function alters the system "loops_per_jiffy" for the clock
277 * speed change. Note that loops_per_jiffy cannot be updated on SMP
32ee8c3e 278 * systems as each CPU might be scaled differently. So, use the arch
1da177e4
LT
279 * per-CPU loops_per_jiffy value wherever possible.
280 */
281#ifndef CONFIG_SMP
282static unsigned long l_p_j_ref;
283static unsigned int l_p_j_ref_freq;
284
858119e1 285static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
1da177e4
LT
286{
287 if (ci->flags & CPUFREQ_CONST_LOOPS)
288 return;
289
290 if (!l_p_j_ref_freq) {
291 l_p_j_ref = loops_per_jiffy;
292 l_p_j_ref_freq = ci->old;
a4a9df58 293 dprintk("saving %lu as reference value for loops_per_jiffy; "
e08f5f5b 294 "freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
1da177e4
LT
295 }
296 if ((val == CPUFREQ_PRECHANGE && ci->old < ci->new) ||
297 (val == CPUFREQ_POSTCHANGE && ci->old > ci->new) ||
42d4dc3f 298 (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
e08f5f5b
GS
299 loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
300 ci->new);
a4a9df58 301 dprintk("scaling loops_per_jiffy to %lu "
e08f5f5b 302 "for frequency %u kHz\n", loops_per_jiffy, ci->new);
1da177e4
LT
303 }
304}
305#else
e08f5f5b
GS
306static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
307{
308 return;
309}
1da177e4
LT
310#endif
311
312
313/**
e4472cb3
DJ
314 * cpufreq_notify_transition - call notifier chain and adjust_jiffies
315 * on frequency transition.
1da177e4 316 *
e4472cb3
DJ
317 * This function calls the transition notifiers and the "adjust_jiffies"
318 * function. It is called twice on all CPU frequency changes that have
32ee8c3e 319 * external effects.
1da177e4
LT
320 */
321void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)
322{
e4472cb3
DJ
323 struct cpufreq_policy *policy;
324
1da177e4
LT
325 BUG_ON(irqs_disabled());
326
327 freqs->flags = cpufreq_driver->flags;
e4472cb3
DJ
328 dprintk("notification %u of frequency transition to %u kHz\n",
329 state, freqs->new);
1da177e4 330
7a6aedfa 331 policy = per_cpu(cpufreq_cpu_data, freqs->cpu);
1da177e4 332 switch (state) {
e4472cb3 333
1da177e4 334 case CPUFREQ_PRECHANGE:
32ee8c3e 335 /* detect if the driver reported a value as "old frequency"
e4472cb3
DJ
336 * which is not equal to what the cpufreq core thinks is
337 * "old frequency".
1da177e4
LT
338 */
339 if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
e4472cb3
DJ
340 if ((policy) && (policy->cpu == freqs->cpu) &&
341 (policy->cur) && (policy->cur != freqs->old)) {
b10eec22 342 dprintk("Warning: CPU frequency is"
e4472cb3
DJ
343 " %u, cpufreq assumed %u kHz.\n",
344 freqs->old, policy->cur);
345 freqs->old = policy->cur;
1da177e4
LT
346 }
347 }
b4dfdbb3 348 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
e041c683 349 CPUFREQ_PRECHANGE, freqs);
1da177e4
LT
350 adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
351 break;
e4472cb3 352
1da177e4
LT
353 case CPUFREQ_POSTCHANGE:
354 adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
b4dfdbb3 355 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
e041c683 356 CPUFREQ_POSTCHANGE, freqs);
e4472cb3
DJ
357 if (likely(policy) && likely(policy->cpu == freqs->cpu))
358 policy->cur = freqs->new;
1da177e4
LT
359 break;
360 }
1da177e4
LT
361}
362EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
363
364
365
366/*********************************************************************
367 * SYSFS INTERFACE *
368 *********************************************************************/
369
3bcb09a3
JF
370static struct cpufreq_governor *__find_governor(const char *str_governor)
371{
372 struct cpufreq_governor *t;
373
374 list_for_each_entry(t, &cpufreq_governor_list, governor_list)
29464f28 375 if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN))
3bcb09a3
JF
376 return t;
377
378 return NULL;
379}
380
1da177e4
LT
381/**
382 * cpufreq_parse_governor - parse a governor string
383 */
905d77cd 384static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
1da177e4
LT
385 struct cpufreq_governor **governor)
386{
3bcb09a3
JF
387 int err = -EINVAL;
388
1da177e4 389 if (!cpufreq_driver)
3bcb09a3
JF
390 goto out;
391
1da177e4
LT
392 if (cpufreq_driver->setpolicy) {
393 if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
394 *policy = CPUFREQ_POLICY_PERFORMANCE;
3bcb09a3 395 err = 0;
e08f5f5b
GS
396 } else if (!strnicmp(str_governor, "powersave",
397 CPUFREQ_NAME_LEN)) {
1da177e4 398 *policy = CPUFREQ_POLICY_POWERSAVE;
3bcb09a3 399 err = 0;
1da177e4 400 }
3bcb09a3 401 } else if (cpufreq_driver->target) {
1da177e4 402 struct cpufreq_governor *t;
3bcb09a3 403
3fc54d37 404 mutex_lock(&cpufreq_governor_mutex);
3bcb09a3
JF
405
406 t = __find_governor(str_governor);
407
ea714970 408 if (t == NULL) {
e08f5f5b
GS
409 char *name = kasprintf(GFP_KERNEL, "cpufreq_%s",
410 str_governor);
ea714970
JF
411
412 if (name) {
413 int ret;
414
415 mutex_unlock(&cpufreq_governor_mutex);
326f6a5c 416 ret = request_module("%s", name);
ea714970
JF
417 mutex_lock(&cpufreq_governor_mutex);
418
419 if (ret == 0)
420 t = __find_governor(str_governor);
421 }
422
423 kfree(name);
424 }
425
3bcb09a3
JF
426 if (t != NULL) {
427 *governor = t;
428 err = 0;
1da177e4 429 }
3bcb09a3 430
3fc54d37 431 mutex_unlock(&cpufreq_governor_mutex);
1da177e4 432 }
29464f28 433out:
3bcb09a3 434 return err;
1da177e4 435}
1da177e4
LT
436
437
1da177e4 438/**
e08f5f5b
GS
439 * cpufreq_per_cpu_attr_read() / show_##file_name() -
440 * print out cpufreq information
1da177e4
LT
441 *
442 * Write out information from cpufreq_driver->policy[cpu]; object must be
443 * "unsigned int".
444 */
445
32ee8c3e
DJ
446#define show_one(file_name, object) \
447static ssize_t show_##file_name \
905d77cd 448(struct cpufreq_policy *policy, char *buf) \
32ee8c3e 449{ \
29464f28 450 return sprintf(buf, "%u\n", policy->object); \
1da177e4
LT
451}
452
453show_one(cpuinfo_min_freq, cpuinfo.min_freq);
454show_one(cpuinfo_max_freq, cpuinfo.max_freq);
ed129784 455show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
1da177e4
LT
456show_one(scaling_min_freq, min);
457show_one(scaling_max_freq, max);
458show_one(scaling_cur_freq, cur);
459
e08f5f5b
GS
460static int __cpufreq_set_policy(struct cpufreq_policy *data,
461 struct cpufreq_policy *policy);
7970e08b 462
1da177e4
LT
463/**
464 * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
465 */
466#define store_one(file_name, object) \
467static ssize_t store_##file_name \
905d77cd 468(struct cpufreq_policy *policy, const char *buf, size_t count) \
1da177e4
LT
469{ \
470 unsigned int ret = -EINVAL; \
471 struct cpufreq_policy new_policy; \
472 \
473 ret = cpufreq_get_policy(&new_policy, policy->cpu); \
474 if (ret) \
475 return -EINVAL; \
476 \
29464f28 477 ret = sscanf(buf, "%u", &new_policy.object); \
1da177e4
LT
478 if (ret != 1) \
479 return -EINVAL; \
480 \
7970e08b
TR
481 ret = __cpufreq_set_policy(policy, &new_policy); \
482 policy->user_policy.object = policy->object; \
1da177e4
LT
483 \
484 return ret ? ret : count; \
485}
486
29464f28
DJ
487store_one(scaling_min_freq, min);
488store_one(scaling_max_freq, max);
1da177e4
LT
489
490/**
491 * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
492 */
905d77cd
DJ
493static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
494 char *buf)
1da177e4 495{
5a01f2e8 496 unsigned int cur_freq = __cpufreq_get(policy->cpu);
1da177e4
LT
497 if (!cur_freq)
498 return sprintf(buf, "<unknown>");
499 return sprintf(buf, "%u\n", cur_freq);
500}
501
502
503/**
504 * show_scaling_governor - show the current policy for the specified CPU
505 */
905d77cd 506static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
1da177e4 507{
29464f28 508 if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
1da177e4
LT
509 return sprintf(buf, "powersave\n");
510 else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)
511 return sprintf(buf, "performance\n");
512 else if (policy->governor)
29464f28
DJ
513 return scnprintf(buf, CPUFREQ_NAME_LEN, "%s\n",
514 policy->governor->name);
1da177e4
LT
515 return -EINVAL;
516}
517
518
519/**
520 * store_scaling_governor - store policy for the specified CPU
521 */
905d77cd
DJ
522static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
523 const char *buf, size_t count)
1da177e4
LT
524{
525 unsigned int ret = -EINVAL;
526 char str_governor[16];
527 struct cpufreq_policy new_policy;
528
529 ret = cpufreq_get_policy(&new_policy, policy->cpu);
530 if (ret)
531 return ret;
532
29464f28 533 ret = sscanf(buf, "%15s", str_governor);
1da177e4
LT
534 if (ret != 1)
535 return -EINVAL;
536
e08f5f5b
GS
537 if (cpufreq_parse_governor(str_governor, &new_policy.policy,
538 &new_policy.governor))
1da177e4
LT
539 return -EINVAL;
540
7970e08b
TR
541 /* Do not use cpufreq_set_policy here or the user_policy.max
542 will be wrongly overridden */
7970e08b
TR
543 ret = __cpufreq_set_policy(policy, &new_policy);
544
545 policy->user_policy.policy = policy->policy;
546 policy->user_policy.governor = policy->governor;
7970e08b 547
e08f5f5b
GS
548 if (ret)
549 return ret;
550 else
551 return count;
1da177e4
LT
552}
553
554/**
555 * show_scaling_driver - show the cpufreq driver currently loaded
556 */
905d77cd 557static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf)
1da177e4
LT
558{
559 return scnprintf(buf, CPUFREQ_NAME_LEN, "%s\n", cpufreq_driver->name);
560}
561
562/**
563 * show_scaling_available_governors - show the available CPUfreq governors
564 */
905d77cd
DJ
565static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
566 char *buf)
1da177e4
LT
567{
568 ssize_t i = 0;
569 struct cpufreq_governor *t;
570
571 if (!cpufreq_driver->target) {
572 i += sprintf(buf, "performance powersave");
573 goto out;
574 }
575
576 list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
29464f28
DJ
577 if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
578 - (CPUFREQ_NAME_LEN + 2)))
1da177e4
LT
579 goto out;
580 i += scnprintf(&buf[i], CPUFREQ_NAME_LEN, "%s ", t->name);
581 }
7d5e350f 582out:
1da177e4
LT
583 i += sprintf(&buf[i], "\n");
584 return i;
585}
e8628dd0 586
835481d9 587static ssize_t show_cpus(const struct cpumask *mask, char *buf)
1da177e4
LT
588{
589 ssize_t i = 0;
590 unsigned int cpu;
591
835481d9 592 for_each_cpu(cpu, mask) {
1da177e4
LT
593 if (i)
594 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
595 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
596 if (i >= (PAGE_SIZE - 5))
29464f28 597 break;
1da177e4
LT
598 }
599 i += sprintf(&buf[i], "\n");
600 return i;
601}
602
e8628dd0
DW
603/**
604 * show_related_cpus - show the CPUs affected by each transition even if
605 * hw coordination is in use
606 */
607static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf)
608{
835481d9 609 if (cpumask_empty(policy->related_cpus))
e8628dd0
DW
610 return show_cpus(policy->cpus, buf);
611 return show_cpus(policy->related_cpus, buf);
612}
613
614/**
615 * show_affected_cpus - show the CPUs affected by each transition
616 */
617static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf)
618{
619 return show_cpus(policy->cpus, buf);
620}
621
9e76988e 622static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
905d77cd 623 const char *buf, size_t count)
9e76988e
VP
624{
625 unsigned int freq = 0;
626 unsigned int ret;
627
879000f9 628 if (!policy->governor || !policy->governor->store_setspeed)
9e76988e
VP
629 return -EINVAL;
630
631 ret = sscanf(buf, "%u", &freq);
632 if (ret != 1)
633 return -EINVAL;
634
635 policy->governor->store_setspeed(policy, freq);
636
637 return count;
638}
639
640static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
641{
879000f9 642 if (!policy->governor || !policy->governor->show_setspeed)
9e76988e
VP
643 return sprintf(buf, "<unsupported>\n");
644
645 return policy->governor->show_setspeed(policy, buf);
646}
1da177e4
LT
647
648#define define_one_ro(_name) \
649static struct freq_attr _name = \
650__ATTR(_name, 0444, show_##_name, NULL)
651
652#define define_one_ro0400(_name) \
653static struct freq_attr _name = \
654__ATTR(_name, 0400, show_##_name, NULL)
655
656#define define_one_rw(_name) \
657static struct freq_attr _name = \
658__ATTR(_name, 0644, show_##_name, store_##_name)
659
660define_one_ro0400(cpuinfo_cur_freq);
661define_one_ro(cpuinfo_min_freq);
662define_one_ro(cpuinfo_max_freq);
ed129784 663define_one_ro(cpuinfo_transition_latency);
1da177e4
LT
664define_one_ro(scaling_available_governors);
665define_one_ro(scaling_driver);
666define_one_ro(scaling_cur_freq);
e8628dd0 667define_one_ro(related_cpus);
1da177e4
LT
668define_one_ro(affected_cpus);
669define_one_rw(scaling_min_freq);
670define_one_rw(scaling_max_freq);
671define_one_rw(scaling_governor);
9e76988e 672define_one_rw(scaling_setspeed);
1da177e4 673
905d77cd 674static struct attribute *default_attrs[] = {
1da177e4
LT
675 &cpuinfo_min_freq.attr,
676 &cpuinfo_max_freq.attr,
ed129784 677 &cpuinfo_transition_latency.attr,
1da177e4
LT
678 &scaling_min_freq.attr,
679 &scaling_max_freq.attr,
680 &affected_cpus.attr,
e8628dd0 681 &related_cpus.attr,
1da177e4
LT
682 &scaling_governor.attr,
683 &scaling_driver.attr,
684 &scaling_available_governors.attr,
9e76988e 685 &scaling_setspeed.attr,
1da177e4
LT
686 NULL
687};
688
29464f28
DJ
689#define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
690#define to_attr(a) container_of(a, struct freq_attr, attr)
1da177e4 691
29464f28 692static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
1da177e4 693{
905d77cd
DJ
694 struct cpufreq_policy *policy = to_policy(kobj);
695 struct freq_attr *fattr = to_attr(attr);
0db4a8a9 696 ssize_t ret = -EINVAL;
1da177e4
LT
697 policy = cpufreq_cpu_get(policy->cpu);
698 if (!policy)
0db4a8a9 699 goto no_policy;
5a01f2e8
VP
700
701 if (lock_policy_rwsem_read(policy->cpu) < 0)
0db4a8a9 702 goto fail;
5a01f2e8 703
e08f5f5b
GS
704 if (fattr->show)
705 ret = fattr->show(policy, buf);
706 else
707 ret = -EIO;
708
5a01f2e8 709 unlock_policy_rwsem_read(policy->cpu);
0db4a8a9 710fail:
1da177e4 711 cpufreq_cpu_put(policy);
0db4a8a9 712no_policy:
1da177e4
LT
713 return ret;
714}
715
905d77cd
DJ
716static ssize_t store(struct kobject *kobj, struct attribute *attr,
717 const char *buf, size_t count)
1da177e4 718{
905d77cd
DJ
719 struct cpufreq_policy *policy = to_policy(kobj);
720 struct freq_attr *fattr = to_attr(attr);
a07530b4 721 ssize_t ret = -EINVAL;
1da177e4
LT
722 policy = cpufreq_cpu_get(policy->cpu);
723 if (!policy)
a07530b4 724 goto no_policy;
5a01f2e8
VP
725
726 if (lock_policy_rwsem_write(policy->cpu) < 0)
a07530b4 727 goto fail;
5a01f2e8 728
e08f5f5b
GS
729 if (fattr->store)
730 ret = fattr->store(policy, buf, count);
731 else
732 ret = -EIO;
733
5a01f2e8 734 unlock_policy_rwsem_write(policy->cpu);
a07530b4 735fail:
1da177e4 736 cpufreq_cpu_put(policy);
a07530b4 737no_policy:
1da177e4
LT
738 return ret;
739}
740
905d77cd 741static void cpufreq_sysfs_release(struct kobject *kobj)
1da177e4 742{
905d77cd 743 struct cpufreq_policy *policy = to_policy(kobj);
1da177e4
LT
744 dprintk("last reference is dropped\n");
745 complete(&policy->kobj_unregister);
746}
747
748static struct sysfs_ops sysfs_ops = {
749 .show = show,
750 .store = store,
751};
752
753static struct kobj_type ktype_cpufreq = {
754 .sysfs_ops = &sysfs_ops,
755 .default_attrs = default_attrs,
756 .release = cpufreq_sysfs_release,
757};
758
4bfa042c
TR
759/*
760 * Returns:
761 * Negative: Failure
762 * 0: Success
763 * Positive: When we have a managed CPU and the sysfs got symlinked
764 */
ecf7e461
DJ
765int cpufreq_add_dev_policy(unsigned int cpu, struct cpufreq_policy *policy,
766 struct sys_device *sys_dev)
767{
768 int ret = 0;
769#ifdef CONFIG_SMP
770 unsigned long flags;
771 unsigned int j;
772
773#ifdef CONFIG_HOTPLUG_CPU
774 if (per_cpu(cpufreq_cpu_governor, cpu)) {
775 policy->governor = per_cpu(cpufreq_cpu_governor, cpu);
776 dprintk("Restoring governor %s for cpu %d\n",
777 policy->governor->name, cpu);
778 }
779#endif
780
781 for_each_cpu(j, policy->cpus) {
782 struct cpufreq_policy *managed_policy;
783
784 if (cpu == j)
785 continue;
786
787 /* Check for existing affected CPUs.
788 * They may not be aware of it due to CPU Hotplug.
789 * cpufreq_cpu_put is called when the device is removed
790 * in __cpufreq_remove_dev()
791 */
792 managed_policy = cpufreq_cpu_get(j);
793 if (unlikely(managed_policy)) {
794
795 /* Set proper policy_cpu */
796 unlock_policy_rwsem_write(cpu);
797 per_cpu(policy_cpu, cpu) = managed_policy->cpu;
798
799 if (lock_policy_rwsem_write(cpu) < 0) {
800 /* Should not go through policy unlock path */
801 if (cpufreq_driver->exit)
802 cpufreq_driver->exit(policy);
803 cpufreq_cpu_put(managed_policy);
804 return -EBUSY;
805 }
806
807 spin_lock_irqsave(&cpufreq_driver_lock, flags);
808 cpumask_copy(managed_policy->cpus, policy->cpus);
809 per_cpu(cpufreq_cpu_data, cpu) = managed_policy;
810 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
811
812 dprintk("CPU already managed, adding link\n");
813 ret = sysfs_create_link(&sys_dev->kobj,
814 &managed_policy->kobj,
815 "cpufreq");
816 if (ret)
817 cpufreq_cpu_put(managed_policy);
818 /*
819 * Success. We only needed to be added to the mask.
820 * Call driver->exit() because only the cpu parent of
821 * the kobj needed to call init().
822 */
823 if (cpufreq_driver->exit)
824 cpufreq_driver->exit(policy);
4bfa042c
TR
825
826 if (!ret)
827 return 1;
828 else
829 return ret;
ecf7e461
DJ
830 }
831 }
832#endif
833 return ret;
834}
835
836
19d6f7ec
DJ
837/* symlink affected CPUs */
838int cpufreq_add_dev_symlink(unsigned int cpu, struct cpufreq_policy *policy)
839{
840 unsigned int j;
841 int ret = 0;
842
843 for_each_cpu(j, policy->cpus) {
844 struct cpufreq_policy *managed_policy;
845 struct sys_device *cpu_sys_dev;
846
847 if (j == cpu)
848 continue;
849 if (!cpu_online(j))
850 continue;
851
852 dprintk("CPU %u already managed, adding link\n", j);
853 managed_policy = cpufreq_cpu_get(cpu);
854 cpu_sys_dev = get_cpu_sysdev(j);
855 ret = sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj,
856 "cpufreq");
857 if (ret) {
858 cpufreq_cpu_put(managed_policy);
859 return ret;
860 }
861 }
862 return ret;
863}
864
909a694e
DJ
865int cpufreq_add_dev_interface(unsigned int cpu, struct cpufreq_policy *policy,
866 struct sys_device *sys_dev)
867{
ecf7e461 868 struct cpufreq_policy new_policy;
909a694e
DJ
869 struct freq_attr **drv_attr;
870 unsigned long flags;
871 int ret = 0;
872 unsigned int j;
873
874 /* prepare interface data */
875 ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
876 &sys_dev->kobj, "cpufreq");
877 if (ret)
878 return ret;
879
880 /* set up files for this cpu device */
881 drv_attr = cpufreq_driver->attr;
882 while ((drv_attr) && (*drv_attr)) {
883 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
884 if (ret)
885 goto err_out_kobj_put;
886 drv_attr++;
887 }
888 if (cpufreq_driver->get) {
889 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
890 if (ret)
891 goto err_out_kobj_put;
892 }
893 if (cpufreq_driver->target) {
894 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
895 if (ret)
896 goto err_out_kobj_put;
897 }
898
899 spin_lock_irqsave(&cpufreq_driver_lock, flags);
900 for_each_cpu(j, policy->cpus) {
901 if (!cpu_online(j))
902 continue;
903 per_cpu(cpufreq_cpu_data, j) = policy;
904 per_cpu(policy_cpu, j) = policy->cpu;
905 }
906 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
907
908 ret = cpufreq_add_dev_symlink(cpu, policy);
ecf7e461
DJ
909 if (ret)
910 goto err_out_kobj_put;
911
912 memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
913 /* assure that the starting sequence is run in __cpufreq_set_policy */
914 policy->governor = NULL;
915
916 /* set default policy */
917 ret = __cpufreq_set_policy(policy, &new_policy);
918 policy->user_policy.policy = policy->policy;
919 policy->user_policy.governor = policy->governor;
920
921 if (ret) {
922 dprintk("setting policy failed\n");
923 if (cpufreq_driver->exit)
924 cpufreq_driver->exit(policy);
925 }
909a694e
DJ
926 return ret;
927
928err_out_kobj_put:
929 kobject_put(&policy->kobj);
930 wait_for_completion(&policy->kobj_unregister);
931 return ret;
932}
933
1da177e4
LT
934
935/**
936 * cpufreq_add_dev - add a CPU device
937 *
32ee8c3e 938 * Adds the cpufreq interface for a CPU device.
3f4a782b
MD
939 *
940 * The Oracle says: try running cpufreq registration/unregistration concurrently
941 * with with cpu hotplugging and all hell will break loose. Tried to clean this
942 * mess up, but more thorough testing is needed. - Mathieu
1da177e4 943 */
905d77cd 944static int cpufreq_add_dev(struct sys_device *sys_dev)
1da177e4
LT
945{
946 unsigned int cpu = sys_dev->id;
947 int ret = 0;
1da177e4 948 struct cpufreq_policy *policy;
1da177e4
LT
949 unsigned long flags;
950 unsigned int j;
951
c32b6b8e
AR
952 if (cpu_is_offline(cpu))
953 return 0;
954
1da177e4
LT
955 cpufreq_debug_disable_ratelimit();
956 dprintk("adding CPU %u\n", cpu);
957
958#ifdef CONFIG_SMP
959 /* check whether a different CPU already registered this
960 * CPU because it is in the same boat. */
961 policy = cpufreq_cpu_get(cpu);
962 if (unlikely(policy)) {
8ff69732 963 cpufreq_cpu_put(policy);
1da177e4
LT
964 cpufreq_debug_enable_ratelimit();
965 return 0;
966 }
967#endif
968
969 if (!try_module_get(cpufreq_driver->owner)) {
970 ret = -EINVAL;
971 goto module_out;
972 }
973
059019a3 974 ret = -ENOMEM;
e98df50c 975 policy = kzalloc(sizeof(struct cpufreq_policy), GFP_KERNEL);
059019a3 976 if (!policy)
1da177e4 977 goto nomem_out;
059019a3
DJ
978
979 if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
3f4a782b 980 goto err_free_policy;
059019a3
DJ
981
982 if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
3f4a782b 983 goto err_free_cpumask;
1da177e4
LT
984
985 policy->cpu = cpu;
835481d9 986 cpumask_copy(policy->cpus, cpumask_of(cpu));
1da177e4 987
5a01f2e8
VP
988 /* Initially set CPU itself as the policy_cpu */
989 per_cpu(policy_cpu, cpu) = cpu;
3f4a782b
MD
990 ret = (lock_policy_rwsem_write(cpu) < 0);
991 WARN_ON(ret);
5a01f2e8 992
1da177e4 993 init_completion(&policy->kobj_unregister);
65f27f38 994 INIT_WORK(&policy->update, handle_update);
1da177e4 995
8122c6ce
TR
996 /* Set governor before ->init, so that driver could check it */
997 policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
1da177e4
LT
998 /* call driver. From then on the cpufreq must be able
999 * to accept all calls to ->verify and ->setpolicy for this CPU
1000 */
1001 ret = cpufreq_driver->init(policy);
1002 if (ret) {
1003 dprintk("initialization failed\n");
3f4a782b 1004 goto err_unlock_policy;
1da177e4 1005 }
187d9f4e
MC
1006 policy->user_policy.min = policy->min;
1007 policy->user_policy.max = policy->max;
1da177e4 1008
a1531acd
TR
1009 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1010 CPUFREQ_START, policy);
1011
ecf7e461 1012 ret = cpufreq_add_dev_policy(cpu, policy, sys_dev);
4bfa042c
TR
1013 if (ret) {
1014 if (ret > 0)
1015 /* This is a managed cpu, symlink created,
1016 exit with 0 */
1017 ret = 0;
ecf7e461 1018 goto err_unlock_policy;
4bfa042c 1019 }
1da177e4 1020
909a694e 1021 ret = cpufreq_add_dev_interface(cpu, policy, sys_dev);
19d6f7ec
DJ
1022 if (ret)
1023 goto err_out_unregister;
8ff69732 1024
dca02613
LW
1025 unlock_policy_rwsem_write(cpu);
1026
038c5b3e 1027 kobject_uevent(&policy->kobj, KOBJ_ADD);
1da177e4 1028 module_put(cpufreq_driver->owner);
1da177e4
LT
1029 dprintk("initialization complete\n");
1030 cpufreq_debug_enable_ratelimit();
87c32271 1031
1da177e4
LT
1032 return 0;
1033
1034
1035err_out_unregister:
1036 spin_lock_irqsave(&cpufreq_driver_lock, flags);
835481d9 1037 for_each_cpu(j, policy->cpus)
7a6aedfa 1038 per_cpu(cpufreq_cpu_data, j) = NULL;
1da177e4
LT
1039 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1040
c10997f6 1041 kobject_put(&policy->kobj);
1da177e4
LT
1042 wait_for_completion(&policy->kobj_unregister);
1043
3f4a782b 1044err_unlock_policy:
45709118 1045 unlock_policy_rwsem_write(cpu);
3f4a782b
MD
1046err_free_cpumask:
1047 free_cpumask_var(policy->cpus);
1048err_free_policy:
1da177e4 1049 kfree(policy);
1da177e4
LT
1050nomem_out:
1051 module_put(cpufreq_driver->owner);
c32b6b8e 1052module_out:
1da177e4
LT
1053 cpufreq_debug_enable_ratelimit();
1054 return ret;
1055}
1056
1057
1058/**
5a01f2e8 1059 * __cpufreq_remove_dev - remove a CPU device
1da177e4
LT
1060 *
1061 * Removes the cpufreq interface for a CPU device.
5a01f2e8
VP
1062 * Caller should already have policy_rwsem in write mode for this CPU.
1063 * This routine frees the rwsem before returning.
1da177e4 1064 */
905d77cd 1065static int __cpufreq_remove_dev(struct sys_device *sys_dev)
1da177e4
LT
1066{
1067 unsigned int cpu = sys_dev->id;
1068 unsigned long flags;
1069 struct cpufreq_policy *data;
1070#ifdef CONFIG_SMP
e738cf6d 1071 struct sys_device *cpu_sys_dev;
1da177e4
LT
1072 unsigned int j;
1073#endif
1074
1075 cpufreq_debug_disable_ratelimit();
1076 dprintk("unregistering CPU %u\n", cpu);
1077
1078 spin_lock_irqsave(&cpufreq_driver_lock, flags);
7a6aedfa 1079 data = per_cpu(cpufreq_cpu_data, cpu);
1da177e4
LT
1080
1081 if (!data) {
1082 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1da177e4 1083 cpufreq_debug_enable_ratelimit();
5a01f2e8 1084 unlock_policy_rwsem_write(cpu);
1da177e4
LT
1085 return -EINVAL;
1086 }
7a6aedfa 1087 per_cpu(cpufreq_cpu_data, cpu) = NULL;
1da177e4
LT
1088
1089
1090#ifdef CONFIG_SMP
1091 /* if this isn't the CPU which is the parent of the kobj, we
32ee8c3e 1092 * only need to unlink, put and exit
1da177e4
LT
1093 */
1094 if (unlikely(cpu != data->cpu)) {
1095 dprintk("removing link\n");
835481d9 1096 cpumask_clear_cpu(cpu, data->cpus);
1da177e4
LT
1097 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1098 sysfs_remove_link(&sys_dev->kobj, "cpufreq");
1da177e4
LT
1099 cpufreq_cpu_put(data);
1100 cpufreq_debug_enable_ratelimit();
5a01f2e8 1101 unlock_policy_rwsem_write(cpu);
1da177e4
LT
1102 return 0;
1103 }
1104#endif
1105
1da177e4 1106#ifdef CONFIG_SMP
084f3493
TR
1107
1108#ifdef CONFIG_HOTPLUG_CPU
7a6aedfa 1109 per_cpu(cpufreq_cpu_governor, cpu) = data->governor;
084f3493
TR
1110#endif
1111
1da177e4
LT
1112 /* if we have other CPUs still registered, we need to unlink them,
1113 * or else wait_for_completion below will lock up. Clean the
7a6aedfa
MT
1114 * per_cpu(cpufreq_cpu_data) while holding the lock, and remove
1115 * the sysfs links afterwards.
1da177e4 1116 */
835481d9
RR
1117 if (unlikely(cpumask_weight(data->cpus) > 1)) {
1118 for_each_cpu(j, data->cpus) {
1da177e4
LT
1119 if (j == cpu)
1120 continue;
7a6aedfa 1121 per_cpu(cpufreq_cpu_data, j) = NULL;
1da177e4
LT
1122 }
1123 }
1124
1125 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1126
835481d9
RR
1127 if (unlikely(cpumask_weight(data->cpus) > 1)) {
1128 for_each_cpu(j, data->cpus) {
1da177e4
LT
1129 if (j == cpu)
1130 continue;
1131 dprintk("removing link for cpu %u\n", j);
084f3493 1132#ifdef CONFIG_HOTPLUG_CPU
7a6aedfa 1133 per_cpu(cpufreq_cpu_governor, j) = data->governor;
084f3493 1134#endif
d434fca7
AR
1135 cpu_sys_dev = get_cpu_sysdev(j);
1136 sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq");
1da177e4
LT
1137 cpufreq_cpu_put(data);
1138 }
1139 }
1140#else
1141 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1142#endif
1143
1da177e4
LT
1144 if (cpufreq_driver->target)
1145 __cpufreq_governor(data, CPUFREQ_GOV_STOP);
5a01f2e8 1146
1da177e4
LT
1147 kobject_put(&data->kobj);
1148
1149 /* we need to make sure that the underlying kobj is actually
32ee8c3e 1150 * not referenced anymore by anybody before we proceed with
1da177e4
LT
1151 * unloading.
1152 */
1153 dprintk("waiting for dropping of refcount\n");
1154 wait_for_completion(&data->kobj_unregister);
1155 dprintk("wait complete\n");
1156
1157 if (cpufreq_driver->exit)
1158 cpufreq_driver->exit(data);
1159
7d26e2d5 1160 unlock_policy_rwsem_write(cpu);
1161
835481d9
RR
1162 free_cpumask_var(data->related_cpus);
1163 free_cpumask_var(data->cpus);
1da177e4 1164 kfree(data);
835481d9 1165 per_cpu(cpufreq_cpu_data, cpu) = NULL;
1da177e4
LT
1166
1167 cpufreq_debug_enable_ratelimit();
1da177e4
LT
1168 return 0;
1169}
1170
1171
905d77cd 1172static int cpufreq_remove_dev(struct sys_device *sys_dev)
5a01f2e8
VP
1173{
1174 unsigned int cpu = sys_dev->id;
1175 int retval;
ec28297a
VP
1176
1177 if (cpu_is_offline(cpu))
1178 return 0;
1179
5a01f2e8
VP
1180 if (unlikely(lock_policy_rwsem_write(cpu)))
1181 BUG();
1182
1183 retval = __cpufreq_remove_dev(sys_dev);
1184 return retval;
1185}
1186
1187
65f27f38 1188static void handle_update(struct work_struct *work)
1da177e4 1189{
65f27f38
DH
1190 struct cpufreq_policy *policy =
1191 container_of(work, struct cpufreq_policy, update);
1192 unsigned int cpu = policy->cpu;
1da177e4
LT
1193 dprintk("handle_update for cpu %u called\n", cpu);
1194 cpufreq_update_policy(cpu);
1195}
1196
1197/**
1198 * cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're in deep trouble.
1199 * @cpu: cpu number
1200 * @old_freq: CPU frequency the kernel thinks the CPU runs at
1201 * @new_freq: CPU frequency the CPU actually runs at
1202 *
29464f28
DJ
1203 * We adjust to current frequency first, and need to clean up later.
1204 * So either call to cpufreq_update_policy() or schedule handle_update()).
1da177e4 1205 */
e08f5f5b
GS
1206static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
1207 unsigned int new_freq)
1da177e4
LT
1208{
1209 struct cpufreq_freqs freqs;
1210
b10eec22 1211 dprintk("Warning: CPU frequency out of sync: cpufreq and timing "
1da177e4
LT
1212 "core thinks of %u, is %u kHz.\n", old_freq, new_freq);
1213
1214 freqs.cpu = cpu;
1215 freqs.old = old_freq;
1216 freqs.new = new_freq;
1217 cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
1218 cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
1219}
1220
1221
32ee8c3e 1222/**
4ab70df4 1223 * cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
95235ca2
VP
1224 * @cpu: CPU number
1225 *
1226 * This is the last known freq, without actually getting it from the driver.
1227 * Return value will be same as what is shown in scaling_cur_freq in sysfs.
1228 */
1229unsigned int cpufreq_quick_get(unsigned int cpu)
1230{
1231 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
e08f5f5b 1232 unsigned int ret_freq = 0;
95235ca2
VP
1233
1234 if (policy) {
e08f5f5b 1235 ret_freq = policy->cur;
95235ca2
VP
1236 cpufreq_cpu_put(policy);
1237 }
1238
4d34a67d 1239 return ret_freq;
95235ca2
VP
1240}
1241EXPORT_SYMBOL(cpufreq_quick_get);
1242
1243
5a01f2e8 1244static unsigned int __cpufreq_get(unsigned int cpu)
1da177e4 1245{
7a6aedfa 1246 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
e08f5f5b 1247 unsigned int ret_freq = 0;
1da177e4 1248
1da177e4 1249 if (!cpufreq_driver->get)
4d34a67d 1250 return ret_freq;
1da177e4 1251
e08f5f5b 1252 ret_freq = cpufreq_driver->get(cpu);
1da177e4 1253
e08f5f5b
GS
1254 if (ret_freq && policy->cur &&
1255 !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
1256 /* verify no discrepancy between actual and
1257 saved value exists */
1258 if (unlikely(ret_freq != policy->cur)) {
1259 cpufreq_out_of_sync(cpu, policy->cur, ret_freq);
1da177e4
LT
1260 schedule_work(&policy->update);
1261 }
1262 }
1263
4d34a67d 1264 return ret_freq;
5a01f2e8 1265}
1da177e4 1266
5a01f2e8
VP
1267/**
1268 * cpufreq_get - get the current CPU frequency (in kHz)
1269 * @cpu: CPU number
1270 *
1271 * Get the CPU current (static) CPU frequency
1272 */
1273unsigned int cpufreq_get(unsigned int cpu)
1274{
1275 unsigned int ret_freq = 0;
1276 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
1277
1278 if (!policy)
1279 goto out;
1280
1281 if (unlikely(lock_policy_rwsem_read(cpu)))
1282 goto out_policy;
1283
1284 ret_freq = __cpufreq_get(cpu);
1285
1286 unlock_policy_rwsem_read(cpu);
1da177e4 1287
5a01f2e8
VP
1288out_policy:
1289 cpufreq_cpu_put(policy);
1290out:
4d34a67d 1291 return ret_freq;
1da177e4
LT
1292}
1293EXPORT_SYMBOL(cpufreq_get);
1294
1295
42d4dc3f
BH
1296/**
1297 * cpufreq_suspend - let the low level driver prepare for suspend
1298 */
1299
905d77cd 1300static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
42d4dc3f 1301{
e08f5f5b 1302 int ret = 0;
4bc5d341 1303
4bc5d341 1304 int cpu = sysdev->id;
42d4dc3f
BH
1305 struct cpufreq_policy *cpu_policy;
1306
0e37b159 1307 dprintk("suspending cpu %u\n", cpu);
42d4dc3f
BH
1308
1309 if (!cpu_online(cpu))
1310 return 0;
1311
1312 /* we may be lax here as interrupts are off. Nonetheless
1313 * we need to grab the correct cpu policy, as to check
1314 * whether we really run on this CPU.
1315 */
1316
1317 cpu_policy = cpufreq_cpu_get(cpu);
1318 if (!cpu_policy)
1319 return -EINVAL;
1320
1321 /* only handle each CPU group once */
c9060494
DJ
1322 if (unlikely(cpu_policy->cpu != cpu))
1323 goto out;
42d4dc3f
BH
1324
1325 if (cpufreq_driver->suspend) {
e00d9967 1326 ret = cpufreq_driver->suspend(cpu_policy, pmsg);
ce6c3997 1327 if (ret)
42d4dc3f
BH
1328 printk(KERN_ERR "cpufreq: suspend failed in ->suspend "
1329 "step on CPU %u\n", cpu_policy->cpu);
42d4dc3f
BH
1330 }
1331
7d5e350f 1332out:
42d4dc3f 1333 cpufreq_cpu_put(cpu_policy);
c9060494 1334 return ret;
42d4dc3f
BH
1335}
1336
1da177e4
LT
1337/**
1338 * cpufreq_resume - restore proper CPU frequency handling after resume
1339 *
1340 * 1.) resume CPUfreq hardware support (cpufreq_driver->resume())
ce6c3997
DB
1341 * 2.) schedule call cpufreq_update_policy() ASAP as interrupts are
1342 * restored. It will verify that the current freq is in sync with
1343 * what we believe it to be. This is a bit later than when it
1344 * should be, but nonethteless it's better than calling
1345 * cpufreq_driver->get() here which might re-enable interrupts...
1da177e4 1346 */
905d77cd 1347static int cpufreq_resume(struct sys_device *sysdev)
1da177e4 1348{
e08f5f5b 1349 int ret = 0;
4bc5d341 1350
4bc5d341 1351 int cpu = sysdev->id;
1da177e4
LT
1352 struct cpufreq_policy *cpu_policy;
1353
1354 dprintk("resuming cpu %u\n", cpu);
1355
1356 if (!cpu_online(cpu))
1357 return 0;
1358
1359 /* we may be lax here as interrupts are off. Nonetheless
1360 * we need to grab the correct cpu policy, as to check
1361 * whether we really run on this CPU.
1362 */
1363
1364 cpu_policy = cpufreq_cpu_get(cpu);
1365 if (!cpu_policy)
1366 return -EINVAL;
1367
1368 /* only handle each CPU group once */
c9060494
DJ
1369 if (unlikely(cpu_policy->cpu != cpu))
1370 goto fail;
1da177e4
LT
1371
1372 if (cpufreq_driver->resume) {
1373 ret = cpufreq_driver->resume(cpu_policy);
1374 if (ret) {
1375 printk(KERN_ERR "cpufreq: resume failed in ->resume "
1376 "step on CPU %u\n", cpu_policy->cpu);
c9060494 1377 goto fail;
1da177e4
LT
1378 }
1379 }
1380
1da177e4 1381 schedule_work(&cpu_policy->update);
ce6c3997 1382
c9060494 1383fail:
1da177e4
LT
1384 cpufreq_cpu_put(cpu_policy);
1385 return ret;
1386}
1387
1388static struct sysdev_driver cpufreq_sysdev_driver = {
1389 .add = cpufreq_add_dev,
1390 .remove = cpufreq_remove_dev,
42d4dc3f 1391 .suspend = cpufreq_suspend,
1da177e4
LT
1392 .resume = cpufreq_resume,
1393};
1394
1395
1396/*********************************************************************
1397 * NOTIFIER LISTS INTERFACE *
1398 *********************************************************************/
1399
1400/**
1401 * cpufreq_register_notifier - register a driver with cpufreq
1402 * @nb: notifier function to register
1403 * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
1404 *
32ee8c3e 1405 * Add a driver to one of two lists: either a list of drivers that
1da177e4
LT
1406 * are notified about clock rate changes (once before and once after
1407 * the transition), or a list of drivers that are notified about
1408 * changes in cpufreq policy.
1409 *
1410 * This function may sleep, and has the same return conditions as
e041c683 1411 * blocking_notifier_chain_register.
1da177e4
LT
1412 */
1413int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
1414{
1415 int ret;
1416
74212ca4
CEB
1417 WARN_ON(!init_cpufreq_transition_notifier_list_called);
1418
1da177e4
LT
1419 switch (list) {
1420 case CPUFREQ_TRANSITION_NOTIFIER:
b4dfdbb3 1421 ret = srcu_notifier_chain_register(
e041c683 1422 &cpufreq_transition_notifier_list, nb);
1da177e4
LT
1423 break;
1424 case CPUFREQ_POLICY_NOTIFIER:
e041c683
AS
1425 ret = blocking_notifier_chain_register(
1426 &cpufreq_policy_notifier_list, nb);
1da177e4
LT
1427 break;
1428 default:
1429 ret = -EINVAL;
1430 }
1da177e4
LT
1431
1432 return ret;
1433}
1434EXPORT_SYMBOL(cpufreq_register_notifier);
1435
1436
1437/**
1438 * cpufreq_unregister_notifier - unregister a driver with cpufreq
1439 * @nb: notifier block to be unregistered
1440 * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
1441 *
1442 * Remove a driver from the CPU frequency notifier list.
1443 *
1444 * This function may sleep, and has the same return conditions as
e041c683 1445 * blocking_notifier_chain_unregister.
1da177e4
LT
1446 */
1447int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
1448{
1449 int ret;
1450
1da177e4
LT
1451 switch (list) {
1452 case CPUFREQ_TRANSITION_NOTIFIER:
b4dfdbb3 1453 ret = srcu_notifier_chain_unregister(
e041c683 1454 &cpufreq_transition_notifier_list, nb);
1da177e4
LT
1455 break;
1456 case CPUFREQ_POLICY_NOTIFIER:
e041c683
AS
1457 ret = blocking_notifier_chain_unregister(
1458 &cpufreq_policy_notifier_list, nb);
1da177e4
LT
1459 break;
1460 default:
1461 ret = -EINVAL;
1462 }
1da177e4
LT
1463
1464 return ret;
1465}
1466EXPORT_SYMBOL(cpufreq_unregister_notifier);
1467
1468
1469/*********************************************************************
1470 * GOVERNORS *
1471 *********************************************************************/
1472
1473
1474int __cpufreq_driver_target(struct cpufreq_policy *policy,
1475 unsigned int target_freq,
1476 unsigned int relation)
1477{
1478 int retval = -EINVAL;
c32b6b8e 1479
1da177e4
LT
1480 dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu,
1481 target_freq, relation);
1482 if (cpu_online(policy->cpu) && cpufreq_driver->target)
1483 retval = cpufreq_driver->target(policy, target_freq, relation);
90d45d17 1484
1da177e4
LT
1485 return retval;
1486}
1487EXPORT_SYMBOL_GPL(__cpufreq_driver_target);
1488
1da177e4
LT
1489int cpufreq_driver_target(struct cpufreq_policy *policy,
1490 unsigned int target_freq,
1491 unsigned int relation)
1492{
f1829e4a 1493 int ret = -EINVAL;
1da177e4
LT
1494
1495 policy = cpufreq_cpu_get(policy->cpu);
1496 if (!policy)
f1829e4a 1497 goto no_policy;
1da177e4 1498
5a01f2e8 1499 if (unlikely(lock_policy_rwsem_write(policy->cpu)))
f1829e4a 1500 goto fail;
1da177e4
LT
1501
1502 ret = __cpufreq_driver_target(policy, target_freq, relation);
1503
5a01f2e8 1504 unlock_policy_rwsem_write(policy->cpu);
1da177e4 1505
f1829e4a 1506fail:
1da177e4 1507 cpufreq_cpu_put(policy);
f1829e4a 1508no_policy:
1da177e4
LT
1509 return ret;
1510}
1511EXPORT_SYMBOL_GPL(cpufreq_driver_target);
1512
bf0b90e3 1513int __cpufreq_driver_getavg(struct cpufreq_policy *policy, unsigned int cpu)
dfde5d62
VP
1514{
1515 int ret = 0;
1516
1517 policy = cpufreq_cpu_get(policy->cpu);
1518 if (!policy)
1519 return -EINVAL;
1520
bf0b90e3 1521 if (cpu_online(cpu) && cpufreq_driver->getavg)
1522 ret = cpufreq_driver->getavg(policy, cpu);
dfde5d62 1523
dfde5d62
VP
1524 cpufreq_cpu_put(policy);
1525 return ret;
1526}
5a01f2e8 1527EXPORT_SYMBOL_GPL(__cpufreq_driver_getavg);
dfde5d62 1528
153d7f3f 1529/*
153d7f3f
AV
1530 * when "event" is CPUFREQ_GOV_LIMITS
1531 */
1da177e4 1532
e08f5f5b
GS
1533static int __cpufreq_governor(struct cpufreq_policy *policy,
1534 unsigned int event)
1da177e4 1535{
cc993cab 1536 int ret;
6afde10c
TR
1537
1538 /* Only must be defined when default governor is known to have latency
1539 restrictions, like e.g. conservative or ondemand.
1540 That this is the case is already ensured in Kconfig
1541 */
1542#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
1543 struct cpufreq_governor *gov = &cpufreq_gov_performance;
1544#else
1545 struct cpufreq_governor *gov = NULL;
1546#endif
1c256245
TR
1547
1548 if (policy->governor->max_transition_latency &&
1549 policy->cpuinfo.transition_latency >
1550 policy->governor->max_transition_latency) {
6afde10c
TR
1551 if (!gov)
1552 return -EINVAL;
1553 else {
1554 printk(KERN_WARNING "%s governor failed, too long"
1555 " transition latency of HW, fallback"
1556 " to %s governor\n",
1557 policy->governor->name,
1558 gov->name);
1559 policy->governor = gov;
1560 }
1c256245 1561 }
1da177e4
LT
1562
1563 if (!try_module_get(policy->governor->owner))
1564 return -EINVAL;
1565
e08f5f5b
GS
1566 dprintk("__cpufreq_governor for CPU %u, event %u\n",
1567 policy->cpu, event);
1da177e4
LT
1568 ret = policy->governor->governor(policy, event);
1569
e08f5f5b
GS
1570 /* we keep one module reference alive for
1571 each CPU governed by this CPU */
1da177e4
LT
1572 if ((event != CPUFREQ_GOV_START) || ret)
1573 module_put(policy->governor->owner);
1574 if ((event == CPUFREQ_GOV_STOP) && !ret)
1575 module_put(policy->governor->owner);
1576
1577 return ret;
1578}
1579
1580
1da177e4
LT
1581int cpufreq_register_governor(struct cpufreq_governor *governor)
1582{
3bcb09a3 1583 int err;
1da177e4
LT
1584
1585 if (!governor)
1586 return -EINVAL;
1587
3fc54d37 1588 mutex_lock(&cpufreq_governor_mutex);
32ee8c3e 1589
3bcb09a3
JF
1590 err = -EBUSY;
1591 if (__find_governor(governor->name) == NULL) {
1592 err = 0;
1593 list_add(&governor->governor_list, &cpufreq_governor_list);
1da177e4 1594 }
1da177e4 1595
32ee8c3e 1596 mutex_unlock(&cpufreq_governor_mutex);
3bcb09a3 1597 return err;
1da177e4
LT
1598}
1599EXPORT_SYMBOL_GPL(cpufreq_register_governor);
1600
1601
1602void cpufreq_unregister_governor(struct cpufreq_governor *governor)
1603{
1604 if (!governor)
1605 return;
1606
3fc54d37 1607 mutex_lock(&cpufreq_governor_mutex);
1da177e4 1608 list_del(&governor->governor_list);
3fc54d37 1609 mutex_unlock(&cpufreq_governor_mutex);
1da177e4
LT
1610 return;
1611}
1612EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
1613
1614
1615
1616/*********************************************************************
1617 * POLICY INTERFACE *
1618 *********************************************************************/
1619
1620/**
1621 * cpufreq_get_policy - get the current cpufreq_policy
29464f28
DJ
1622 * @policy: struct cpufreq_policy into which the current cpufreq_policy
1623 * is written
1da177e4
LT
1624 *
1625 * Reads the current cpufreq policy.
1626 */
1627int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
1628{
1629 struct cpufreq_policy *cpu_policy;
1630 if (!policy)
1631 return -EINVAL;
1632
1633 cpu_policy = cpufreq_cpu_get(cpu);
1634 if (!cpu_policy)
1635 return -EINVAL;
1636
1da177e4 1637 memcpy(policy, cpu_policy, sizeof(struct cpufreq_policy));
1da177e4
LT
1638
1639 cpufreq_cpu_put(cpu_policy);
1da177e4
LT
1640 return 0;
1641}
1642EXPORT_SYMBOL(cpufreq_get_policy);
1643
1644
153d7f3f 1645/*
e08f5f5b
GS
1646 * data : current policy.
1647 * policy : policy to be set.
153d7f3f 1648 */
e08f5f5b
GS
1649static int __cpufreq_set_policy(struct cpufreq_policy *data,
1650 struct cpufreq_policy *policy)
1da177e4
LT
1651{
1652 int ret = 0;
1653
1654 cpufreq_debug_disable_ratelimit();
1655 dprintk("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
1656 policy->min, policy->max);
1657
e08f5f5b
GS
1658 memcpy(&policy->cpuinfo, &data->cpuinfo,
1659 sizeof(struct cpufreq_cpuinfo));
1da177e4 1660
53391fa2 1661 if (policy->min > data->max || policy->max < data->min) {
9c9a43ed
MD
1662 ret = -EINVAL;
1663 goto error_out;
1664 }
1665
1da177e4
LT
1666 /* verify the cpu speed can be set within this limit */
1667 ret = cpufreq_driver->verify(policy);
1668 if (ret)
1669 goto error_out;
1670
1da177e4 1671 /* adjust if necessary - all reasons */
e041c683
AS
1672 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1673 CPUFREQ_ADJUST, policy);
1da177e4
LT
1674
1675 /* adjust if necessary - hardware incompatibility*/
e041c683
AS
1676 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1677 CPUFREQ_INCOMPATIBLE, policy);
1da177e4
LT
1678
1679 /* verify the cpu speed can be set within this limit,
1680 which might be different to the first one */
1681 ret = cpufreq_driver->verify(policy);
e041c683 1682 if (ret)
1da177e4 1683 goto error_out;
1da177e4
LT
1684
1685 /* notification of the new policy */
e041c683
AS
1686 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1687 CPUFREQ_NOTIFY, policy);
1da177e4 1688
7d5e350f
DJ
1689 data->min = policy->min;
1690 data->max = policy->max;
1da177e4 1691
e08f5f5b
GS
1692 dprintk("new min and max freqs are %u - %u kHz\n",
1693 data->min, data->max);
1da177e4
LT
1694
1695 if (cpufreq_driver->setpolicy) {
1696 data->policy = policy->policy;
1697 dprintk("setting range\n");
1698 ret = cpufreq_driver->setpolicy(policy);
1699 } else {
1700 if (policy->governor != data->governor) {
1701 /* save old, working values */
1702 struct cpufreq_governor *old_gov = data->governor;
1703
1704 dprintk("governor switch\n");
1705
1706 /* end old governor */
1707 if (data->governor)
1708 __cpufreq_governor(data, CPUFREQ_GOV_STOP);
1709
1710 /* start new governor */
1711 data->governor = policy->governor;
1712 if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
1713 /* new governor failed, so re-start old one */
e08f5f5b
GS
1714 dprintk("starting governor %s failed\n",
1715 data->governor->name);
1da177e4
LT
1716 if (old_gov) {
1717 data->governor = old_gov;
e08f5f5b
GS
1718 __cpufreq_governor(data,
1719 CPUFREQ_GOV_START);
1da177e4
LT
1720 }
1721 ret = -EINVAL;
1722 goto error_out;
1723 }
1724 /* might be a policy change, too, so fall through */
1725 }
1726 dprintk("governor: change or update limits\n");
1727 __cpufreq_governor(data, CPUFREQ_GOV_LIMITS);
1728 }
1729
7d5e350f 1730error_out:
1da177e4
LT
1731 cpufreq_debug_enable_ratelimit();
1732 return ret;
1733}
1734
1da177e4
LT
1735/**
1736 * cpufreq_update_policy - re-evaluate an existing cpufreq policy
1737 * @cpu: CPU which shall be re-evaluated
1738 *
1739 * Usefull for policy notifiers which have different necessities
1740 * at different times.
1741 */
1742int cpufreq_update_policy(unsigned int cpu)
1743{
1744 struct cpufreq_policy *data = cpufreq_cpu_get(cpu);
1745 struct cpufreq_policy policy;
f1829e4a 1746 int ret;
1da177e4 1747
f1829e4a
JL
1748 if (!data) {
1749 ret = -ENODEV;
1750 goto no_policy;
1751 }
1da177e4 1752
f1829e4a
JL
1753 if (unlikely(lock_policy_rwsem_write(cpu))) {
1754 ret = -EINVAL;
1755 goto fail;
1756 }
1da177e4
LT
1757
1758 dprintk("updating policy for CPU %u\n", cpu);
7d5e350f 1759 memcpy(&policy, data, sizeof(struct cpufreq_policy));
1da177e4
LT
1760 policy.min = data->user_policy.min;
1761 policy.max = data->user_policy.max;
1762 policy.policy = data->user_policy.policy;
1763 policy.governor = data->user_policy.governor;
1764
0961dd0d
TR
1765 /* BIOS might change freq behind our back
1766 -> ask driver for current freq and notify governors about a change */
1767 if (cpufreq_driver->get) {
1768 policy.cur = cpufreq_driver->get(cpu);
a85f7bd3
TR
1769 if (!data->cur) {
1770 dprintk("Driver did not initialize current freq");
1771 data->cur = policy.cur;
1772 } else {
1773 if (data->cur != policy.cur)
e08f5f5b
GS
1774 cpufreq_out_of_sync(cpu, data->cur,
1775 policy.cur);
a85f7bd3 1776 }
0961dd0d
TR
1777 }
1778
1da177e4
LT
1779 ret = __cpufreq_set_policy(data, &policy);
1780
5a01f2e8
VP
1781 unlock_policy_rwsem_write(cpu);
1782
f1829e4a 1783fail:
1da177e4 1784 cpufreq_cpu_put(data);
f1829e4a 1785no_policy:
1da177e4
LT
1786 return ret;
1787}
1788EXPORT_SYMBOL(cpufreq_update_policy);
1789
dd184a01 1790static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
c32b6b8e
AR
1791 unsigned long action, void *hcpu)
1792{
1793 unsigned int cpu = (unsigned long)hcpu;
c32b6b8e
AR
1794 struct sys_device *sys_dev;
1795
1796 sys_dev = get_cpu_sysdev(cpu);
c32b6b8e
AR
1797 if (sys_dev) {
1798 switch (action) {
1799 case CPU_ONLINE:
8bb78442 1800 case CPU_ONLINE_FROZEN:
c32b6b8e
AR
1801 cpufreq_add_dev(sys_dev);
1802 break;
1803 case CPU_DOWN_PREPARE:
8bb78442 1804 case CPU_DOWN_PREPARE_FROZEN:
5a01f2e8
VP
1805 if (unlikely(lock_policy_rwsem_write(cpu)))
1806 BUG();
1807
5a01f2e8 1808 __cpufreq_remove_dev(sys_dev);
c32b6b8e 1809 break;
5a01f2e8 1810 case CPU_DOWN_FAILED:
8bb78442 1811 case CPU_DOWN_FAILED_FROZEN:
5a01f2e8 1812 cpufreq_add_dev(sys_dev);
c32b6b8e
AR
1813 break;
1814 }
1815 }
1816 return NOTIFY_OK;
1817}
1818
f6ebef30 1819static struct notifier_block __refdata cpufreq_cpu_notifier =
c32b6b8e
AR
1820{
1821 .notifier_call = cpufreq_cpu_callback,
1822};
1da177e4
LT
1823
1824/*********************************************************************
1825 * REGISTER / UNREGISTER CPUFREQ DRIVER *
1826 *********************************************************************/
1827
1828/**
1829 * cpufreq_register_driver - register a CPU Frequency driver
1830 * @driver_data: A struct cpufreq_driver containing the values#
1831 * submitted by the CPU Frequency driver.
1832 *
32ee8c3e 1833 * Registers a CPU Frequency driver to this core code. This code
1da177e4 1834 * returns zero on success, -EBUSY when another driver got here first
32ee8c3e 1835 * (and isn't unregistered in the meantime).
1da177e4
LT
1836 *
1837 */
221dee28 1838int cpufreq_register_driver(struct cpufreq_driver *driver_data)
1da177e4
LT
1839{
1840 unsigned long flags;
1841 int ret;
1842
1843 if (!driver_data || !driver_data->verify || !driver_data->init ||
1844 ((!driver_data->setpolicy) && (!driver_data->target)))
1845 return -EINVAL;
1846
1847 dprintk("trying to register driver %s\n", driver_data->name);
1848
1849 if (driver_data->setpolicy)
1850 driver_data->flags |= CPUFREQ_CONST_LOOPS;
1851
1852 spin_lock_irqsave(&cpufreq_driver_lock, flags);
1853 if (cpufreq_driver) {
1854 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1855 return -EBUSY;
1856 }
1857 cpufreq_driver = driver_data;
1858 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1859
7a6aedfa
MT
1860 ret = sysdev_driver_register(&cpu_sysdev_class,
1861 &cpufreq_sysdev_driver);
1da177e4
LT
1862
1863 if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) {
1864 int i;
1865 ret = -ENODEV;
1866
1867 /* check for at least one working CPU */
7a6aedfa
MT
1868 for (i = 0; i < nr_cpu_ids; i++)
1869 if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) {
1da177e4 1870 ret = 0;
7a6aedfa
MT
1871 break;
1872 }
1da177e4
LT
1873
1874 /* if all ->init() calls failed, unregister */
1875 if (ret) {
e08f5f5b
GS
1876 dprintk("no CPU initialized for driver %s\n",
1877 driver_data->name);
1878 sysdev_driver_unregister(&cpu_sysdev_class,
1879 &cpufreq_sysdev_driver);
1da177e4
LT
1880
1881 spin_lock_irqsave(&cpufreq_driver_lock, flags);
1882 cpufreq_driver = NULL;
1883 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1884 }
1885 }
1886
1887 if (!ret) {
65edc68c 1888 register_hotcpu_notifier(&cpufreq_cpu_notifier);
1da177e4
LT
1889 dprintk("driver %s up and running\n", driver_data->name);
1890 cpufreq_debug_enable_ratelimit();
1891 }
1892
4d34a67d 1893 return ret;
1da177e4
LT
1894}
1895EXPORT_SYMBOL_GPL(cpufreq_register_driver);
1896
1897
1898/**
1899 * cpufreq_unregister_driver - unregister the current CPUFreq driver
1900 *
32ee8c3e 1901 * Unregister the current CPUFreq driver. Only call this if you have
1da177e4
LT
1902 * the right to do so, i.e. if you have succeeded in initialising before!
1903 * Returns zero if successful, and -EINVAL if the cpufreq_driver is
1904 * currently not initialised.
1905 */
221dee28 1906int cpufreq_unregister_driver(struct cpufreq_driver *driver)
1da177e4
LT
1907{
1908 unsigned long flags;
1909
1910 cpufreq_debug_disable_ratelimit();
1911
1912 if (!cpufreq_driver || (driver != cpufreq_driver)) {
1913 cpufreq_debug_enable_ratelimit();
1914 return -EINVAL;
1915 }
1916
1917 dprintk("unregistering driver %s\n", driver->name);
1918
1919 sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver);
65edc68c 1920 unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
1da177e4
LT
1921
1922 spin_lock_irqsave(&cpufreq_driver_lock, flags);
1923 cpufreq_driver = NULL;
1924 spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1925
1926 return 0;
1927}
1928EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
5a01f2e8
VP
1929
1930static int __init cpufreq_core_init(void)
1931{
1932 int cpu;
1933
1934 for_each_possible_cpu(cpu) {
1935 per_cpu(policy_cpu, cpu) = -1;
1936 init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
1937 }
1938 return 0;
1939}
1940
1941core_initcall(cpufreq_core_init);
This page took 0.511852 seconds and 5 git commands to generate.