cpufreq.c 49.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
/*
 *  linux/drivers/cpufreq/cpufreq.c
 *
 *  Copyright (C) 2001 Russell King
 *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
 *
7
 *  Oct 2005 - Ashok Raj <ashok.raj@intel.com>
8
 *	Added handling for CPU hotplug
9 10
 *  Feb 2006 - Jacob Shin <jacob.shin@amd.com>
 *	Fix handling for CPU hotplug -- affected CPUs
11
 *
L
Linus Torvalds 已提交
12 13 14 15 16 17
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 */

V
Viresh Kumar 已提交
18 19
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
20 21 22 23 24 25 26 27 28 29 30 31
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/notifier.h>
#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/cpu.h>
#include <linux/completion.h>
32
#include <linux/mutex.h>
33
#include <linux/syscore_ops.h>
L
Linus Torvalds 已提交
34

35 36
#include <trace/events/power.h>

L
Linus Torvalds 已提交
37
/**
D
Dave Jones 已提交
38
 * The "cpufreq driver" - the arch- or hardware-dependent low
L
Linus Torvalds 已提交
39 40 41
 * level driver of CPUFreq support, and its spinlock. This lock
 * also protects the cpufreq_cpu_data array.
 */
42
static struct cpufreq_driver *cpufreq_driver;
43
static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
44 45
#ifdef CONFIG_HOTPLUG_CPU
/* This one keeps track of the previously set governor of a removed CPU */
46
static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
47
#endif
L
Linus Torvalds 已提交
48 49
static DEFINE_SPINLOCK(cpufreq_driver_lock);

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
/*
 * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
 * all cpufreq/hotplug/workqueue/etc related lock issues.
 *
 * The rules for this semaphore:
 * - Any routine that wants to read from the policy structure will
 *   do a down_read on this semaphore.
 * - Any routine that will write to the policy structure and/or may take away
 *   the policy altogether (eg. CPU hotplug), will hold this lock in write
 *   mode before doing so.
 *
 * Additional rules:
 * - All holders of the lock should check to make sure that the CPU they
 *   are concerned with are online after they get the lock.
 * - Governor routines that can be called in cpufreq hotplug path should not
 *   take this sem as top level hotplug notifier handler takes this.
66 67
 * - Lock should not be held across
 *     __cpufreq_governor(data, CPUFREQ_GOV_STOP);
68
 */
69
static DEFINE_PER_CPU(int, cpufreq_policy_cpu);
70 71 72
static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);

#define lock_policy_rwsem(mode, cpu)					\
73
static int lock_policy_rwsem_##mode					\
74 75
(int cpu)								\
{									\
76
	int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu);		\
77 78 79 80 81 82 83 84 85 86
	BUG_ON(policy_cpu == -1);					\
	down_##mode(&per_cpu(cpu_policy_rwsem, policy_cpu));		\
									\
	return 0;							\
}

lock_policy_rwsem(read, cpu);

lock_policy_rwsem(write, cpu);

87
static void unlock_policy_rwsem_read(int cpu)
88
{
89
	int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu);
90 91 92 93
	BUG_ON(policy_cpu == -1);
	up_read(&per_cpu(cpu_policy_rwsem, policy_cpu));
}

94
static void unlock_policy_rwsem_write(int cpu)
95
{
96
	int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu);
97 98 99 100 101
	BUG_ON(policy_cpu == -1);
	up_write(&per_cpu(cpu_policy_rwsem, policy_cpu));
}


L
Linus Torvalds 已提交
102
/* internal prototypes */
103 104
static int __cpufreq_governor(struct cpufreq_policy *policy,
		unsigned int event);
105
static unsigned int __cpufreq_get(unsigned int cpu);
106
static void handle_update(struct work_struct *work);
L
Linus Torvalds 已提交
107 108

/**
109 110
 * Two notifier lists: the "policy" list is involved in the
 * validation process for a new CPU frequency policy; the
L
Linus Torvalds 已提交
111 112 113 114
 * "transition" list for kernel code that needs to handle
 * changes to devices when the CPU clock speed changes.
 * The mutex locks both lists.
 */
115
static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
116
static struct srcu_notifier_head cpufreq_transition_notifier_list;
L
Linus Torvalds 已提交
117

118
static bool init_cpufreq_transition_notifier_list_called;
119 120 121
static int __init init_cpufreq_transition_notifier_list(void)
{
	srcu_init_notifier_head(&cpufreq_transition_notifier_list);
122
	init_cpufreq_transition_notifier_list_called = true;
123 124
	return 0;
}
125
pure_initcall(init_cpufreq_transition_notifier_list);
L
Linus Torvalds 已提交
126

127
static int off __read_mostly;
128
static int cpufreq_disabled(void)
129 130 131 132 133 134 135
{
	return off;
}
void disable_cpufreq(void)
{
	off = 1;
}
L
Linus Torvalds 已提交
136
static LIST_HEAD(cpufreq_governor_list);
137
static DEFINE_MUTEX(cpufreq_governor_mutex);
L
Linus Torvalds 已提交
138

139
static struct cpufreq_policy *__cpufreq_cpu_get(unsigned int cpu, bool sysfs)
L
Linus Torvalds 已提交
140 141 142 143
{
	struct cpufreq_policy *data;
	unsigned long flags;

144
	if (cpu >= nr_cpu_ids)
L
Linus Torvalds 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157
		goto err_out;

	/* get the cpufreq driver */
	spin_lock_irqsave(&cpufreq_driver_lock, flags);

	if (!cpufreq_driver)
		goto err_out_unlock;

	if (!try_module_get(cpufreq_driver->owner))
		goto err_out_unlock;


	/* get the CPU */
158
	data = per_cpu(cpufreq_cpu_data, cpu);
L
Linus Torvalds 已提交
159 160 161 162

	if (!data)
		goto err_out_put_module;

163
	if (!sysfs && !kobject_get(&data->kobj))
L
Linus Torvalds 已提交
164 165 166 167 168
		goto err_out_put_module;

	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
	return data;

169
err_out_put_module:
L
Linus Torvalds 已提交
170
	module_put(cpufreq_driver->owner);
171
err_out_unlock:
L
Linus Torvalds 已提交
172
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
173
err_out:
L
Linus Torvalds 已提交
174 175
	return NULL;
}
176 177 178

struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
{
179 180 181
	if (cpufreq_disabled())
		return NULL;

182 183
	return __cpufreq_cpu_get(cpu, false);
}
L
Linus Torvalds 已提交
184 185
EXPORT_SYMBOL_GPL(cpufreq_cpu_get);

186 187 188 189 190 191 192 193 194 195 196
static struct cpufreq_policy *cpufreq_cpu_get_sysfs(unsigned int cpu)
{
	return __cpufreq_cpu_get(cpu, true);
}

static void __cpufreq_cpu_put(struct cpufreq_policy *data, bool sysfs)
{
	if (!sysfs)
		kobject_put(&data->kobj);
	module_put(cpufreq_driver->owner);
}
197

L
Linus Torvalds 已提交
198 199
void cpufreq_cpu_put(struct cpufreq_policy *data)
{
200 201 202
	if (cpufreq_disabled())
		return;

203
	__cpufreq_cpu_put(data, false);
L
Linus Torvalds 已提交
204 205 206
}
EXPORT_SYMBOL_GPL(cpufreq_cpu_put);

207 208 209 210
static void cpufreq_cpu_put_sysfs(struct cpufreq_policy *data)
{
	__cpufreq_cpu_put(data, true);
}
L
Linus Torvalds 已提交
211 212 213 214 215 216 217 218 219 220

/*********************************************************************
 *            EXTERNALLY AFFECTING FREQUENCY CHANGES                 *
 *********************************************************************/

/**
 * adjust_jiffies - adjust the system "loops_per_jiffy"
 *
 * This function alters the system "loops_per_jiffy" for the clock
 * speed change. Note that loops_per_jiffy cannot be updated on SMP
221
 * systems as each CPU might be scaled differently. So, use the arch
L
Linus Torvalds 已提交
222 223 224 225 226 227
 * per-CPU loops_per_jiffy value wherever possible.
 */
#ifndef CONFIG_SMP
static unsigned long l_p_j_ref;
static unsigned int  l_p_j_ref_freq;

228
static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
L
Linus Torvalds 已提交
229 230 231 232 233 234 235
{
	if (ci->flags & CPUFREQ_CONST_LOOPS)
		return;

	if (!l_p_j_ref_freq) {
		l_p_j_ref = loops_per_jiffy;
		l_p_j_ref_freq = ci->old;
236
		pr_debug("saving %lu as reference value for loops_per_jiffy; "
237
			"freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
L
Linus Torvalds 已提交
238
	}
239
	if ((val == CPUFREQ_POSTCHANGE  && ci->old != ci->new) ||
240
	    (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
241 242
		loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
								ci->new);
243
		pr_debug("scaling loops_per_jiffy to %lu "
244
			"for frequency %u kHz\n", loops_per_jiffy, ci->new);
L
Linus Torvalds 已提交
245 246 247
	}
}
#else
248 249 250 251
static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
{
	return;
}
L
Linus Torvalds 已提交
252 253 254 255
#endif


/**
256 257
 * cpufreq_notify_transition - call notifier chain and adjust_jiffies
 * on frequency transition.
L
Linus Torvalds 已提交
258
 *
259 260
 * This function calls the transition notifiers and the "adjust_jiffies"
 * function. It is called twice on all CPU frequency changes that have
261
 * external effects.
L
Linus Torvalds 已提交
262 263 264
 */
void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)
{
265 266
	struct cpufreq_policy *policy;

L
Linus Torvalds 已提交
267 268
	BUG_ON(irqs_disabled());

269 270 271
	if (cpufreq_disabled())
		return;

L
Linus Torvalds 已提交
272
	freqs->flags = cpufreq_driver->flags;
273
	pr_debug("notification %u of frequency transition to %u kHz\n",
274
		state, freqs->new);
L
Linus Torvalds 已提交
275

276
	policy = per_cpu(cpufreq_cpu_data, freqs->cpu);
L
Linus Torvalds 已提交
277
	switch (state) {
278

L
Linus Torvalds 已提交
279
	case CPUFREQ_PRECHANGE:
280
		/* detect if the driver reported a value as "old frequency"
281 282
		 * which is not equal to what the cpufreq core thinks is
		 * "old frequency".
L
Linus Torvalds 已提交
283 284
		 */
		if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
285 286
			if ((policy) && (policy->cpu == freqs->cpu) &&
			    (policy->cur) && (policy->cur != freqs->old)) {
287
				pr_debug("Warning: CPU frequency is"
288 289 290
					" %u, cpufreq assumed %u kHz.\n",
					freqs->old, policy->cur);
				freqs->old = policy->cur;
L
Linus Torvalds 已提交
291 292
			}
		}
293
		srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
294
				CPUFREQ_PRECHANGE, freqs);
L
Linus Torvalds 已提交
295 296
		adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
		break;
297

L
Linus Torvalds 已提交
298 299
	case CPUFREQ_POSTCHANGE:
		adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
300
		pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new,
301 302
			(unsigned long)freqs->cpu);
		trace_power_frequency(POWER_PSTATE, freqs->new, freqs->cpu);
303
		trace_cpu_frequency(freqs->new, freqs->cpu);
304
		srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
305
				CPUFREQ_POSTCHANGE, freqs);
306 307
		if (likely(policy) && likely(policy->cpu == freqs->cpu))
			policy->cur = freqs->new;
L
Linus Torvalds 已提交
308 309 310 311 312 313 314 315 316 317 318
		break;
	}
}
EXPORT_SYMBOL_GPL(cpufreq_notify_transition);



/*********************************************************************
 *                          SYSFS INTERFACE                          *
 *********************************************************************/

319 320 321 322 323
static struct cpufreq_governor *__find_governor(const char *str_governor)
{
	struct cpufreq_governor *t;

	list_for_each_entry(t, &cpufreq_governor_list, governor_list)
324
		if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN))
325 326 327 328 329
			return t;

	return NULL;
}

L
Linus Torvalds 已提交
330 331 332
/**
 * cpufreq_parse_governor - parse a governor string
 */
D
Dave Jones 已提交
333
static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
L
Linus Torvalds 已提交
334 335
				struct cpufreq_governor **governor)
{
336 337
	int err = -EINVAL;

L
Linus Torvalds 已提交
338
	if (!cpufreq_driver)
339 340
		goto out;

L
Linus Torvalds 已提交
341 342 343
	if (cpufreq_driver->setpolicy) {
		if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
			*policy = CPUFREQ_POLICY_PERFORMANCE;
344
			err = 0;
345 346
		} else if (!strnicmp(str_governor, "powersave",
						CPUFREQ_NAME_LEN)) {
L
Linus Torvalds 已提交
347
			*policy = CPUFREQ_POLICY_POWERSAVE;
348
			err = 0;
L
Linus Torvalds 已提交
349
		}
350
	} else if (cpufreq_driver->target) {
L
Linus Torvalds 已提交
351
		struct cpufreq_governor *t;
352

353
		mutex_lock(&cpufreq_governor_mutex);
354 355 356

		t = __find_governor(str_governor);

357
		if (t == NULL) {
358
			int ret;
359

360 361 362
			mutex_unlock(&cpufreq_governor_mutex);
			ret = request_module("cpufreq_%s", str_governor);
			mutex_lock(&cpufreq_governor_mutex);
363

364 365
			if (ret == 0)
				t = __find_governor(str_governor);
366 367
		}

368 369 370
		if (t != NULL) {
			*governor = t;
			err = 0;
L
Linus Torvalds 已提交
371
		}
372

373
		mutex_unlock(&cpufreq_governor_mutex);
L
Linus Torvalds 已提交
374
	}
375
out:
376
	return err;
L
Linus Torvalds 已提交
377 378 379 380
}


/**
381 382
 * cpufreq_per_cpu_attr_read() / show_##file_name() -
 * print out cpufreq information
L
Linus Torvalds 已提交
383 384 385 386 387
 *
 * Write out information from cpufreq_driver->policy[cpu]; object must be
 * "unsigned int".
 */

388 389
#define show_one(file_name, object)			\
static ssize_t show_##file_name				\
D
Dave Jones 已提交
390
(struct cpufreq_policy *policy, char *buf)		\
391
{							\
392
	return sprintf(buf, "%u\n", policy->object);	\
L
Linus Torvalds 已提交
393 394 395 396
}

show_one(cpuinfo_min_freq, cpuinfo.min_freq);
show_one(cpuinfo_max_freq, cpuinfo.max_freq);
397
show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
L
Linus Torvalds 已提交
398 399 400 401
show_one(scaling_min_freq, min);
show_one(scaling_max_freq, max);
show_one(scaling_cur_freq, cur);

402 403
static int __cpufreq_set_policy(struct cpufreq_policy *data,
				struct cpufreq_policy *policy);
404

L
Linus Torvalds 已提交
405 406 407 408 409
/**
 * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
 */
#define store_one(file_name, object)			\
static ssize_t store_##file_name					\
D
Dave Jones 已提交
410
(struct cpufreq_policy *policy, const char *buf, size_t count)		\
L
Linus Torvalds 已提交
411
{									\
412
	unsigned int ret;						\
L
Linus Torvalds 已提交
413 414 415 416 417 418
	struct cpufreq_policy new_policy;				\
									\
	ret = cpufreq_get_policy(&new_policy, policy->cpu);		\
	if (ret)							\
		return -EINVAL;						\
									\
419
	ret = sscanf(buf, "%u", &new_policy.object);			\
L
Linus Torvalds 已提交
420 421 422
	if (ret != 1)							\
		return -EINVAL;						\
									\
423 424
	ret = __cpufreq_set_policy(policy, &new_policy);		\
	policy->user_policy.object = policy->object;			\
L
Linus Torvalds 已提交
425 426 427 428
									\
	return ret ? ret : count;					\
}

429 430
store_one(scaling_min_freq, min);
store_one(scaling_max_freq, max);
L
Linus Torvalds 已提交
431 432 433 434

/**
 * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
 */
D
Dave Jones 已提交
435 436
static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
					char *buf)
L
Linus Torvalds 已提交
437
{
438
	unsigned int cur_freq = __cpufreq_get(policy->cpu);
L
Linus Torvalds 已提交
439 440 441 442 443 444 445 446 447
	if (!cur_freq)
		return sprintf(buf, "<unknown>");
	return sprintf(buf, "%u\n", cur_freq);
}


/**
 * show_scaling_governor - show the current policy for the specified CPU
 */
D
Dave Jones 已提交
448
static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
L
Linus Torvalds 已提交
449
{
450
	if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
L
Linus Torvalds 已提交
451 452 453 454
		return sprintf(buf, "powersave\n");
	else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)
		return sprintf(buf, "performance\n");
	else if (policy->governor)
455
		return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n",
456
				policy->governor->name);
L
Linus Torvalds 已提交
457 458 459 460 461 462 463
	return -EINVAL;
}


/**
 * store_scaling_governor - store policy for the specified CPU
 */
D
Dave Jones 已提交
464 465
static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
					const char *buf, size_t count)
L
Linus Torvalds 已提交
466
{
467
	unsigned int ret;
L
Linus Torvalds 已提交
468 469 470 471 472 473 474
	char	str_governor[16];
	struct cpufreq_policy new_policy;

	ret = cpufreq_get_policy(&new_policy, policy->cpu);
	if (ret)
		return ret;

475
	ret = sscanf(buf, "%15s", str_governor);
L
Linus Torvalds 已提交
476 477 478
	if (ret != 1)
		return -EINVAL;

479 480
	if (cpufreq_parse_governor(str_governor, &new_policy.policy,
						&new_policy.governor))
L
Linus Torvalds 已提交
481 482
		return -EINVAL;

483 484 485 486 487 488 489
	/* Do not use cpufreq_set_policy here or the user_policy.max
	   will be wrongly overridden */
	ret = __cpufreq_set_policy(policy, &new_policy);

	policy->user_policy.policy = policy->policy;
	policy->user_policy.governor = policy->governor;

490 491 492 493
	if (ret)
		return ret;
	else
		return count;
L
Linus Torvalds 已提交
494 495 496 497 498
}

/**
 * show_scaling_driver - show the cpufreq driver currently loaded
 */
D
Dave Jones 已提交
499
static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf)
L
Linus Torvalds 已提交
500
{
501
	return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n", cpufreq_driver->name);
L
Linus Torvalds 已提交
502 503 504 505 506
}

/**
 * show_scaling_available_governors - show the available CPUfreq governors
 */
D
Dave Jones 已提交
507 508
static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
						char *buf)
L
Linus Torvalds 已提交
509 510 511 512 513 514 515 516 517 518
{
	ssize_t i = 0;
	struct cpufreq_governor *t;

	if (!cpufreq_driver->target) {
		i += sprintf(buf, "performance powersave");
		goto out;
	}

	list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
519 520
		if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
		    - (CPUFREQ_NAME_LEN + 2)))
L
Linus Torvalds 已提交
521
			goto out;
522
		i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);
L
Linus Torvalds 已提交
523
	}
524
out:
L
Linus Torvalds 已提交
525 526 527
	i += sprintf(&buf[i], "\n");
	return i;
}
528

529
static ssize_t show_cpus(const struct cpumask *mask, char *buf)
L
Linus Torvalds 已提交
530 531 532 533
{
	ssize_t i = 0;
	unsigned int cpu;

534
	for_each_cpu(cpu, mask) {
L
Linus Torvalds 已提交
535 536 537 538
		if (i)
			i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
		i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
		if (i >= (PAGE_SIZE - 5))
539
			break;
L
Linus Torvalds 已提交
540 541 542 543 544
	}
	i += sprintf(&buf[i], "\n");
	return i;
}

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
/**
 * show_related_cpus - show the CPUs affected by each transition even if
 * hw coordination is in use
 */
static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf)
{
	return show_cpus(policy->related_cpus, buf);
}

/**
 * show_affected_cpus - show the CPUs affected by each transition
 */
static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf)
{
	return show_cpus(policy->cpus, buf);
}

562
static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
D
Dave Jones 已提交
563
					const char *buf, size_t count)
564 565 566 567
{
	unsigned int freq = 0;
	unsigned int ret;

568
	if (!policy->governor || !policy->governor->store_setspeed)
569 570 571 572 573 574 575 576 577 578 579 580 581
		return -EINVAL;

	ret = sscanf(buf, "%u", &freq);
	if (ret != 1)
		return -EINVAL;

	policy->governor->store_setspeed(policy, freq);

	return count;
}

static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
{
582
	if (!policy->governor || !policy->governor->show_setspeed)
583 584 585 586
		return sprintf(buf, "<unsupported>\n");

	return policy->governor->show_setspeed(policy, buf);
}
L
Linus Torvalds 已提交
587

588
/**
589
 * show_bios_limit - show the current cpufreq HW/BIOS limitation
590 591 592 593 594 595 596 597 598 599 600 601 602
 */
static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)
{
	unsigned int limit;
	int ret;
	if (cpufreq_driver->bios_limit) {
		ret = cpufreq_driver->bios_limit(policy->cpu, &limit);
		if (!ret)
			return sprintf(buf, "%u\n", limit);
	}
	return sprintf(buf, "%u\n", policy->cpuinfo.max_freq);
}

603 604 605 606 607 608 609 610 611 612 613 614 615 616
cpufreq_freq_attr_ro_perm(cpuinfo_cur_freq, 0400);
cpufreq_freq_attr_ro(cpuinfo_min_freq);
cpufreq_freq_attr_ro(cpuinfo_max_freq);
cpufreq_freq_attr_ro(cpuinfo_transition_latency);
cpufreq_freq_attr_ro(scaling_available_governors);
cpufreq_freq_attr_ro(scaling_driver);
cpufreq_freq_attr_ro(scaling_cur_freq);
cpufreq_freq_attr_ro(bios_limit);
cpufreq_freq_attr_ro(related_cpus);
cpufreq_freq_attr_ro(affected_cpus);
cpufreq_freq_attr_rw(scaling_min_freq);
cpufreq_freq_attr_rw(scaling_max_freq);
cpufreq_freq_attr_rw(scaling_governor);
cpufreq_freq_attr_rw(scaling_setspeed);
L
Linus Torvalds 已提交
617

D
Dave Jones 已提交
618
static struct attribute *default_attrs[] = {
L
Linus Torvalds 已提交
619 620
	&cpuinfo_min_freq.attr,
	&cpuinfo_max_freq.attr,
621
	&cpuinfo_transition_latency.attr,
L
Linus Torvalds 已提交
622 623 624
	&scaling_min_freq.attr,
	&scaling_max_freq.attr,
	&affected_cpus.attr,
625
	&related_cpus.attr,
L
Linus Torvalds 已提交
626 627 628
	&scaling_governor.attr,
	&scaling_driver.attr,
	&scaling_available_governors.attr,
629
	&scaling_setspeed.attr,
L
Linus Torvalds 已提交
630 631 632
	NULL
};

633 634 635
struct kobject *cpufreq_global_kobject;
EXPORT_SYMBOL(cpufreq_global_kobject);

636 637
#define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
#define to_attr(a) container_of(a, struct freq_attr, attr)
L
Linus Torvalds 已提交
638

639
static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
L
Linus Torvalds 已提交
640
{
D
Dave Jones 已提交
641 642
	struct cpufreq_policy *policy = to_policy(kobj);
	struct freq_attr *fattr = to_attr(attr);
643
	ssize_t ret = -EINVAL;
644
	policy = cpufreq_cpu_get_sysfs(policy->cpu);
L
Linus Torvalds 已提交
645
	if (!policy)
646
		goto no_policy;
647 648

	if (lock_policy_rwsem_read(policy->cpu) < 0)
649
		goto fail;
650

651 652 653 654 655
	if (fattr->show)
		ret = fattr->show(policy, buf);
	else
		ret = -EIO;

656
	unlock_policy_rwsem_read(policy->cpu);
657
fail:
658
	cpufreq_cpu_put_sysfs(policy);
659
no_policy:
L
Linus Torvalds 已提交
660 661 662
	return ret;
}

D
Dave Jones 已提交
663 664
static ssize_t store(struct kobject *kobj, struct attribute *attr,
		     const char *buf, size_t count)
L
Linus Torvalds 已提交
665
{
D
Dave Jones 已提交
666 667
	struct cpufreq_policy *policy = to_policy(kobj);
	struct freq_attr *fattr = to_attr(attr);
668
	ssize_t ret = -EINVAL;
669
	policy = cpufreq_cpu_get_sysfs(policy->cpu);
L
Linus Torvalds 已提交
670
	if (!policy)
671
		goto no_policy;
672 673

	if (lock_policy_rwsem_write(policy->cpu) < 0)
674
		goto fail;
675

676 677 678 679 680
	if (fattr->store)
		ret = fattr->store(policy, buf, count);
	else
		ret = -EIO;

681
	unlock_policy_rwsem_write(policy->cpu);
682
fail:
683
	cpufreq_cpu_put_sysfs(policy);
684
no_policy:
L
Linus Torvalds 已提交
685 686 687
	return ret;
}

D
Dave Jones 已提交
688
static void cpufreq_sysfs_release(struct kobject *kobj)
L
Linus Torvalds 已提交
689
{
D
Dave Jones 已提交
690
	struct cpufreq_policy *policy = to_policy(kobj);
691
	pr_debug("last reference is dropped\n");
L
Linus Torvalds 已提交
692 693 694
	complete(&policy->kobj_unregister);
}

695
static const struct sysfs_ops sysfs_ops = {
L
Linus Torvalds 已提交
696 697 698 699 700 701 702 703 704 705
	.show	= show,
	.store	= store,
};

static struct kobj_type ktype_cpufreq = {
	.sysfs_ops	= &sysfs_ops,
	.default_attrs	= default_attrs,
	.release	= cpufreq_sysfs_release,
};

706
/* symlink affected CPUs */
707 708
static int cpufreq_add_dev_symlink(unsigned int cpu,
				   struct cpufreq_policy *policy)
709 710 711 712 713 714
{
	unsigned int j;
	int ret = 0;

	for_each_cpu(j, policy->cpus) {
		struct cpufreq_policy *managed_policy;
715
		struct device *cpu_dev;
716 717 718 719

		if (j == cpu)
			continue;

720
		pr_debug("CPU %u already managed, adding link\n", j);
721
		managed_policy = cpufreq_cpu_get(cpu);
722 723
		cpu_dev = get_cpu_device(j);
		ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
724 725 726 727 728 729 730 731 732
					"cpufreq");
		if (ret) {
			cpufreq_cpu_put(managed_policy);
			return ret;
		}
	}
	return ret;
}

733 734
static int cpufreq_add_dev_interface(unsigned int cpu,
				     struct cpufreq_policy *policy,
735
				     struct device *dev)
736
{
737
	struct cpufreq_policy new_policy;
738 739 740 741 742 743 744
	struct freq_attr **drv_attr;
	unsigned long flags;
	int ret = 0;
	unsigned int j;

	/* prepare interface data */
	ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
745
				   &dev->kobj, "cpufreq");
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766
	if (ret)
		return ret;

	/* set up files for this cpu device */
	drv_attr = cpufreq_driver->attr;
	while ((drv_attr) && (*drv_attr)) {
		ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
		if (ret)
			goto err_out_kobj_put;
		drv_attr++;
	}
	if (cpufreq_driver->get) {
		ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
		if (ret)
			goto err_out_kobj_put;
	}
	if (cpufreq_driver->target) {
		ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
		if (ret)
			goto err_out_kobj_put;
	}
767 768 769 770 771
	if (cpufreq_driver->bios_limit) {
		ret = sysfs_create_file(&policy->kobj, &bios_limit.attr);
		if (ret)
			goto err_out_kobj_put;
	}
772 773 774 775

	spin_lock_irqsave(&cpufreq_driver_lock, flags);
	for_each_cpu(j, policy->cpus) {
		per_cpu(cpufreq_cpu_data, j) = policy;
776
		per_cpu(cpufreq_policy_cpu, j) = policy->cpu;
777 778 779 780
	}
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

	ret = cpufreq_add_dev_symlink(cpu, policy);
781 782 783 784 785 786 787 788 789 790 791 792 793
	if (ret)
		goto err_out_kobj_put;

	memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
	/* assure that the starting sequence is run in __cpufreq_set_policy */
	policy->governor = NULL;

	/* set default policy */
	ret = __cpufreq_set_policy(policy, &new_policy);
	policy->user_policy.policy = policy->policy;
	policy->user_policy.governor = policy->governor;

	if (ret) {
794
		pr_debug("setting policy failed\n");
795 796 797
		if (cpufreq_driver->exit)
			cpufreq_driver->exit(policy);
	}
798 799 800 801 802 803 804 805
	return ret;

err_out_kobj_put:
	kobject_put(&policy->kobj);
	wait_for_completion(&policy->kobj_unregister);
	return ret;
}

806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
#ifdef CONFIG_HOTPLUG_CPU
static int cpufreq_add_policy_cpu(unsigned int cpu, unsigned int sibling,
				  struct device *dev)
{
	struct cpufreq_policy *policy;
	int ret = 0;
	unsigned long flags;

	policy = cpufreq_cpu_get(sibling);
	WARN_ON(!policy);

	per_cpu(cpufreq_policy_cpu, cpu) = policy->cpu;

	lock_policy_rwsem_write(cpu);

	__cpufreq_governor(policy, CPUFREQ_GOV_STOP);

	spin_lock_irqsave(&cpufreq_driver_lock, flags);
	cpumask_set_cpu(cpu, policy->cpus);
	per_cpu(cpufreq_cpu_data, cpu) = policy;
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

	__cpufreq_governor(policy, CPUFREQ_GOV_START);
	__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);

	unlock_policy_rwsem_write(cpu);

	ret = sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
	if (ret) {
		cpufreq_cpu_put(policy);
		return ret;
	}

	return 0;
}
#endif
L
Linus Torvalds 已提交
842 843 844 845

/**
 * cpufreq_add_dev - add a CPU device
 *
846
 * Adds the cpufreq interface for a CPU device.
847 848 849 850
 *
 * The Oracle says: try running cpufreq registration/unregistration concurrently
 * with with cpu hotplugging and all hell will break loose. Tried to clean this
 * mess up, but more thorough testing is needed. - Mathieu
L
Linus Torvalds 已提交
851
 */
852
static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
L
Linus Torvalds 已提交
853
{
854 855
	unsigned int j, cpu = dev->id;
	int ret = -ENOMEM, found = 0;
L
Linus Torvalds 已提交
856 857
	struct cpufreq_policy *policy;
	unsigned long flags;
858
#ifdef CONFIG_HOTPLUG_CPU
859
	struct cpufreq_governor *gov;
860 861
	int sibling;
#endif
L
Linus Torvalds 已提交
862

863 864 865
	if (cpu_is_offline(cpu))
		return 0;

866
	pr_debug("adding CPU %u\n", cpu);
L
Linus Torvalds 已提交
867 868 869 870 871 872

#ifdef CONFIG_SMP
	/* check whether a different CPU already registered this
	 * CPU because it is in the same boat. */
	policy = cpufreq_cpu_get(cpu);
	if (unlikely(policy)) {
873
		cpufreq_cpu_put(policy);
L
Linus Torvalds 已提交
874 875
		return 0;
	}
876 877 878 879 880 881 882 883 884

#ifdef CONFIG_HOTPLUG_CPU
	/* Check if this cpu was hot-unplugged earlier and has siblings */
	for_each_online_cpu(sibling) {
		struct cpufreq_policy *cp = per_cpu(cpufreq_cpu_data, sibling);
		if (cp && cpumask_test_cpu(cpu, cp->related_cpus))
			return cpufreq_add_policy_cpu(cpu, sibling, dev);
	}
#endif
L
Linus Torvalds 已提交
885 886 887 888 889 890 891
#endif

	if (!try_module_get(cpufreq_driver->owner)) {
		ret = -EINVAL;
		goto module_out;
	}

892
	policy = kzalloc(sizeof(struct cpufreq_policy), GFP_KERNEL);
893
	if (!policy)
L
Linus Torvalds 已提交
894
		goto nomem_out;
895 896

	if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
897
		goto err_free_policy;
898 899

	if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
900
		goto err_free_cpumask;
L
Linus Torvalds 已提交
901 902

	policy->cpu = cpu;
903
	cpumask_copy(policy->cpus, cpumask_of(cpu));
L
Linus Torvalds 已提交
904

905
	/* Initially set CPU itself as the policy_cpu */
906
	per_cpu(cpufreq_policy_cpu, cpu) = cpu;
907 908
	ret = (lock_policy_rwsem_write(cpu) < 0);
	WARN_ON(ret);
909

L
Linus Torvalds 已提交
910
	init_completion(&policy->kobj_unregister);
911
	INIT_WORK(&policy->update, handle_update);
L
Linus Torvalds 已提交
912

913
	/* Set governor before ->init, so that driver could check it */
914 915 916 917 918 919 920 921 922 923 924 925 926
#ifdef CONFIG_HOTPLUG_CPU
	for_each_online_cpu(sibling) {
		struct cpufreq_policy *cp = per_cpu(cpufreq_cpu_data, sibling);
		if (cp && cp->governor &&
		    (cpumask_test_cpu(cpu, cp->related_cpus))) {
			policy->governor = cp->governor;
			found = 1;
			break;
		}
	}
#endif
	if (!found)
		policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
L
Linus Torvalds 已提交
927 928 929 930 931
	/* call driver. From then on the cpufreq must be able
	 * to accept all calls to ->verify and ->setpolicy for this CPU
	 */
	ret = cpufreq_driver->init(policy);
	if (ret) {
932
		pr_debug("initialization failed\n");
933
		goto err_unlock_policy;
L
Linus Torvalds 已提交
934
	}
V
Viresh Kumar 已提交
935

936 937 938
	/* related cpus should atleast have policy->cpus */
	cpumask_or(policy->related_cpus, policy->related_cpus, policy->cpus);

V
Viresh Kumar 已提交
939 940 941 942 943 944
	/*
	 * affected cpus must always be the one, which are online. We aren't
	 * managing offline cpus here.
	 */
	cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);

945 946
	policy->user_policy.min = policy->min;
	policy->user_policy.max = policy->max;
L
Linus Torvalds 已提交
947

948 949 950
	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
				     CPUFREQ_START, policy);

951 952 953 954 955 956
#ifdef CONFIG_HOTPLUG_CPU
	gov = __find_governor(per_cpu(cpufreq_cpu_governor, cpu));
	if (gov) {
		policy->governor = gov;
		pr_debug("Restoring governor %s for cpu %d\n",
		       policy->governor->name, cpu);
957
	}
958
#endif
L
Linus Torvalds 已提交
959

960
	ret = cpufreq_add_dev_interface(cpu, policy, dev);
961 962
	if (ret)
		goto err_out_unregister;
963

964 965
	unlock_policy_rwsem_write(cpu);

966
	kobject_uevent(&policy->kobj, KOBJ_ADD);
L
Linus Torvalds 已提交
967
	module_put(cpufreq_driver->owner);
968
	pr_debug("initialization complete\n");
969

L
Linus Torvalds 已提交
970 971 972 973
	return 0;

err_out_unregister:
	spin_lock_irqsave(&cpufreq_driver_lock, flags);
974
	for_each_cpu(j, policy->cpus)
975
		per_cpu(cpufreq_cpu_data, j) = NULL;
L
Linus Torvalds 已提交
976 977
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

978
	kobject_put(&policy->kobj);
L
Linus Torvalds 已提交
979 980
	wait_for_completion(&policy->kobj_unregister);

981
err_unlock_policy:
982
	unlock_policy_rwsem_write(cpu);
983
	free_cpumask_var(policy->related_cpus);
984 985 986
err_free_cpumask:
	free_cpumask_var(policy->cpus);
err_free_policy:
L
Linus Torvalds 已提交
987 988 989
	kfree(policy);
nomem_out:
	module_put(cpufreq_driver->owner);
990
module_out:
L
Linus Torvalds 已提交
991 992 993
	return ret;
}

994 995 996 997 998 999 1000
static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
{
	int j;

	policy->last_cpu = policy->cpu;
	policy->cpu = cpu;

1001
	for_each_cpu(j, policy->cpus)
1002 1003 1004 1005 1006 1007 1008 1009
		per_cpu(cpufreq_policy_cpu, j) = cpu;

#ifdef CONFIG_CPU_FREQ_TABLE
	cpufreq_frequency_table_update_policy_cpu(policy);
#endif
	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
			CPUFREQ_UPDATE_POLICY_CPU, policy);
}
L
Linus Torvalds 已提交
1010 1011

/**
1012
 * __cpufreq_remove_dev - remove a CPU device
L
Linus Torvalds 已提交
1013 1014
 *
 * Removes the cpufreq interface for a CPU device.
1015 1016
 * Caller should already have policy_rwsem in write mode for this CPU.
 * This routine frees the rwsem before returning.
L
Linus Torvalds 已提交
1017
 */
1018
static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
L
Linus Torvalds 已提交
1019
{
1020
	unsigned int cpu = dev->id, ret, cpus;
L
Linus Torvalds 已提交
1021 1022
	unsigned long flags;
	struct cpufreq_policy *data;
A
Amerigo Wang 已提交
1023 1024
	struct kobject *kobj;
	struct completion *cmp;
1025
	struct device *cpu_dev;
L
Linus Torvalds 已提交
1026

1027
	pr_debug("%s: unregistering CPU %u\n", __func__, cpu);
L
Linus Torvalds 已提交
1028 1029

	spin_lock_irqsave(&cpufreq_driver_lock, flags);
1030
	data = per_cpu(cpufreq_cpu_data, cpu);
L
Linus Torvalds 已提交
1031 1032

	if (!data) {
1033
		pr_debug("%s: No cpu_data found\n", __func__);
L
Linus Torvalds 已提交
1034
		spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1035
		unlock_policy_rwsem_write(cpu);
L
Linus Torvalds 已提交
1036 1037 1038
		return -EINVAL;
	}

1039
	if (cpufreq_driver->target)
1040
		__cpufreq_governor(data, CPUFREQ_GOV_STOP);
1041 1042

#ifdef CONFIG_HOTPLUG_CPU
1043 1044
	strncpy(per_cpu(cpufreq_cpu_governor, cpu), data->governor->name,
			CPUFREQ_NAME_LEN);
1045 1046
#endif

1047 1048 1049
	per_cpu(cpufreq_cpu_data, cpu) = NULL;
	cpus = cpumask_weight(data->cpus);
	cpumask_clear_cpu(cpu, data->cpus);
L
Linus Torvalds 已提交
1050

1051 1052 1053
	if (cpu != data->cpu) {
		sysfs_remove_link(&dev->kobj, "cpufreq");
	} else if (cpus > 1) {
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
		/* first sibling now owns the new sysfs dir */
		cpu_dev = get_cpu_device(cpumask_first(data->cpus));
		sysfs_remove_link(&cpu_dev->kobj, "cpufreq");
		ret = kobject_move(&data->kobj, &cpu_dev->kobj);
		if (ret) {
			pr_err("%s: Failed to move kobj: %d", __func__, ret);
			cpumask_set_cpu(cpu, data->cpus);
			ret = sysfs_create_link(&cpu_dev->kobj, &data->kobj,
					"cpufreq");
			spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
A
Amerigo Wang 已提交
1064
			unlock_policy_rwsem_write(cpu);
1065
			return -EINVAL;
L
Linus Torvalds 已提交
1066
		}
1067 1068 1069 1070

		update_policy_cpu(data, cpu_dev->id);
		pr_debug("%s: policy Kobject moved to cpu: %d from: %d\n",
				__func__, cpu_dev->id, cpu);
L
Linus Torvalds 已提交
1071 1072
	}

1073
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
1074

1075 1076
	pr_debug("%s: removing link, cpu: %d\n", __func__, cpu);
	cpufreq_cpu_put(data);
A
Amerigo Wang 已提交
1077
	unlock_policy_rwsem_write(cpu);
L
Linus Torvalds 已提交
1078

1079 1080 1081 1082 1083 1084 1085
	/* If cpu is last user of policy, free policy */
	if (cpus == 1) {
		lock_policy_rwsem_write(cpu);
		kobj = &data->kobj;
		cmp = &data->kobj_unregister;
		unlock_policy_rwsem_write(cpu);
		kobject_put(kobj);
1086

1087 1088 1089 1090 1091 1092 1093
		/* we need to make sure that the underlying kobj is actually
		 * not referenced anymore by anybody before we proceed with
		 * unloading.
		 */
		pr_debug("waiting for dropping of refcount\n");
		wait_for_completion(cmp);
		pr_debug("wait complete\n");
1094 1095

		lock_policy_rwsem_write(cpu);
1096 1097 1098
		if (cpufreq_driver->exit)
			cpufreq_driver->exit(data);
		unlock_policy_rwsem_write(cpu);
1099

1100 1101 1102 1103 1104 1105 1106
		free_cpumask_var(data->related_cpus);
		free_cpumask_var(data->cpus);
		kfree(data);
	} else if (cpufreq_driver->target) {
		__cpufreq_governor(data, CPUFREQ_GOV_START);
		__cpufreq_governor(data, CPUFREQ_GOV_LIMITS);
	}
L
Linus Torvalds 已提交
1107 1108 1109 1110 1111

	return 0;
}


1112
static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
1113
{
1114
	unsigned int cpu = dev->id;
1115
	int retval;
1116 1117 1118 1119

	if (cpu_is_offline(cpu))
		return 0;

1120 1121 1122
	if (unlikely(lock_policy_rwsem_write(cpu)))
		BUG();

1123
	retval = __cpufreq_remove_dev(dev, sif);
1124 1125 1126 1127
	return retval;
}


1128
static void handle_update(struct work_struct *work)
L
Linus Torvalds 已提交
1129
{
1130 1131 1132
	struct cpufreq_policy *policy =
		container_of(work, struct cpufreq_policy, update);
	unsigned int cpu = policy->cpu;
1133
	pr_debug("handle_update for cpu %u called\n", cpu);
L
Linus Torvalds 已提交
1134 1135 1136 1137 1138 1139 1140 1141 1142
	cpufreq_update_policy(cpu);
}

/**
 *	cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're in deep trouble.
 *	@cpu: cpu number
 *	@old_freq: CPU frequency the kernel thinks the CPU runs at
 *	@new_freq: CPU frequency the CPU actually runs at
 *
1143 1144
 *	We adjust to current frequency first, and need to clean up later.
 *	So either call to cpufreq_update_policy() or schedule handle_update()).
L
Linus Torvalds 已提交
1145
 */
1146 1147
static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
				unsigned int new_freq)
L
Linus Torvalds 已提交
1148 1149 1150
{
	struct cpufreq_freqs freqs;

1151
	pr_debug("Warning: CPU frequency out of sync: cpufreq and timing "
L
Linus Torvalds 已提交
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
	       "core thinks of %u, is %u kHz.\n", old_freq, new_freq);

	freqs.cpu = cpu;
	freqs.old = old_freq;
	freqs.new = new_freq;
	cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
	cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}


1162
/**
D
Dhaval Giani 已提交
1163
 * cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
1164 1165 1166 1167 1168 1169 1170 1171
 * @cpu: CPU number
 *
 * This is the last known freq, without actually getting it from the driver.
 * Return value will be same as what is shown in scaling_cur_freq in sysfs.
 */
unsigned int cpufreq_quick_get(unsigned int cpu)
{
	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
1172
	unsigned int ret_freq = 0;
1173 1174

	if (policy) {
1175
		ret_freq = policy->cur;
1176 1177 1178
		cpufreq_cpu_put(policy);
	}

D
Dave Jones 已提交
1179
	return ret_freq;
1180 1181 1182
}
EXPORT_SYMBOL(cpufreq_quick_get);

1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202
/**
 * cpufreq_quick_get_max - get the max reported CPU frequency for this CPU
 * @cpu: CPU number
 *
 * Just return the max possible frequency for a given CPU.
 */
unsigned int cpufreq_quick_get_max(unsigned int cpu)
{
	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
	unsigned int ret_freq = 0;

	if (policy) {
		ret_freq = policy->max;
		cpufreq_cpu_put(policy);
	}

	return ret_freq;
}
EXPORT_SYMBOL(cpufreq_quick_get_max);

1203

1204
static unsigned int __cpufreq_get(unsigned int cpu)
L
Linus Torvalds 已提交
1205
{
1206
	struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
1207
	unsigned int ret_freq = 0;
L
Linus Torvalds 已提交
1208 1209

	if (!cpufreq_driver->get)
D
Dave Jones 已提交
1210
		return ret_freq;
L
Linus Torvalds 已提交
1211

1212
	ret_freq = cpufreq_driver->get(cpu);
L
Linus Torvalds 已提交
1213

1214 1215 1216 1217 1218 1219
	if (ret_freq && policy->cur &&
		!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
		/* verify no discrepancy between actual and
					saved value exists */
		if (unlikely(ret_freq != policy->cur)) {
			cpufreq_out_of_sync(cpu, policy->cur, ret_freq);
L
Linus Torvalds 已提交
1220 1221 1222 1223
			schedule_work(&policy->update);
		}
	}

D
Dave Jones 已提交
1224
	return ret_freq;
1225
}
L
Linus Torvalds 已提交
1226

1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
/**
 * cpufreq_get - get the current CPU frequency (in kHz)
 * @cpu: CPU number
 *
 * Get the CPU current (static) CPU frequency
 */
unsigned int cpufreq_get(unsigned int cpu)
{
	unsigned int ret_freq = 0;
	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);

	if (!policy)
		goto out;

	if (unlikely(lock_policy_rwsem_read(cpu)))
		goto out_policy;

	ret_freq = __cpufreq_get(cpu);

	unlock_policy_rwsem_read(cpu);
L
Linus Torvalds 已提交
1247

1248 1249 1250
out_policy:
	cpufreq_cpu_put(policy);
out:
D
Dave Jones 已提交
1251
	return ret_freq;
L
Linus Torvalds 已提交
1252 1253 1254
}
EXPORT_SYMBOL(cpufreq_get);

1255 1256 1257 1258 1259
static struct subsys_interface cpufreq_interface = {
	.name		= "cpufreq",
	.subsys		= &cpu_subsys,
	.add_dev	= cpufreq_add_dev,
	.remove_dev	= cpufreq_remove_dev,
1260 1261
};

L
Linus Torvalds 已提交
1262

1263
/**
1264 1265 1266 1267
 * cpufreq_bp_suspend - Prepare the boot CPU for system suspend.
 *
 * This function is only executed for the boot processor.  The other CPUs
 * have been put offline by means of CPU hotplug.
1268
 */
1269
static int cpufreq_bp_suspend(void)
1270
{
1271
	int ret = 0;
1272

1273
	int cpu = smp_processor_id();
1274 1275
	struct cpufreq_policy *cpu_policy;

1276
	pr_debug("suspending cpu %u\n", cpu);
1277

1278
	/* If there's no policy for the boot CPU, we have nothing to do. */
1279 1280
	cpu_policy = cpufreq_cpu_get(cpu);
	if (!cpu_policy)
1281
		return 0;
1282 1283

	if (cpufreq_driver->suspend) {
1284
		ret = cpufreq_driver->suspend(cpu_policy);
1285
		if (ret)
1286 1287 1288 1289 1290
			printk(KERN_ERR "cpufreq: suspend failed in ->suspend "
					"step on CPU %u\n", cpu_policy->cpu);
	}

	cpufreq_cpu_put(cpu_policy);
1291
	return ret;
1292 1293
}

L
Linus Torvalds 已提交
1294
/**
1295
 * cpufreq_bp_resume - Restore proper frequency handling of the boot CPU.
L
Linus Torvalds 已提交
1296 1297
 *
 *	1.) resume CPUfreq hardware support (cpufreq_driver->resume())
1298 1299 1300 1301 1302
 *	2.) schedule call cpufreq_update_policy() ASAP as interrupts are
 *	    restored. It will verify that the current freq is in sync with
 *	    what we believe it to be. This is a bit later than when it
 *	    should be, but nonethteless it's better than calling
 *	    cpufreq_driver->get() here which might re-enable interrupts...
1303 1304 1305
 *
 * This function is only executed for the boot CPU.  The other CPUs have not
 * been turned on yet.
L
Linus Torvalds 已提交
1306
 */
1307
static void cpufreq_bp_resume(void)
L
Linus Torvalds 已提交
1308
{
1309
	int ret = 0;
1310

1311
	int cpu = smp_processor_id();
L
Linus Torvalds 已提交
1312 1313
	struct cpufreq_policy *cpu_policy;

1314
	pr_debug("resuming cpu %u\n", cpu);
L
Linus Torvalds 已提交
1315

1316
	/* If there's no policy for the boot CPU, we have nothing to do. */
L
Linus Torvalds 已提交
1317 1318
	cpu_policy = cpufreq_cpu_get(cpu);
	if (!cpu_policy)
1319
		return;
L
Linus Torvalds 已提交
1320 1321 1322 1323 1324 1325

	if (cpufreq_driver->resume) {
		ret = cpufreq_driver->resume(cpu_policy);
		if (ret) {
			printk(KERN_ERR "cpufreq: resume failed in ->resume "
					"step on CPU %u\n", cpu_policy->cpu);
1326
			goto fail;
L
Linus Torvalds 已提交
1327 1328 1329 1330
		}
	}

	schedule_work(&cpu_policy->update);
1331

1332
fail:
L
Linus Torvalds 已提交
1333 1334 1335
	cpufreq_cpu_put(cpu_policy);
}

1336 1337 1338
static struct syscore_ops cpufreq_syscore_ops = {
	.suspend	= cpufreq_bp_suspend,
	.resume		= cpufreq_bp_resume,
L
Linus Torvalds 已提交
1339 1340
};

1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
/**
 *	cpufreq_get_current_driver - return current driver's name
 *
 *	Return the name string of the currently loaded cpufreq driver
 *	or NULL, if none.
 */
const char *cpufreq_get_current_driver(void)
{
	if (cpufreq_driver)
		return cpufreq_driver->name;

	return NULL;
}
EXPORT_SYMBOL_GPL(cpufreq_get_current_driver);
L
Linus Torvalds 已提交
1355 1356 1357 1358 1359 1360 1361 1362 1363 1364

/*********************************************************************
 *                     NOTIFIER LISTS INTERFACE                      *
 *********************************************************************/

/**
 *	cpufreq_register_notifier - register a driver with cpufreq
 *	@nb: notifier function to register
 *      @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
 *
1365
 *	Add a driver to one of two lists: either a list of drivers that
L
Linus Torvalds 已提交
1366 1367 1368 1369 1370
 *      are notified about clock rate changes (once before and once after
 *      the transition), or a list of drivers that are notified about
 *      changes in cpufreq policy.
 *
 *	This function may sleep, and has the same return conditions as
1371
 *	blocking_notifier_chain_register.
L
Linus Torvalds 已提交
1372 1373 1374 1375 1376
 */
int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
{
	int ret;

1377 1378 1379
	if (cpufreq_disabled())
		return -EINVAL;

1380 1381
	WARN_ON(!init_cpufreq_transition_notifier_list_called);

L
Linus Torvalds 已提交
1382 1383
	switch (list) {
	case CPUFREQ_TRANSITION_NOTIFIER:
1384
		ret = srcu_notifier_chain_register(
1385
				&cpufreq_transition_notifier_list, nb);
L
Linus Torvalds 已提交
1386 1387
		break;
	case CPUFREQ_POLICY_NOTIFIER:
1388 1389
		ret = blocking_notifier_chain_register(
				&cpufreq_policy_notifier_list, nb);
L
Linus Torvalds 已提交
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407
		break;
	default:
		ret = -EINVAL;
	}

	return ret;
}
EXPORT_SYMBOL(cpufreq_register_notifier);


/**
 *	cpufreq_unregister_notifier - unregister a driver with cpufreq
 *	@nb: notifier block to be unregistered
 *      @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
 *
 *	Remove a driver from the CPU frequency notifier list.
 *
 *	This function may sleep, and has the same return conditions as
1408
 *	blocking_notifier_chain_unregister.
L
Linus Torvalds 已提交
1409 1410 1411 1412 1413
 */
int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
{
	int ret;

1414 1415 1416
	if (cpufreq_disabled())
		return -EINVAL;

L
Linus Torvalds 已提交
1417 1418
	switch (list) {
	case CPUFREQ_TRANSITION_NOTIFIER:
1419
		ret = srcu_notifier_chain_unregister(
1420
				&cpufreq_transition_notifier_list, nb);
L
Linus Torvalds 已提交
1421 1422
		break;
	case CPUFREQ_POLICY_NOTIFIER:
1423 1424
		ret = blocking_notifier_chain_unregister(
				&cpufreq_policy_notifier_list, nb);
L
Linus Torvalds 已提交
1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444
		break;
	default:
		ret = -EINVAL;
	}

	return ret;
}
EXPORT_SYMBOL(cpufreq_unregister_notifier);


/*********************************************************************
 *                              GOVERNORS                            *
 *********************************************************************/


int __cpufreq_driver_target(struct cpufreq_policy *policy,
			    unsigned int target_freq,
			    unsigned int relation)
{
	int retval = -EINVAL;
1445
	unsigned int old_target_freq = target_freq;
1446

1447 1448 1449
	if (cpufreq_disabled())
		return -ENODEV;

1450 1451 1452 1453 1454 1455 1456 1457
	/* Make sure that target_freq is within supported range */
	if (target_freq > policy->max)
		target_freq = policy->max;
	if (target_freq < policy->min)
		target_freq = policy->min;

	pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
			policy->cpu, target_freq, relation, old_target_freq);
1458 1459 1460 1461

	if (target_freq == policy->cur)
		return 0;

1462
	if (cpufreq_driver->target)
L
Linus Torvalds 已提交
1463
		retval = cpufreq_driver->target(policy, target_freq, relation);
1464

L
Linus Torvalds 已提交
1465 1466 1467 1468 1469 1470 1471 1472
	return retval;
}
EXPORT_SYMBOL_GPL(__cpufreq_driver_target);

int cpufreq_driver_target(struct cpufreq_policy *policy,
			  unsigned int target_freq,
			  unsigned int relation)
{
1473
	int ret = -EINVAL;
L
Linus Torvalds 已提交
1474 1475 1476

	policy = cpufreq_cpu_get(policy->cpu);
	if (!policy)
1477
		goto no_policy;
L
Linus Torvalds 已提交
1478

1479
	if (unlikely(lock_policy_rwsem_write(policy->cpu)))
1480
		goto fail;
L
Linus Torvalds 已提交
1481 1482 1483

	ret = __cpufreq_driver_target(policy, target_freq, relation);

1484
	unlock_policy_rwsem_write(policy->cpu);
L
Linus Torvalds 已提交
1485

1486
fail:
L
Linus Torvalds 已提交
1487
	cpufreq_cpu_put(policy);
1488
no_policy:
L
Linus Torvalds 已提交
1489 1490 1491 1492
	return ret;
}
EXPORT_SYMBOL_GPL(cpufreq_driver_target);

1493
int __cpufreq_driver_getavg(struct cpufreq_policy *policy, unsigned int cpu)
1494 1495 1496
{
	int ret = 0;

1497 1498 1499
	if (cpufreq_disabled())
		return ret;

1500
	if (!cpufreq_driver->getavg)
1501 1502
		return 0;

1503 1504 1505 1506
	policy = cpufreq_cpu_get(policy->cpu);
	if (!policy)
		return -EINVAL;

1507
	ret = cpufreq_driver->getavg(policy, cpu);
1508 1509 1510 1511

	cpufreq_cpu_put(policy);
	return ret;
}
1512
EXPORT_SYMBOL_GPL(__cpufreq_driver_getavg);
1513

1514 1515 1516
/*
 * when "event" is CPUFREQ_GOV_LIMITS
 */
L
Linus Torvalds 已提交
1517

1518 1519
static int __cpufreq_governor(struct cpufreq_policy *policy,
					unsigned int event)
L
Linus Torvalds 已提交
1520
{
1521
	int ret;
1522 1523 1524 1525 1526 1527 1528 1529 1530 1531

	/* Only must be defined when default governor is known to have latency
	   restrictions, like e.g. conservative or ondemand.
	   That this is the case is already ensured in Kconfig
	*/
#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
	struct cpufreq_governor *gov = &cpufreq_gov_performance;
#else
	struct cpufreq_governor *gov = NULL;
#endif
1532 1533 1534 1535

	if (policy->governor->max_transition_latency &&
	    policy->cpuinfo.transition_latency >
	    policy->governor->max_transition_latency) {
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545
		if (!gov)
			return -EINVAL;
		else {
			printk(KERN_WARNING "%s governor failed, too long"
			       " transition latency of HW, fallback"
			       " to %s governor\n",
			       policy->governor->name,
			       gov->name);
			policy->governor = gov;
		}
1546
	}
L
Linus Torvalds 已提交
1547 1548 1549 1550

	if (!try_module_get(policy->governor->owner))
		return -EINVAL;

1551
	pr_debug("__cpufreq_governor for CPU %u, event %u\n",
1552
						policy->cpu, event);
L
Linus Torvalds 已提交
1553 1554
	ret = policy->governor->governor(policy, event);

1555 1556 1557 1558
	if (event == CPUFREQ_GOV_START)
		policy->governor->initialized++;
	else if (event == CPUFREQ_GOV_STOP)
		policy->governor->initialized--;
1559

1560 1561
	/* we keep one module reference alive for
			each CPU governed by this CPU */
L
Linus Torvalds 已提交
1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572
	if ((event != CPUFREQ_GOV_START) || ret)
		module_put(policy->governor->owner);
	if ((event == CPUFREQ_GOV_STOP) && !ret)
		module_put(policy->governor->owner);

	return ret;
}


int cpufreq_register_governor(struct cpufreq_governor *governor)
{
1573
	int err;
L
Linus Torvalds 已提交
1574 1575 1576 1577

	if (!governor)
		return -EINVAL;

1578 1579 1580
	if (cpufreq_disabled())
		return -ENODEV;

1581
	mutex_lock(&cpufreq_governor_mutex);
1582

1583
	governor->initialized = 0;
1584 1585 1586 1587
	err = -EBUSY;
	if (__find_governor(governor->name) == NULL) {
		err = 0;
		list_add(&governor->governor_list, &cpufreq_governor_list);
L
Linus Torvalds 已提交
1588 1589
	}

1590
	mutex_unlock(&cpufreq_governor_mutex);
1591
	return err;
L
Linus Torvalds 已提交
1592 1593 1594 1595 1596 1597
}
EXPORT_SYMBOL_GPL(cpufreq_register_governor);


void cpufreq_unregister_governor(struct cpufreq_governor *governor)
{
1598 1599 1600 1601
#ifdef CONFIG_HOTPLUG_CPU
	int cpu;
#endif

L
Linus Torvalds 已提交
1602 1603 1604
	if (!governor)
		return;

1605 1606 1607
	if (cpufreq_disabled())
		return;

1608 1609 1610 1611 1612 1613 1614 1615 1616
#ifdef CONFIG_HOTPLUG_CPU
	for_each_present_cpu(cpu) {
		if (cpu_online(cpu))
			continue;
		if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
			strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
	}
#endif

1617
	mutex_lock(&cpufreq_governor_mutex);
L
Linus Torvalds 已提交
1618
	list_del(&governor->governor_list);
1619
	mutex_unlock(&cpufreq_governor_mutex);
L
Linus Torvalds 已提交
1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631
	return;
}
EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);



/*********************************************************************
 *                          POLICY INTERFACE                         *
 *********************************************************************/

/**
 * cpufreq_get_policy - get the current cpufreq_policy
1632 1633
 * @policy: struct cpufreq_policy into which the current cpufreq_policy
 *	is written
L
Linus Torvalds 已提交
1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654
 *
 * Reads the current cpufreq policy.
 */
int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
{
	struct cpufreq_policy *cpu_policy;
	if (!policy)
		return -EINVAL;

	cpu_policy = cpufreq_cpu_get(cpu);
	if (!cpu_policy)
		return -EINVAL;

	memcpy(policy, cpu_policy, sizeof(struct cpufreq_policy));

	cpufreq_cpu_put(cpu_policy);
	return 0;
}
EXPORT_SYMBOL(cpufreq_get_policy);


1655
/*
1656 1657
 * data   : current policy.
 * policy : policy to be set.
1658
 */
1659 1660
static int __cpufreq_set_policy(struct cpufreq_policy *data,
				struct cpufreq_policy *policy)
L
Linus Torvalds 已提交
1661 1662 1663
{
	int ret = 0;

1664
	pr_debug("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
L
Linus Torvalds 已提交
1665 1666
		policy->min, policy->max);

1667 1668
	memcpy(&policy->cpuinfo, &data->cpuinfo,
				sizeof(struct cpufreq_cpuinfo));
L
Linus Torvalds 已提交
1669

1670
	if (policy->min > data->max || policy->max < data->min) {
1671 1672 1673 1674
		ret = -EINVAL;
		goto error_out;
	}

L
Linus Torvalds 已提交
1675 1676 1677 1678 1679 1680
	/* verify the cpu speed can be set within this limit */
	ret = cpufreq_driver->verify(policy);
	if (ret)
		goto error_out;

	/* adjust if necessary - all reasons */
1681 1682
	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
			CPUFREQ_ADJUST, policy);
L
Linus Torvalds 已提交
1683 1684

	/* adjust if necessary - hardware incompatibility*/
1685 1686
	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
			CPUFREQ_INCOMPATIBLE, policy);
L
Linus Torvalds 已提交
1687 1688 1689 1690

	/* verify the cpu speed can be set within this limit,
	   which might be different to the first one */
	ret = cpufreq_driver->verify(policy);
1691
	if (ret)
L
Linus Torvalds 已提交
1692 1693 1694
		goto error_out;

	/* notification of the new policy */
1695 1696
	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
			CPUFREQ_NOTIFY, policy);
L
Linus Torvalds 已提交
1697

1698 1699
	data->min = policy->min;
	data->max = policy->max;
L
Linus Torvalds 已提交
1700

1701
	pr_debug("new min and max freqs are %u - %u kHz\n",
1702
					data->min, data->max);
L
Linus Torvalds 已提交
1703 1704 1705

	if (cpufreq_driver->setpolicy) {
		data->policy = policy->policy;
1706
		pr_debug("setting range\n");
L
Linus Torvalds 已提交
1707 1708 1709 1710 1711 1712
		ret = cpufreq_driver->setpolicy(policy);
	} else {
		if (policy->governor != data->governor) {
			/* save old, working values */
			struct cpufreq_governor *old_gov = data->governor;

1713
			pr_debug("governor switch\n");
L
Linus Torvalds 已提交
1714 1715

			/* end old governor */
1716
			if (data->governor)
L
Linus Torvalds 已提交
1717 1718 1719 1720 1721 1722
				__cpufreq_governor(data, CPUFREQ_GOV_STOP);

			/* start new governor */
			data->governor = policy->governor;
			if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
				/* new governor failed, so re-start old one */
1723
				pr_debug("starting governor %s failed\n",
1724
							data->governor->name);
L
Linus Torvalds 已提交
1725 1726
				if (old_gov) {
					data->governor = old_gov;
1727 1728
					__cpufreq_governor(data,
							   CPUFREQ_GOV_START);
L
Linus Torvalds 已提交
1729 1730 1731 1732 1733 1734
				}
				ret = -EINVAL;
				goto error_out;
			}
			/* might be a policy change, too, so fall through */
		}
1735
		pr_debug("governor: change or update limits\n");
L
Linus Torvalds 已提交
1736 1737 1738
		__cpufreq_governor(data, CPUFREQ_GOV_LIMITS);
	}

1739
error_out:
L
Linus Torvalds 已提交
1740 1741 1742 1743 1744 1745 1746
	return ret;
}

/**
 *	cpufreq_update_policy - re-evaluate an existing cpufreq policy
 *	@cpu: CPU which shall be re-evaluated
 *
L
Lucas De Marchi 已提交
1747
 *	Useful for policy notifiers which have different necessities
L
Linus Torvalds 已提交
1748 1749 1750 1751 1752 1753
 *	at different times.
 */
int cpufreq_update_policy(unsigned int cpu)
{
	struct cpufreq_policy *data = cpufreq_cpu_get(cpu);
	struct cpufreq_policy policy;
1754
	int ret;
L
Linus Torvalds 已提交
1755

1756 1757 1758 1759
	if (!data) {
		ret = -ENODEV;
		goto no_policy;
	}
L
Linus Torvalds 已提交
1760

1761 1762 1763 1764
	if (unlikely(lock_policy_rwsem_write(cpu))) {
		ret = -EINVAL;
		goto fail;
	}
L
Linus Torvalds 已提交
1765

1766
	pr_debug("updating policy for CPU %u\n", cpu);
1767
	memcpy(&policy, data, sizeof(struct cpufreq_policy));
L
Linus Torvalds 已提交
1768 1769 1770 1771 1772
	policy.min = data->user_policy.min;
	policy.max = data->user_policy.max;
	policy.policy = data->user_policy.policy;
	policy.governor = data->user_policy.governor;

1773 1774 1775 1776
	/* BIOS might change freq behind our back
	  -> ask driver for current freq and notify governors about a change */
	if (cpufreq_driver->get) {
		policy.cur = cpufreq_driver->get(cpu);
1777
		if (!data->cur) {
1778
			pr_debug("Driver did not initialize current freq");
1779 1780 1781
			data->cur = policy.cur;
		} else {
			if (data->cur != policy.cur)
1782 1783
				cpufreq_out_of_sync(cpu, data->cur,
								policy.cur);
1784
		}
1785 1786
	}

L
Linus Torvalds 已提交
1787 1788
	ret = __cpufreq_set_policy(data, &policy);

1789 1790
	unlock_policy_rwsem_write(cpu);

1791
fail:
L
Linus Torvalds 已提交
1792
	cpufreq_cpu_put(data);
1793
no_policy:
L
Linus Torvalds 已提交
1794 1795 1796 1797
	return ret;
}
EXPORT_SYMBOL(cpufreq_update_policy);

1798
static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
1799 1800 1801
					unsigned long action, void *hcpu)
{
	unsigned int cpu = (unsigned long)hcpu;
1802
	struct device *dev;
1803

1804 1805
	dev = get_cpu_device(cpu);
	if (dev) {
1806 1807
		switch (action) {
		case CPU_ONLINE:
1808
		case CPU_ONLINE_FROZEN:
1809
			cpufreq_add_dev(dev, NULL);
1810 1811
			break;
		case CPU_DOWN_PREPARE:
1812
		case CPU_DOWN_PREPARE_FROZEN:
1813 1814 1815
			if (unlikely(lock_policy_rwsem_write(cpu)))
				BUG();

1816
			__cpufreq_remove_dev(dev, NULL);
1817
			break;
1818
		case CPU_DOWN_FAILED:
1819
		case CPU_DOWN_FAILED_FROZEN:
1820
			cpufreq_add_dev(dev, NULL);
1821 1822 1823 1824 1825 1826
			break;
		}
	}
	return NOTIFY_OK;
}

1827
static struct notifier_block __refdata cpufreq_cpu_notifier = {
1828 1829
    .notifier_call = cpufreq_cpu_callback,
};
L
Linus Torvalds 已提交
1830 1831 1832 1833 1834 1835 1836 1837 1838 1839

/*********************************************************************
 *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
 *********************************************************************/

/**
 * cpufreq_register_driver - register a CPU Frequency driver
 * @driver_data: A struct cpufreq_driver containing the values#
 * submitted by the CPU Frequency driver.
 *
1840
 *   Registers a CPU Frequency driver to this core code. This code
L
Linus Torvalds 已提交
1841
 * returns zero on success, -EBUSY when another driver got here first
1842
 * (and isn't unregistered in the meantime).
L
Linus Torvalds 已提交
1843 1844
 *
 */
1845
int cpufreq_register_driver(struct cpufreq_driver *driver_data)
L
Linus Torvalds 已提交
1846 1847 1848 1849
{
	unsigned long flags;
	int ret;

1850 1851 1852
	if (cpufreq_disabled())
		return -ENODEV;

L
Linus Torvalds 已提交
1853 1854 1855 1856
	if (!driver_data || !driver_data->verify || !driver_data->init ||
	    ((!driver_data->setpolicy) && (!driver_data->target)))
		return -EINVAL;

1857
	pr_debug("trying to register driver %s\n", driver_data->name);
L
Linus Torvalds 已提交
1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869

	if (driver_data->setpolicy)
		driver_data->flags |= CPUFREQ_CONST_LOOPS;

	spin_lock_irqsave(&cpufreq_driver_lock, flags);
	if (cpufreq_driver) {
		spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
		return -EBUSY;
	}
	cpufreq_driver = driver_data;
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

1870
	ret = subsys_interface_register(&cpufreq_interface);
1871 1872
	if (ret)
		goto err_null_driver;
L
Linus Torvalds 已提交
1873

1874
	if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
L
Linus Torvalds 已提交
1875 1876 1877 1878
		int i;
		ret = -ENODEV;

		/* check for at least one working CPU */
1879 1880
		for (i = 0; i < nr_cpu_ids; i++)
			if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) {
L
Linus Torvalds 已提交
1881
				ret = 0;
1882 1883
				break;
			}
L
Linus Torvalds 已提交
1884 1885 1886

		/* if all ->init() calls failed, unregister */
		if (ret) {
1887
			pr_debug("no CPU initialized for driver %s\n",
1888
							driver_data->name);
1889
			goto err_if_unreg;
L
Linus Torvalds 已提交
1890 1891 1892
		}
	}

1893
	register_hotcpu_notifier(&cpufreq_cpu_notifier);
1894
	pr_debug("driver %s up and running\n", driver_data->name);
L
Linus Torvalds 已提交
1895

1896
	return 0;
1897 1898
err_if_unreg:
	subsys_interface_unregister(&cpufreq_interface);
1899 1900 1901 1902
err_null_driver:
	spin_lock_irqsave(&cpufreq_driver_lock, flags);
	cpufreq_driver = NULL;
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
D
Dave Jones 已提交
1903
	return ret;
L
Linus Torvalds 已提交
1904 1905 1906 1907 1908 1909 1910
}
EXPORT_SYMBOL_GPL(cpufreq_register_driver);


/**
 * cpufreq_unregister_driver - unregister the current CPUFreq driver
 *
1911
 *    Unregister the current CPUFreq driver. Only call this if you have
L
Linus Torvalds 已提交
1912 1913 1914 1915
 * the right to do so, i.e. if you have succeeded in initialising before!
 * Returns zero if successful, and -EINVAL if the cpufreq_driver is
 * currently not initialised.
 */
1916
int cpufreq_unregister_driver(struct cpufreq_driver *driver)
L
Linus Torvalds 已提交
1917 1918 1919
{
	unsigned long flags;

1920
	if (!cpufreq_driver || (driver != cpufreq_driver))
L
Linus Torvalds 已提交
1921 1922
		return -EINVAL;

1923
	pr_debug("unregistering driver %s\n", driver->name);
L
Linus Torvalds 已提交
1924

1925
	subsys_interface_unregister(&cpufreq_interface);
1926
	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
L
Linus Torvalds 已提交
1927 1928 1929 1930 1931 1932 1933 1934

	spin_lock_irqsave(&cpufreq_driver_lock, flags);
	cpufreq_driver = NULL;
	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);

	return 0;
}
EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
1935 1936 1937 1938 1939

static int __init cpufreq_core_init(void)
{
	int cpu;

1940 1941 1942
	if (cpufreq_disabled())
		return -ENODEV;

1943
	for_each_possible_cpu(cpu) {
1944
		per_cpu(cpufreq_policy_cpu, cpu) = -1;
1945 1946
		init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
	}
1947

1948
	cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
1949
	BUG_ON(!cpufreq_global_kobject);
1950
	register_syscore_ops(&cpufreq_syscore_ops);
1951

1952 1953 1954
	return 0;
}
core_initcall(cpufreq_core_init);