blob: b04a5d6f13dfbd03b7698ef1303408e06b700570 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/drivers/cpufreq/cpufreq.c
3 *
4 * Copyright (C) 2001 Russell King
5 * (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
Viresh Kumarbb176f72013-06-19 14:19:33 +05306 * (C) 2013 Viresh Kumar <viresh.kumar@linaro.org>
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 *
Ashok Rajc32b6b82005-10-30 14:59:54 -08008 * Oct 2005 - Ashok Raj <ashok.raj@intel.com>
Dave Jones32ee8c32006-02-28 00:43:23 -05009 * Added handling for CPU hotplug
Dave Jones8ff69732006-03-05 03:37:23 -050010 * Feb 2006 - Jacob Shin <jacob.shin@amd.com>
11 * Fix handling for CPU hotplug -- affected CPUs
Ashok Rajc32b6b82005-10-30 14:59:54 -080012 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 */
17
Viresh Kumardb701152012-10-23 01:29:03 +020018#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
Viresh Kumar5ff0a262013-08-06 22:53:03 +053020#include <linux/cpu.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070021#include <linux/cpufreq.h>
22#include <linux/delay.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/device.h>
Viresh Kumar5ff0a262013-08-06 22:53:03 +053024#include <linux/init.h>
25#include <linux/kernel_stat.h>
26#include <linux/module.h>
akpm@osdl.org3fc54d32006-01-13 15:54:22 -080027#include <linux/mutex.h>
Viresh Kumar5ff0a262013-08-06 22:53:03 +053028#include <linux/slab.h>
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +010029#include <linux/syscore_ops.h>
Viresh Kumar5ff0a262013-08-06 22:53:03 +053030#include <linux/tick.h>
Thomas Renninger6f4f2722010-04-20 13:17:36 +020031#include <trace/events/power.h>
32
Linus Torvalds1da177e2005-04-16 15:20:36 -070033/**
Dave Jonescd878472006-08-11 17:59:28 -040034 * The "cpufreq driver" - the arch- or hardware-dependent low
Linus Torvalds1da177e2005-04-16 15:20:36 -070035 * level driver of CPUFreq support, and its spinlock. This lock
36 * also protects the cpufreq_cpu_data array.
37 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +020038static struct cpufreq_driver *cpufreq_driver;
Mike Travis7a6aedf2008-03-25 15:06:53 -070039static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +053040static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data_fallback);
Viresh Kumarbb176f72013-06-19 14:19:33 +053041static DEFINE_RWLOCK(cpufreq_driver_lock);
42static DEFINE_MUTEX(cpufreq_governor_lock);
Lukasz Majewskic88a1f82013-08-06 22:53:08 +053043static LIST_HEAD(cpufreq_policy_list);
Viresh Kumarbb176f72013-06-19 14:19:33 +053044
Thomas Renninger084f3492007-07-09 11:35:28 -070045#ifdef CONFIG_HOTPLUG_CPU
46/* This one keeps track of the previously set governor of a removed CPU */
Dmitry Monakhove77b89f2009-10-05 00:38:55 +040047static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
Thomas Renninger084f3492007-07-09 11:35:28 -070048#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080050/*
51 * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
52 * all cpufreq/hotplug/workqueue/etc related lock issues.
53 *
54 * The rules for this semaphore:
55 * - Any routine that wants to read from the policy structure will
56 * do a down_read on this semaphore.
57 * - Any routine that will write to the policy structure and/or may take away
58 * the policy altogether (eg. CPU hotplug), will hold this lock in write
59 * mode before doing so.
60 *
61 * Additional rules:
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080062 * - Governor routines that can be called in cpufreq hotplug path should not
63 * take this sem as top level hotplug notifier handler takes this.
Mathieu Desnoyers395913d2009-06-08 13:17:31 -040064 * - Lock should not be held across
65 * __cpufreq_governor(data, CPUFREQ_GOV_STOP);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080066 */
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080067static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
68
69#define lock_policy_rwsem(mode, cpu) \
Viresh Kumar1b750e32013-10-02 14:13:09 +053070static void lock_policy_rwsem_##mode(int cpu) \
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080071{ \
Viresh Kumar474deff2013-08-20 12:08:25 +053072 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); \
73 BUG_ON(!policy); \
74 down_##mode(&per_cpu(cpu_policy_rwsem, policy->cpu)); \
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080075}
76
77lock_policy_rwsem(read, cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080078lock_policy_rwsem(write, cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080079
Viresh Kumarfa1d8af2013-02-07 15:38:42 +053080#define unlock_policy_rwsem(mode, cpu) \
81static void unlock_policy_rwsem_##mode(int cpu) \
82{ \
Viresh Kumar474deff2013-08-20 12:08:25 +053083 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); \
84 BUG_ON(!policy); \
85 up_##mode(&per_cpu(cpu_policy_rwsem, policy->cpu)); \
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080086}
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080087
Viresh Kumarfa1d8af2013-02-07 15:38:42 +053088unlock_policy_rwsem(read, cpu);
89unlock_policy_rwsem(write, cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080090
Viresh Kumar6eed9402013-08-06 22:53:11 +053091/*
92 * rwsem to guarantee that cpufreq driver module doesn't unload during critical
93 * sections
94 */
95static DECLARE_RWSEM(cpufreq_rwsem);
96
Linus Torvalds1da177e2005-04-16 15:20:36 -070097/* internal prototypes */
Dave Jones29464f22009-01-18 01:37:11 -050098static int __cpufreq_governor(struct cpufreq_policy *policy,
99 unsigned int event);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800100static unsigned int __cpufreq_get(unsigned int cpu);
David Howells65f27f32006-11-22 14:55:48 +0000101static void handle_update(struct work_struct *work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
103/**
Dave Jones32ee8c32006-02-28 00:43:23 -0500104 * Two notifier lists: the "policy" list is involved in the
105 * validation process for a new CPU frequency policy; the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106 * "transition" list for kernel code that needs to handle
107 * changes to devices when the CPU clock speed changes.
108 * The mutex locks both lists.
109 */
Alan Sterne041c682006-03-27 01:16:30 -0800110static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
Alan Sternb4dfdbb2006-10-04 02:17:06 -0700111static struct srcu_notifier_head cpufreq_transition_notifier_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Cesar Eduardo Barros74212ca2008-02-16 08:41:24 -0200113static bool init_cpufreq_transition_notifier_list_called;
Alan Sternb4dfdbb2006-10-04 02:17:06 -0700114static int __init init_cpufreq_transition_notifier_list(void)
115{
116 srcu_init_notifier_head(&cpufreq_transition_notifier_list);
Cesar Eduardo Barros74212ca2008-02-16 08:41:24 -0200117 init_cpufreq_transition_notifier_list_called = true;
Alan Sternb4dfdbb2006-10-04 02:17:06 -0700118 return 0;
119}
Linus Torvaldsb3438f82006-11-20 11:47:18 -0800120pure_initcall(init_cpufreq_transition_notifier_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -0400122static int off __read_mostly;
Viresh Kumarda584452012-10-26 00:51:32 +0200123static int cpufreq_disabled(void)
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -0400124{
125 return off;
126}
127void disable_cpufreq(void)
128{
129 off = 1;
130}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131static LIST_HEAD(cpufreq_governor_list);
Dave Jones29464f22009-01-18 01:37:11 -0500132static DEFINE_MUTEX(cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
Viresh Kumar4d5dcc42013-03-27 15:58:58 +0000134bool have_governor_per_policy(void)
135{
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200136 return cpufreq_driver->have_governor_per_policy;
Viresh Kumar4d5dcc42013-03-27 15:58:58 +0000137}
Viresh Kumar3f869d62013-05-16 05:09:56 +0000138EXPORT_SYMBOL_GPL(have_governor_per_policy);
Viresh Kumar4d5dcc42013-03-27 15:58:58 +0000139
Viresh Kumar944e9a02013-05-16 05:09:57 +0000140struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
141{
142 if (have_governor_per_policy())
143 return &policy->kobj;
144 else
145 return cpufreq_global_kobject;
146}
147EXPORT_SYMBOL_GPL(get_governor_parent_kobj);
148
Viresh Kumar72a4ce32013-05-17 11:26:32 +0000149static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
150{
151 u64 idle_time;
152 u64 cur_wall_time;
153 u64 busy_time;
154
155 cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
156
157 busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
158 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
159 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
160 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
161 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
162 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
163
164 idle_time = cur_wall_time - busy_time;
165 if (wall)
166 *wall = cputime_to_usecs(cur_wall_time);
167
168 return cputime_to_usecs(idle_time);
169}
170
171u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
172{
173 u64 idle_time = get_cpu_idle_time_us(cpu, io_busy ? wall : NULL);
174
175 if (idle_time == -1ULL)
176 return get_cpu_idle_time_jiffy(cpu, wall);
177 else if (!io_busy)
178 idle_time += get_cpu_iowait_time_us(cpu, wall);
179
180 return idle_time;
181}
182EXPORT_SYMBOL_GPL(get_cpu_idle_time);
183
Viresh Kumar6eed9402013-08-06 22:53:11 +0530184struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185{
Viresh Kumar6eed9402013-08-06 22:53:11 +0530186 struct cpufreq_policy *policy = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187 unsigned long flags;
188
Viresh Kumar6eed9402013-08-06 22:53:11 +0530189 if (cpufreq_disabled() || (cpu >= nr_cpu_ids))
190 return NULL;
191
192 if (!down_read_trylock(&cpufreq_rwsem))
193 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194
195 /* get the cpufreq driver */
Nathan Zimmer0d1857a2013-02-22 16:24:34 +0000196 read_lock_irqsave(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197
Viresh Kumar6eed9402013-08-06 22:53:11 +0530198 if (cpufreq_driver) {
199 /* get the CPU */
200 policy = per_cpu(cpufreq_cpu_data, cpu);
201 if (policy)
202 kobject_get(&policy->kobj);
203 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200204
Viresh Kumar6eed9402013-08-06 22:53:11 +0530205 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530207 if (!policy)
Viresh Kumar6eed9402013-08-06 22:53:11 +0530208 up_read(&cpufreq_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530210 return policy;
Stephen Boyda9144432012-07-20 18:14:38 +0000211}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212EXPORT_SYMBOL_GPL(cpufreq_cpu_get);
213
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530214void cpufreq_cpu_put(struct cpufreq_policy *policy)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215{
Dirk Brandewied5aaffa2013-01-17 16:22:21 +0000216 if (cpufreq_disabled())
217 return;
218
Viresh Kumar6eed9402013-08-06 22:53:11 +0530219 kobject_put(&policy->kobj);
220 up_read(&cpufreq_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221}
222EXPORT_SYMBOL_GPL(cpufreq_cpu_put);
223
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224/*********************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225 * EXTERNALLY AFFECTING FREQUENCY CHANGES *
226 *********************************************************************/
227
228/**
229 * adjust_jiffies - adjust the system "loops_per_jiffy"
230 *
231 * This function alters the system "loops_per_jiffy" for the clock
232 * speed change. Note that loops_per_jiffy cannot be updated on SMP
Dave Jones32ee8c32006-02-28 00:43:23 -0500233 * systems as each CPU might be scaled differently. So, use the arch
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234 * per-CPU loops_per_jiffy value wherever possible.
235 */
236#ifndef CONFIG_SMP
237static unsigned long l_p_j_ref;
Viresh Kumarbb176f72013-06-19 14:19:33 +0530238static unsigned int l_p_j_ref_freq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239
Arjan van de Ven858119e2006-01-14 13:20:43 -0800240static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241{
242 if (ci->flags & CPUFREQ_CONST_LOOPS)
243 return;
244
245 if (!l_p_j_ref_freq) {
246 l_p_j_ref = loops_per_jiffy;
247 l_p_j_ref_freq = ci->old;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200248 pr_debug("saving %lu as reference value for loops_per_jiffy; "
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530249 "freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 }
Viresh Kumarbb176f72013-06-19 14:19:33 +0530251 if ((val == CPUFREQ_POSTCHANGE && ci->old != ci->new) ||
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -0700252 (val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530253 loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
254 ci->new);
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200255 pr_debug("scaling loops_per_jiffy to %lu "
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530256 "for frequency %u kHz\n", loops_per_jiffy, ci->new);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257 }
258}
259#else
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530260static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
261{
262 return;
263}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264#endif
265
Viresh Kumar0956df9c2013-06-19 14:19:34 +0530266static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
Viresh Kumarb43a7ff2013-03-24 11:56:43 +0530267 struct cpufreq_freqs *freqs, unsigned int state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268{
269 BUG_ON(irqs_disabled());
270
Dirk Brandewied5aaffa2013-01-17 16:22:21 +0000271 if (cpufreq_disabled())
272 return;
273
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200274 freqs->flags = cpufreq_driver->flags;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200275 pr_debug("notification %u of frequency transition to %u kHz\n",
Dave Jonese4472cb2006-01-31 15:53:55 -0800276 state, freqs->new);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 switch (state) {
Dave Jonese4472cb2006-01-31 15:53:55 -0800279
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 case CPUFREQ_PRECHANGE:
Dave Jones32ee8c32006-02-28 00:43:23 -0500281 /* detect if the driver reported a value as "old frequency"
Dave Jonese4472cb2006-01-31 15:53:55 -0800282 * which is not equal to what the cpufreq core thinks is
283 * "old frequency".
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200285 if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
Dave Jonese4472cb2006-01-31 15:53:55 -0800286 if ((policy) && (policy->cpu == freqs->cpu) &&
287 (policy->cur) && (policy->cur != freqs->old)) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200288 pr_debug("Warning: CPU frequency is"
Dave Jonese4472cb2006-01-31 15:53:55 -0800289 " %u, cpufreq assumed %u kHz.\n",
290 freqs->old, policy->cur);
291 freqs->old = policy->cur;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292 }
293 }
Alan Sternb4dfdbb2006-10-04 02:17:06 -0700294 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
Alan Sterne041c682006-03-27 01:16:30 -0800295 CPUFREQ_PRECHANGE, freqs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
297 break;
Dave Jonese4472cb2006-01-31 15:53:55 -0800298
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299 case CPUFREQ_POSTCHANGE:
300 adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200301 pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new,
Thomas Renninger6f4f2722010-04-20 13:17:36 +0200302 (unsigned long)freqs->cpu);
Thomas Renninger25e41932011-01-03 17:50:44 +0100303 trace_cpu_frequency(freqs->new, freqs->cpu);
Alan Sternb4dfdbb2006-10-04 02:17:06 -0700304 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
Alan Sterne041c682006-03-27 01:16:30 -0800305 CPUFREQ_POSTCHANGE, freqs);
Dave Jonese4472cb2006-01-31 15:53:55 -0800306 if (likely(policy) && likely(policy->cpu == freqs->cpu))
307 policy->cur = freqs->new;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308 break;
309 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310}
Viresh Kumarbb176f72013-06-19 14:19:33 +0530311
Viresh Kumarb43a7ff2013-03-24 11:56:43 +0530312/**
313 * cpufreq_notify_transition - call notifier chain and adjust_jiffies
314 * on frequency transition.
315 *
316 * This function calls the transition notifiers and the "adjust_jiffies"
317 * function. It is called twice on all CPU frequency changes that have
318 * external effects.
319 */
320void cpufreq_notify_transition(struct cpufreq_policy *policy,
321 struct cpufreq_freqs *freqs, unsigned int state)
322{
323 for_each_cpu(freqs->cpu, policy->cpus)
324 __cpufreq_notify_transition(policy, freqs, state);
325}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
327
328
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329/*********************************************************************
330 * SYSFS INTERFACE *
331 *********************************************************************/
332
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700333static struct cpufreq_governor *__find_governor(const char *str_governor)
334{
335 struct cpufreq_governor *t;
336
337 list_for_each_entry(t, &cpufreq_governor_list, governor_list)
Dave Jones29464f22009-01-18 01:37:11 -0500338 if (!strnicmp(str_governor, t->name, CPUFREQ_NAME_LEN))
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700339 return t;
340
341 return NULL;
342}
343
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344/**
345 * cpufreq_parse_governor - parse a governor string
346 */
Dave Jones905d77c2008-03-05 14:28:32 -0500347static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 struct cpufreq_governor **governor)
349{
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700350 int err = -EINVAL;
351
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200352 if (!cpufreq_driver)
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700353 goto out;
354
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200355 if (cpufreq_driver->setpolicy) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700356 if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
357 *policy = CPUFREQ_POLICY_PERFORMANCE;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700358 err = 0;
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530359 } else if (!strnicmp(str_governor, "powersave",
360 CPUFREQ_NAME_LEN)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361 *policy = CPUFREQ_POLICY_POWERSAVE;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700362 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200364 } else if (cpufreq_driver->target) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 struct cpufreq_governor *t;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700366
akpm@osdl.org3fc54d32006-01-13 15:54:22 -0800367 mutex_lock(&cpufreq_governor_mutex);
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700368
369 t = __find_governor(str_governor);
370
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700371 if (t == NULL) {
Kees Cook1a8e1462011-05-04 08:38:56 -0700372 int ret;
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700373
Kees Cook1a8e1462011-05-04 08:38:56 -0700374 mutex_unlock(&cpufreq_governor_mutex);
375 ret = request_module("cpufreq_%s", str_governor);
376 mutex_lock(&cpufreq_governor_mutex);
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700377
Kees Cook1a8e1462011-05-04 08:38:56 -0700378 if (ret == 0)
379 t = __find_governor(str_governor);
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700380 }
381
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700382 if (t != NULL) {
383 *governor = t;
384 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 }
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700386
akpm@osdl.org3fc54d32006-01-13 15:54:22 -0800387 mutex_unlock(&cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 }
Dave Jones29464f22009-01-18 01:37:11 -0500389out:
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700390 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393/**
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530394 * cpufreq_per_cpu_attr_read() / show_##file_name() -
395 * print out cpufreq information
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 *
397 * Write out information from cpufreq_driver->policy[cpu]; object must be
398 * "unsigned int".
399 */
400
Dave Jones32ee8c32006-02-28 00:43:23 -0500401#define show_one(file_name, object) \
402static ssize_t show_##file_name \
Dave Jones905d77c2008-03-05 14:28:32 -0500403(struct cpufreq_policy *policy, char *buf) \
Dave Jones32ee8c32006-02-28 00:43:23 -0500404{ \
Dave Jones29464f22009-01-18 01:37:11 -0500405 return sprintf(buf, "%u\n", policy->object); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406}
407
408show_one(cpuinfo_min_freq, cpuinfo.min_freq);
409show_one(cpuinfo_max_freq, cpuinfo.max_freq);
Thomas Renningered129782009-02-04 01:17:41 +0100410show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411show_one(scaling_min_freq, min);
412show_one(scaling_max_freq, max);
413show_one(scaling_cur_freq, cur);
414
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530415static int __cpufreq_set_policy(struct cpufreq_policy *policy,
416 struct cpufreq_policy *new_policy);
Thomas Renninger7970e082006-04-13 15:14:04 +0200417
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418/**
419 * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
420 */
421#define store_one(file_name, object) \
422static ssize_t store_##file_name \
Dave Jones905d77c2008-03-05 14:28:32 -0500423(struct cpufreq_policy *policy, const char *buf, size_t count) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424{ \
Srivatsa S. Bhat5136fa52013-09-07 01:24:06 +0530425 int ret; \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 struct cpufreq_policy new_policy; \
427 \
428 ret = cpufreq_get_policy(&new_policy, policy->cpu); \
429 if (ret) \
430 return -EINVAL; \
431 \
Dave Jones29464f22009-01-18 01:37:11 -0500432 ret = sscanf(buf, "%u", &new_policy.object); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 if (ret != 1) \
434 return -EINVAL; \
435 \
Thomas Renninger7970e082006-04-13 15:14:04 +0200436 ret = __cpufreq_set_policy(policy, &new_policy); \
437 policy->user_policy.object = policy->object; \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438 \
439 return ret ? ret : count; \
440}
441
Dave Jones29464f22009-01-18 01:37:11 -0500442store_one(scaling_min_freq, min);
443store_one(scaling_max_freq, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444
445/**
446 * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
447 */
Dave Jones905d77c2008-03-05 14:28:32 -0500448static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
449 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450{
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800451 unsigned int cur_freq = __cpufreq_get(policy->cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 if (!cur_freq)
453 return sprintf(buf, "<unknown>");
454 return sprintf(buf, "%u\n", cur_freq);
455}
456
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457/**
458 * show_scaling_governor - show the current policy for the specified CPU
459 */
Dave Jones905d77c2008-03-05 14:28:32 -0500460static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461{
Dave Jones29464f22009-01-18 01:37:11 -0500462 if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 return sprintf(buf, "powersave\n");
464 else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)
465 return sprintf(buf, "performance\n");
466 else if (policy->governor)
viresh kumar4b972f02012-10-23 01:23:43 +0200467 return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n",
Dave Jones29464f22009-01-18 01:37:11 -0500468 policy->governor->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469 return -EINVAL;
470}
471
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472/**
473 * store_scaling_governor - store policy for the specified CPU
474 */
Dave Jones905d77c2008-03-05 14:28:32 -0500475static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
476 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477{
Srivatsa S. Bhat5136fa52013-09-07 01:24:06 +0530478 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 char str_governor[16];
480 struct cpufreq_policy new_policy;
481
482 ret = cpufreq_get_policy(&new_policy, policy->cpu);
483 if (ret)
484 return ret;
485
Dave Jones29464f22009-01-18 01:37:11 -0500486 ret = sscanf(buf, "%15s", str_governor);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487 if (ret != 1)
488 return -EINVAL;
489
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530490 if (cpufreq_parse_governor(str_governor, &new_policy.policy,
491 &new_policy.governor))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 return -EINVAL;
493
Viresh Kumarbb176f72013-06-19 14:19:33 +0530494 /*
495 * Do not use cpufreq_set_policy here or the user_policy.max
496 * will be wrongly overridden
497 */
Thomas Renninger7970e082006-04-13 15:14:04 +0200498 ret = __cpufreq_set_policy(policy, &new_policy);
499
500 policy->user_policy.policy = policy->policy;
501 policy->user_policy.governor = policy->governor;
Thomas Renninger7970e082006-04-13 15:14:04 +0200502
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530503 if (ret)
504 return ret;
505 else
506 return count;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507}
508
509/**
510 * show_scaling_driver - show the cpufreq driver currently loaded
511 */
Dave Jones905d77c2008-03-05 14:28:32 -0500512static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513{
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200514 return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n", cpufreq_driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515}
516
517/**
518 * show_scaling_available_governors - show the available CPUfreq governors
519 */
Dave Jones905d77c2008-03-05 14:28:32 -0500520static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
521 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522{
523 ssize_t i = 0;
524 struct cpufreq_governor *t;
525
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200526 if (!cpufreq_driver->target) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 i += sprintf(buf, "performance powersave");
528 goto out;
529 }
530
531 list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
Dave Jones29464f22009-01-18 01:37:11 -0500532 if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
533 - (CPUFREQ_NAME_LEN + 2)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 goto out;
viresh kumar4b972f02012-10-23 01:23:43 +0200535 i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 }
Dave Jones7d5e3502006-02-02 17:03:42 -0500537out:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538 i += sprintf(&buf[i], "\n");
539 return i;
540}
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700541
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800542ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543{
544 ssize_t i = 0;
545 unsigned int cpu;
546
Rusty Russell835481d2009-01-04 05:18:06 -0800547 for_each_cpu(cpu, mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 if (i)
549 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
550 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
551 if (i >= (PAGE_SIZE - 5))
Dave Jones29464f22009-01-18 01:37:11 -0500552 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 }
554 i += sprintf(&buf[i], "\n");
555 return i;
556}
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800557EXPORT_SYMBOL_GPL(cpufreq_show_cpus);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700559/**
560 * show_related_cpus - show the CPUs affected by each transition even if
561 * hw coordination is in use
562 */
563static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf)
564{
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800565 return cpufreq_show_cpus(policy->related_cpus, buf);
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700566}
567
568/**
569 * show_affected_cpus - show the CPUs affected by each transition
570 */
571static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf)
572{
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800573 return cpufreq_show_cpus(policy->cpus, buf);
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700574}
575
Venki Pallipadi9e769882007-10-26 10:18:21 -0700576static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
Dave Jones905d77c2008-03-05 14:28:32 -0500577 const char *buf, size_t count)
Venki Pallipadi9e769882007-10-26 10:18:21 -0700578{
579 unsigned int freq = 0;
580 unsigned int ret;
581
CHIKAMA masaki879000f2008-06-05 22:46:33 -0700582 if (!policy->governor || !policy->governor->store_setspeed)
Venki Pallipadi9e769882007-10-26 10:18:21 -0700583 return -EINVAL;
584
585 ret = sscanf(buf, "%u", &freq);
586 if (ret != 1)
587 return -EINVAL;
588
589 policy->governor->store_setspeed(policy, freq);
590
591 return count;
592}
593
594static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
595{
CHIKAMA masaki879000f2008-06-05 22:46:33 -0700596 if (!policy->governor || !policy->governor->show_setspeed)
Venki Pallipadi9e769882007-10-26 10:18:21 -0700597 return sprintf(buf, "<unsupported>\n");
598
599 return policy->governor->show_setspeed(policy, buf);
600}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
Thomas Renningere2f74f32009-11-19 12:31:01 +0100602/**
viresh kumar8bf1ac72012-10-23 01:23:33 +0200603 * show_bios_limit - show the current cpufreq HW/BIOS limitation
Thomas Renningere2f74f32009-11-19 12:31:01 +0100604 */
605static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)
606{
607 unsigned int limit;
608 int ret;
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200609 if (cpufreq_driver->bios_limit) {
610 ret = cpufreq_driver->bios_limit(policy->cpu, &limit);
Thomas Renningere2f74f32009-11-19 12:31:01 +0100611 if (!ret)
612 return sprintf(buf, "%u\n", limit);
613 }
614 return sprintf(buf, "%u\n", policy->cpuinfo.max_freq);
615}
616
Borislav Petkov6dad2a22010-03-31 21:56:46 +0200617cpufreq_freq_attr_ro_perm(cpuinfo_cur_freq, 0400);
618cpufreq_freq_attr_ro(cpuinfo_min_freq);
619cpufreq_freq_attr_ro(cpuinfo_max_freq);
620cpufreq_freq_attr_ro(cpuinfo_transition_latency);
621cpufreq_freq_attr_ro(scaling_available_governors);
622cpufreq_freq_attr_ro(scaling_driver);
623cpufreq_freq_attr_ro(scaling_cur_freq);
624cpufreq_freq_attr_ro(bios_limit);
625cpufreq_freq_attr_ro(related_cpus);
626cpufreq_freq_attr_ro(affected_cpus);
627cpufreq_freq_attr_rw(scaling_min_freq);
628cpufreq_freq_attr_rw(scaling_max_freq);
629cpufreq_freq_attr_rw(scaling_governor);
630cpufreq_freq_attr_rw(scaling_setspeed);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631
Dave Jones905d77c2008-03-05 14:28:32 -0500632static struct attribute *default_attrs[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 &cpuinfo_min_freq.attr,
634 &cpuinfo_max_freq.attr,
Thomas Renningered129782009-02-04 01:17:41 +0100635 &cpuinfo_transition_latency.attr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 &scaling_min_freq.attr,
637 &scaling_max_freq.attr,
638 &affected_cpus.attr,
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700639 &related_cpus.attr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 &scaling_governor.attr,
641 &scaling_driver.attr,
642 &scaling_available_governors.attr,
Venki Pallipadi9e769882007-10-26 10:18:21 -0700643 &scaling_setspeed.attr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644 NULL
645};
646
Dave Jones29464f22009-01-18 01:37:11 -0500647#define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
648#define to_attr(a) container_of(a, struct freq_attr, attr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649
Dave Jones29464f22009-01-18 01:37:11 -0500650static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651{
Dave Jones905d77c2008-03-05 14:28:32 -0500652 struct cpufreq_policy *policy = to_policy(kobj);
653 struct freq_attr *fattr = to_attr(attr);
Viresh Kumar1b750e32013-10-02 14:13:09 +0530654 ssize_t ret;
Viresh Kumar6eed9402013-08-06 22:53:11 +0530655
656 if (!down_read_trylock(&cpufreq_rwsem))
Viresh Kumar1b750e32013-10-02 14:13:09 +0530657 return -EINVAL;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800658
Viresh Kumar1b750e32013-10-02 14:13:09 +0530659 lock_policy_rwsem_read(policy->cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800660
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530661 if (fattr->show)
662 ret = fattr->show(policy, buf);
663 else
664 ret = -EIO;
665
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800666 unlock_policy_rwsem_read(policy->cpu);
Viresh Kumar6eed9402013-08-06 22:53:11 +0530667 up_read(&cpufreq_rwsem);
Viresh Kumar1b750e32013-10-02 14:13:09 +0530668
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 return ret;
670}
671
Dave Jones905d77c2008-03-05 14:28:32 -0500672static ssize_t store(struct kobject *kobj, struct attribute *attr,
673 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674{
Dave Jones905d77c2008-03-05 14:28:32 -0500675 struct cpufreq_policy *policy = to_policy(kobj);
676 struct freq_attr *fattr = to_attr(attr);
Dave Jonesa07530b2008-03-05 14:22:25 -0500677 ssize_t ret = -EINVAL;
Viresh Kumar6eed9402013-08-06 22:53:11 +0530678
Srivatsa S. Bhat4f750c92013-09-07 01:23:43 +0530679 get_online_cpus();
680
681 if (!cpu_online(policy->cpu))
682 goto unlock;
683
Viresh Kumar6eed9402013-08-06 22:53:11 +0530684 if (!down_read_trylock(&cpufreq_rwsem))
Srivatsa S. Bhat4f750c92013-09-07 01:23:43 +0530685 goto unlock;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800686
Viresh Kumar1b750e32013-10-02 14:13:09 +0530687 lock_policy_rwsem_write(policy->cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800688
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530689 if (fattr->store)
690 ret = fattr->store(policy, buf, count);
691 else
692 ret = -EIO;
693
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800694 unlock_policy_rwsem_write(policy->cpu);
Viresh Kumar6eed9402013-08-06 22:53:11 +0530695
Viresh Kumar6eed9402013-08-06 22:53:11 +0530696 up_read(&cpufreq_rwsem);
Srivatsa S. Bhat4f750c92013-09-07 01:23:43 +0530697unlock:
698 put_online_cpus();
699
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 return ret;
701}
702
Dave Jones905d77c2008-03-05 14:28:32 -0500703static void cpufreq_sysfs_release(struct kobject *kobj)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704{
Dave Jones905d77c2008-03-05 14:28:32 -0500705 struct cpufreq_policy *policy = to_policy(kobj);
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200706 pr_debug("last reference is dropped\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707 complete(&policy->kobj_unregister);
708}
709
Emese Revfy52cf25d2010-01-19 02:58:23 +0100710static const struct sysfs_ops sysfs_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711 .show = show,
712 .store = store,
713};
714
715static struct kobj_type ktype_cpufreq = {
716 .sysfs_ops = &sysfs_ops,
717 .default_attrs = default_attrs,
718 .release = cpufreq_sysfs_release,
719};
720
Viresh Kumar2361be22013-05-17 16:09:09 +0530721struct kobject *cpufreq_global_kobject;
722EXPORT_SYMBOL(cpufreq_global_kobject);
723
724static int cpufreq_global_kobject_usage;
725
726int cpufreq_get_global_kobject(void)
727{
728 if (!cpufreq_global_kobject_usage++)
729 return kobject_add(cpufreq_global_kobject,
730 &cpu_subsys.dev_root->kobj, "%s", "cpufreq");
731
732 return 0;
733}
734EXPORT_SYMBOL(cpufreq_get_global_kobject);
735
736void cpufreq_put_global_kobject(void)
737{
738 if (!--cpufreq_global_kobject_usage)
739 kobject_del(cpufreq_global_kobject);
740}
741EXPORT_SYMBOL(cpufreq_put_global_kobject);
742
743int cpufreq_sysfs_create_file(const struct attribute *attr)
744{
745 int ret = cpufreq_get_global_kobject();
746
747 if (!ret) {
748 ret = sysfs_create_file(cpufreq_global_kobject, attr);
749 if (ret)
750 cpufreq_put_global_kobject();
751 }
752
753 return ret;
754}
755EXPORT_SYMBOL(cpufreq_sysfs_create_file);
756
757void cpufreq_sysfs_remove_file(const struct attribute *attr)
758{
759 sysfs_remove_file(cpufreq_global_kobject, attr);
760 cpufreq_put_global_kobject();
761}
762EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
763
Dave Jones19d6f7e2009-07-08 17:35:39 -0400764/* symlink affected CPUs */
Viresh Kumar308b60e2013-07-31 14:35:14 +0200765static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy)
Dave Jones19d6f7e2009-07-08 17:35:39 -0400766{
767 unsigned int j;
768 int ret = 0;
769
770 for_each_cpu(j, policy->cpus) {
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800771 struct device *cpu_dev;
Dave Jones19d6f7e2009-07-08 17:35:39 -0400772
Viresh Kumar308b60e2013-07-31 14:35:14 +0200773 if (j == policy->cpu)
Dave Jones19d6f7e2009-07-08 17:35:39 -0400774 continue;
Dave Jones19d6f7e2009-07-08 17:35:39 -0400775
Viresh Kumare8fdde12013-07-31 14:31:33 +0200776 pr_debug("Adding link for CPU: %u\n", j);
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800777 cpu_dev = get_cpu_device(j);
778 ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
Dave Jones19d6f7e2009-07-08 17:35:39 -0400779 "cpufreq");
Rafael J. Wysocki71c34612013-08-04 01:19:34 +0200780 if (ret)
781 break;
Dave Jones19d6f7e2009-07-08 17:35:39 -0400782 }
783 return ret;
784}
785
Viresh Kumar308b60e2013-07-31 14:35:14 +0200786static int cpufreq_add_dev_interface(struct cpufreq_policy *policy,
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800787 struct device *dev)
Dave Jones909a6942009-07-08 18:05:42 -0400788{
789 struct freq_attr **drv_attr;
Dave Jones909a6942009-07-08 18:05:42 -0400790 int ret = 0;
Dave Jones909a6942009-07-08 18:05:42 -0400791
792 /* prepare interface data */
793 ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800794 &dev->kobj, "cpufreq");
Dave Jones909a6942009-07-08 18:05:42 -0400795 if (ret)
796 return ret;
797
798 /* set up files for this cpu device */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200799 drv_attr = cpufreq_driver->attr;
Dave Jones909a6942009-07-08 18:05:42 -0400800 while ((drv_attr) && (*drv_attr)) {
801 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
802 if (ret)
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200803 goto err_out_kobj_put;
Dave Jones909a6942009-07-08 18:05:42 -0400804 drv_attr++;
805 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200806 if (cpufreq_driver->get) {
Dave Jones909a6942009-07-08 18:05:42 -0400807 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
808 if (ret)
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200809 goto err_out_kobj_put;
Dave Jones909a6942009-07-08 18:05:42 -0400810 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200811 if (cpufreq_driver->target) {
Dave Jones909a6942009-07-08 18:05:42 -0400812 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
813 if (ret)
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200814 goto err_out_kobj_put;
Dave Jones909a6942009-07-08 18:05:42 -0400815 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200816 if (cpufreq_driver->bios_limit) {
Thomas Renningere2f74f32009-11-19 12:31:01 +0100817 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr);
818 if (ret)
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200819 goto err_out_kobj_put;
Thomas Renningere2f74f32009-11-19 12:31:01 +0100820 }
Dave Jones909a6942009-07-08 18:05:42 -0400821
Viresh Kumar308b60e2013-07-31 14:35:14 +0200822 ret = cpufreq_add_dev_symlink(policy);
Dave Jonesecf7e462009-07-08 18:48:47 -0400823 if (ret)
824 goto err_out_kobj_put;
825
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +0530826 return ret;
827
828err_out_kobj_put:
829 kobject_put(&policy->kobj);
830 wait_for_completion(&policy->kobj_unregister);
831 return ret;
832}
833
834static void cpufreq_init_policy(struct cpufreq_policy *policy)
835{
836 struct cpufreq_policy new_policy;
837 int ret = 0;
838
Viresh Kumard5b73cd2013-08-06 22:53:06 +0530839 memcpy(&new_policy, policy, sizeof(*policy));
Dave Jonesecf7e462009-07-08 18:48:47 -0400840 /* assure that the starting sequence is run in __cpufreq_set_policy */
841 policy->governor = NULL;
842
843 /* set default policy */
844 ret = __cpufreq_set_policy(policy, &new_policy);
845 policy->user_policy.policy = policy->policy;
846 policy->user_policy.governor = policy->governor;
847
848 if (ret) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200849 pr_debug("setting policy failed\n");
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200850 if (cpufreq_driver->exit)
851 cpufreq_driver->exit(policy);
Dave Jonesecf7e462009-07-08 18:48:47 -0400852 }
Dave Jones909a6942009-07-08 18:05:42 -0400853}
854
Viresh Kumarfcf80582013-01-29 14:39:08 +0000855#ifdef CONFIG_HOTPLUG_CPU
Viresh Kumard8d3b472013-08-04 01:20:07 +0200856static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy,
857 unsigned int cpu, struct device *dev,
858 bool frozen)
Viresh Kumarfcf80582013-01-29 14:39:08 +0000859{
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200860 int ret = 0, has_target = !!cpufreq_driver->target;
Viresh Kumarfcf80582013-01-29 14:39:08 +0000861 unsigned long flags;
862
Viresh Kumar3de9bde2013-08-06 22:53:13 +0530863 if (has_target) {
864 ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
865 if (ret) {
866 pr_err("%s: Failed to stop governor\n", __func__);
867 return ret;
868 }
869 }
Viresh Kumarfcf80582013-01-29 14:39:08 +0000870
Viresh Kumard8d3b472013-08-04 01:20:07 +0200871 lock_policy_rwsem_write(policy->cpu);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +0530872
Nathan Zimmer0d1857a2013-02-22 16:24:34 +0000873 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +0530874
Viresh Kumarfcf80582013-01-29 14:39:08 +0000875 cpumask_set_cpu(cpu, policy->cpus);
876 per_cpu(cpufreq_cpu_data, cpu) = policy;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +0000877 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumarfcf80582013-01-29 14:39:08 +0000878
Viresh Kumard8d3b472013-08-04 01:20:07 +0200879 unlock_policy_rwsem_write(policy->cpu);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +0530880
Viresh Kumar820c6ca2013-04-22 00:48:03 +0200881 if (has_target) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +0530882 if ((ret = __cpufreq_governor(policy, CPUFREQ_GOV_START)) ||
883 (ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))) {
884 pr_err("%s: Failed to start governor\n", __func__);
885 return ret;
886 }
Viresh Kumar820c6ca2013-04-22 00:48:03 +0200887 }
Viresh Kumarfcf80582013-01-29 14:39:08 +0000888
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +0530889 /* Don't touch sysfs links during light-weight init */
Rafael J. Wysocki71c34612013-08-04 01:19:34 +0200890 if (!frozen)
891 ret = sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
Viresh Kumarfcf80582013-01-29 14:39:08 +0000892
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +0530893 return ret;
Viresh Kumarfcf80582013-01-29 14:39:08 +0000894}
895#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896
Srivatsa S. Bhat84148092013-07-30 04:25:10 +0530897static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu)
898{
899 struct cpufreq_policy *policy;
900 unsigned long flags;
901
Lan Tianyu44871c92013-09-11 15:05:05 +0800902 read_lock_irqsave(&cpufreq_driver_lock, flags);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +0530903
904 policy = per_cpu(cpufreq_cpu_data_fallback, cpu);
905
Lan Tianyu44871c92013-09-11 15:05:05 +0800906 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +0530907
908 return policy;
909}
910
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +0530911static struct cpufreq_policy *cpufreq_policy_alloc(void)
912{
913 struct cpufreq_policy *policy;
914
915 policy = kzalloc(sizeof(*policy), GFP_KERNEL);
916 if (!policy)
917 return NULL;
918
919 if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
920 goto err_free_policy;
921
922 if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
923 goto err_free_cpumask;
924
Lukasz Majewskic88a1f82013-08-06 22:53:08 +0530925 INIT_LIST_HEAD(&policy->policy_list);
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +0530926 return policy;
927
928err_free_cpumask:
929 free_cpumask_var(policy->cpus);
930err_free_policy:
931 kfree(policy);
932
933 return NULL;
934}
935
936static void cpufreq_policy_free(struct cpufreq_policy *policy)
937{
938 free_cpumask_var(policy->related_cpus);
939 free_cpumask_var(policy->cpus);
940 kfree(policy);
941}
942
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +0530943static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
944{
Srivatsa S. Bhatcb38ed52013-09-12 01:43:42 +0530945 if (cpu == policy->cpu)
946 return;
947
Viresh Kumar8efd5762013-09-17 10:22:11 +0530948 /*
949 * Take direct locks as lock_policy_rwsem_write wouldn't work here.
950 * Also lock for last cpu is enough here as contention will happen only
951 * after policy->cpu is changed and after it is changed, other threads
952 * will try to acquire lock for new cpu. And policy is already updated
953 * by then.
954 */
955 down_write(&per_cpu(cpu_policy_rwsem, policy->cpu));
956
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +0530957 policy->last_cpu = policy->cpu;
958 policy->cpu = cpu;
959
Viresh Kumar8efd5762013-09-17 10:22:11 +0530960 up_write(&per_cpu(cpu_policy_rwsem, policy->last_cpu));
961
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +0530962#ifdef CONFIG_CPU_FREQ_TABLE
963 cpufreq_frequency_table_update_policy_cpu(policy);
964#endif
965 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
966 CPUFREQ_UPDATE_POLICY_CPU, policy);
967}
968
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +0530969static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
970 bool frozen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971{
Viresh Kumarfcf80582013-01-29 14:39:08 +0000972 unsigned int j, cpu = dev->id;
Viresh Kumar65922462013-02-07 10:56:03 +0530973 int ret = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 unsigned long flags;
Prarit Bhargava90e41ba2009-11-12 09:18:46 -0500976#ifdef CONFIG_HOTPLUG_CPU
Viresh Kumar1b274292013-08-20 12:08:26 +0530977 struct cpufreq_policy *tpolicy;
Viresh Kumarfcf80582013-01-29 14:39:08 +0000978 struct cpufreq_governor *gov;
Prarit Bhargava90e41ba2009-11-12 09:18:46 -0500979#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980
Ashok Rajc32b6b82005-10-30 14:59:54 -0800981 if (cpu_is_offline(cpu))
982 return 0;
983
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200984 pr_debug("adding CPU %u\n", cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985
986#ifdef CONFIG_SMP
987 /* check whether a different CPU already registered this
988 * CPU because it is in the same boat. */
989 policy = cpufreq_cpu_get(cpu);
990 if (unlikely(policy)) {
Dave Jones8ff69732006-03-05 03:37:23 -0500991 cpufreq_cpu_put(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 return 0;
993 }
Li Zhong5025d622013-08-21 01:31:08 +0200994#endif
Viresh Kumarfcf80582013-01-29 14:39:08 +0000995
Viresh Kumar6eed9402013-08-06 22:53:11 +0530996 if (!down_read_trylock(&cpufreq_rwsem))
997 return 0;
998
Viresh Kumarfcf80582013-01-29 14:39:08 +0000999#ifdef CONFIG_HOTPLUG_CPU
1000 /* Check if this cpu was hot-unplugged earlier and has siblings */
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001001 read_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar1b274292013-08-20 12:08:26 +05301002 list_for_each_entry(tpolicy, &cpufreq_policy_list, policy_list) {
1003 if (cpumask_test_cpu(cpu, tpolicy->related_cpus)) {
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001004 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumar1b274292013-08-20 12:08:26 +05301005 ret = cpufreq_add_policy_cpu(tpolicy, cpu, dev, frozen);
Viresh Kumar6eed9402013-08-06 22:53:11 +05301006 up_read(&cpufreq_rwsem);
1007 return ret;
Viresh Kumar2eaa3e22013-02-07 10:55:00 +05301008 }
Viresh Kumarfcf80582013-01-29 14:39:08 +00001009 }
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001010 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumarfcf80582013-01-29 14:39:08 +00001011#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301013 if (frozen)
1014 /* Restore the saved policy when doing light-weight init */
1015 policy = cpufreq_policy_restore(cpu);
1016 else
1017 policy = cpufreq_policy_alloc();
1018
Dave Jones059019a2009-07-08 16:30:03 -04001019 if (!policy)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 goto nomem_out;
Dave Jones059019a2009-07-08 16:30:03 -04001021
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301022
1023 /*
1024 * In the resume path, since we restore a saved policy, the assignment
1025 * to policy->cpu is like an update of the existing policy, rather than
1026 * the creation of a brand new one. So we need to perform this update
1027 * by invoking update_policy_cpu().
1028 */
1029 if (frozen && cpu != policy->cpu)
1030 update_policy_cpu(policy, cpu);
1031 else
1032 policy->cpu = cpu;
1033
Viresh Kumar65922462013-02-07 10:56:03 +05301034 policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
Rusty Russell835481d2009-01-04 05:18:06 -08001035 cpumask_copy(policy->cpus, cpumask_of(cpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 init_completion(&policy->kobj_unregister);
David Howells65f27f32006-11-22 14:55:48 +00001038 INIT_WORK(&policy->update, handle_update);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039
1040 /* call driver. From then on the cpufreq must be able
1041 * to accept all calls to ->verify and ->setpolicy for this CPU
1042 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001043 ret = cpufreq_driver->init(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044 if (ret) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001045 pr_debug("initialization failed\n");
Viresh Kumar2eaa3e22013-02-07 10:55:00 +05301046 goto err_set_policy_cpu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 }
Viresh Kumar643ae6e2013-01-12 05:14:38 +00001048
Viresh Kumarfcf80582013-01-29 14:39:08 +00001049 /* related cpus should atleast have policy->cpus */
1050 cpumask_or(policy->related_cpus, policy->related_cpus, policy->cpus);
1051
Viresh Kumar643ae6e2013-01-12 05:14:38 +00001052 /*
1053 * affected cpus must always be the one, which are online. We aren't
1054 * managing offline cpus here.
1055 */
1056 cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);
1057
Mike Chan187d9f42008-12-04 12:19:17 -08001058 policy->user_policy.min = policy->min;
1059 policy->user_policy.max = policy->max;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060
Thomas Renningera1531ac2008-07-29 22:32:58 -07001061 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1062 CPUFREQ_START, policy);
1063
Viresh Kumarfcf80582013-01-29 14:39:08 +00001064#ifdef CONFIG_HOTPLUG_CPU
1065 gov = __find_governor(per_cpu(cpufreq_cpu_governor, cpu));
1066 if (gov) {
1067 policy->governor = gov;
1068 pr_debug("Restoring governor %s for cpu %d\n",
1069 policy->governor->name, cpu);
Thomas Renninger4bfa0422009-07-24 15:25:03 +02001070 }
Viresh Kumarfcf80582013-01-29 14:39:08 +00001071#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +05301073 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar474deff2013-08-20 12:08:25 +05301074 for_each_cpu(j, policy->cpus)
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +05301075 per_cpu(cpufreq_cpu_data, j) = policy;
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +05301076 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1077
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301078 if (!frozen) {
Viresh Kumar308b60e2013-07-31 14:35:14 +02001079 ret = cpufreq_add_dev_interface(policy, dev);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301080 if (ret)
1081 goto err_out_unregister;
1082 }
Dave Jones8ff69732006-03-05 03:37:23 -05001083
Viresh Kumar9515f4d2013-08-20 12:08:23 +05301084 write_lock_irqsave(&cpufreq_driver_lock, flags);
1085 list_add(&policy->policy_list, &cpufreq_policy_list);
1086 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1087
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +05301088 cpufreq_init_policy(policy);
1089
Greg Kroah-Hartman038c5b32007-12-17 15:54:39 -04001090 kobject_uevent(&policy->kobj, KOBJ_ADD);
Viresh Kumar6eed9402013-08-06 22:53:11 +05301091 up_read(&cpufreq_rwsem);
1092
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001093 pr_debug("initialization complete\n");
Dave Jones87c32272006-03-29 01:48:37 -05001094
Linus Torvalds1da177e2005-04-16 15:20:36 -07001095 return 0;
1096
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097err_out_unregister:
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001098 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar474deff2013-08-20 12:08:25 +05301099 for_each_cpu(j, policy->cpus)
Mike Travis7a6aedf2008-03-25 15:06:53 -07001100 per_cpu(cpufreq_cpu_data, j) = NULL;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001101 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102
Viresh Kumar2eaa3e22013-02-07 10:55:00 +05301103err_set_policy_cpu:
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +05301104 cpufreq_policy_free(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105nomem_out:
Viresh Kumar6eed9402013-08-06 22:53:11 +05301106 up_read(&cpufreq_rwsem);
1107
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 return ret;
1109}
1110
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301111/**
1112 * cpufreq_add_dev - add a CPU device
1113 *
1114 * Adds the cpufreq interface for a CPU device.
1115 *
1116 * The Oracle says: try running cpufreq registration/unregistration concurrently
1117 * with with cpu hotplugging and all hell will break loose. Tried to clean this
1118 * mess up, but more thorough testing is needed. - Mathieu
1119 */
1120static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
1121{
1122 return __cpufreq_add_dev(dev, sif, false);
1123}
1124
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301125static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy,
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301126 unsigned int old_cpu, bool frozen)
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301127{
1128 struct device *cpu_dev;
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301129 int ret;
1130
1131 /* first sibling now owns the new sysfs dir */
Viresh Kumar9c8f1ee2013-09-12 17:06:33 +05301132 cpu_dev = get_cpu_device(cpumask_any_but(policy->cpus, old_cpu));
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301133
1134 /* Don't touch sysfs files during light-weight tear-down */
1135 if (frozen)
1136 return cpu_dev->id;
1137
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301138 sysfs_remove_link(&cpu_dev->kobj, "cpufreq");
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301139 ret = kobject_move(&policy->kobj, &cpu_dev->kobj);
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301140 if (ret) {
1141 pr_err("%s: Failed to move kobj: %d", __func__, ret);
1142
Viresh Kumar1b750e32013-10-02 14:13:09 +05301143 lock_policy_rwsem_write(old_cpu);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301144 cpumask_set_cpu(old_cpu, policy->cpus);
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301145 unlock_policy_rwsem_write(old_cpu);
1146
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301147 ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301148 "cpufreq");
1149
1150 return -EINVAL;
1151 }
1152
1153 return cpu_dev->id;
1154}
1155
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301156static int __cpufreq_remove_dev_prepare(struct device *dev,
1157 struct subsys_interface *sif,
1158 bool frozen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159{
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301160 unsigned int cpu = dev->id, cpus;
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301161 int new_cpu, ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 unsigned long flags;
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301163 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001165 pr_debug("%s: unregistering CPU %u\n", __func__, cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001167 write_lock_irqsave(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301169 policy = per_cpu(cpufreq_cpu_data, cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301171 /* Save the policy somewhere when doing a light-weight tear-down */
1172 if (frozen)
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301173 per_cpu(cpufreq_cpu_data_fallback, cpu) = policy;
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301174
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001175 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301177 if (!policy) {
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001178 pr_debug("%s: No cpu_data found\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301182 if (cpufreq_driver->target) {
1183 ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
1184 if (ret) {
1185 pr_err("%s: Failed to stop governor\n", __func__);
1186 return ret;
1187 }
1188 }
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001189
Jacob Shin27ecddc2011-04-27 13:32:11 -05001190#ifdef CONFIG_HOTPLUG_CPU
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001191 if (!cpufreq_driver->setpolicy)
Dirk Brandewiefa69e332013-02-06 09:02:11 -08001192 strncpy(per_cpu(cpufreq_cpu_governor, cpu),
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301193 policy->governor->name, CPUFREQ_NAME_LEN);
Jacob Shin27ecddc2011-04-27 13:32:11 -05001194#endif
1195
Viresh Kumar9c8f1ee2013-09-12 17:06:33 +05301196 lock_policy_rwsem_read(cpu);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301197 cpus = cpumask_weight(policy->cpus);
Viresh Kumar9c8f1ee2013-09-12 17:06:33 +05301198 unlock_policy_rwsem_read(cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199
Srivatsa S. Bhat61173f22013-09-12 01:43:25 +05301200 if (cpu != policy->cpu) {
1201 if (!frozen)
1202 sysfs_remove_link(&dev->kobj, "cpufreq");
Viresh Kumar73bf0fc2013-02-05 22:21:14 +01001203 } else if (cpus > 1) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301204 new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu, frozen);
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301205 if (new_cpu >= 0) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301206 update_policy_cpu(policy, new_cpu);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301207
1208 if (!frozen) {
Viresh Kumar75949c92013-10-02 14:13:13 +05301209 pr_debug("%s: policy Kobject moved to cpu: %d from: %d\n",
1210 __func__, new_cpu, cpu);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301211 }
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001212 }
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001213 }
Venki Pallipadiec282972007-03-26 12:03:19 -07001214
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301215 return 0;
1216}
1217
1218static int __cpufreq_remove_dev_finish(struct device *dev,
1219 struct subsys_interface *sif,
1220 bool frozen)
1221{
1222 unsigned int cpu = dev->id, cpus;
1223 int ret;
1224 unsigned long flags;
1225 struct cpufreq_policy *policy;
1226 struct kobject *kobj;
1227 struct completion *cmp;
1228
1229 read_lock_irqsave(&cpufreq_driver_lock, flags);
1230 policy = per_cpu(cpufreq_cpu_data, cpu);
1231 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
1232
1233 if (!policy) {
1234 pr_debug("%s: No cpu_data found\n", __func__);
1235 return -EINVAL;
1236 }
1237
Viresh Kumar1b750e32013-10-02 14:13:09 +05301238 lock_policy_rwsem_write(cpu);
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301239 cpus = cpumask_weight(policy->cpus);
Viresh Kumar9c8f1ee2013-09-12 17:06:33 +05301240
1241 if (cpus > 1)
1242 cpumask_clear_cpu(cpu, policy->cpus);
1243 unlock_policy_rwsem_write(cpu);
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301244
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001245 /* If cpu is last user of policy, free policy */
1246 if (cpus == 1) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301247 if (cpufreq_driver->target) {
1248 ret = __cpufreq_governor(policy,
1249 CPUFREQ_GOV_POLICY_EXIT);
1250 if (ret) {
1251 pr_err("%s: Failed to exit governor\n",
1252 __func__);
1253 return ret;
1254 }
Viresh Kumaredab2fb2013-08-20 12:08:22 +05301255 }
Rafael J. Wysocki2a998592013-07-30 00:32:00 +02001256
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301257 if (!frozen) {
1258 lock_policy_rwsem_read(cpu);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301259 kobj = &policy->kobj;
1260 cmp = &policy->kobj_unregister;
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301261 unlock_policy_rwsem_read(cpu);
1262 kobject_put(kobj);
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001263
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301264 /*
1265 * We need to make sure that the underlying kobj is
1266 * actually not referenced anymore by anybody before we
1267 * proceed with unloading.
1268 */
1269 pr_debug("waiting for dropping of refcount\n");
1270 wait_for_completion(cmp);
1271 pr_debug("wait complete\n");
1272 }
1273
1274 /*
1275 * Perform the ->exit() even during light-weight tear-down,
1276 * since this is a core component, and is essential for the
1277 * subsequent light-weight ->init() to succeed.
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001278 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001279 if (cpufreq_driver->exit)
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301280 cpufreq_driver->exit(policy);
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001281
Viresh Kumar9515f4d2013-08-20 12:08:23 +05301282 /* Remove policy from list of active policies */
1283 write_lock_irqsave(&cpufreq_driver_lock, flags);
1284 list_del(&policy->policy_list);
1285 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1286
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301287 if (!frozen)
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301288 cpufreq_policy_free(policy);
Rafael J. Wysocki2a998592013-07-30 00:32:00 +02001289 } else {
Rafael J. Wysocki2a998592013-07-30 00:32:00 +02001290 if (cpufreq_driver->target) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301291 if ((ret = __cpufreq_governor(policy, CPUFREQ_GOV_START)) ||
1292 (ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))) {
1293 pr_err("%s: Failed to start governor\n",
1294 __func__);
1295 return ret;
1296 }
Rafael J. Wysocki2a998592013-07-30 00:32:00 +02001297 }
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001298 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299
Viresh Kumar474deff2013-08-20 12:08:25 +05301300 per_cpu(cpufreq_cpu_data, cpu) = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301 return 0;
1302}
1303
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301304/**
Viresh Kumar27a862e2013-10-02 14:13:14 +05301305 * cpufreq_remove_dev - remove a CPU device
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301306 *
1307 * Removes the cpufreq interface for a CPU device.
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301308 */
Kay Sievers8a25a2f2011-12-21 14:29:42 -08001309static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001310{
Kay Sievers8a25a2f2011-12-21 14:29:42 -08001311 unsigned int cpu = dev->id;
Viresh Kumar27a862e2013-10-02 14:13:14 +05301312 int ret;
Venki Pallipadiec282972007-03-26 12:03:19 -07001313
1314 if (cpu_is_offline(cpu))
1315 return 0;
1316
Viresh Kumar27a862e2013-10-02 14:13:14 +05301317 ret = __cpufreq_remove_dev_prepare(dev, sif, false);
1318
1319 if (!ret)
1320 ret = __cpufreq_remove_dev_finish(dev, sif, false);
1321
1322 return ret;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001323}
1324
David Howells65f27f32006-11-22 14:55:48 +00001325static void handle_update(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326{
David Howells65f27f32006-11-22 14:55:48 +00001327 struct cpufreq_policy *policy =
1328 container_of(work, struct cpufreq_policy, update);
1329 unsigned int cpu = policy->cpu;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001330 pr_debug("handle_update for cpu %u called\n", cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 cpufreq_update_policy(cpu);
1332}
1333
1334/**
Viresh Kumarbb176f72013-06-19 14:19:33 +05301335 * cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're
1336 * in deep trouble.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337 * @cpu: cpu number
1338 * @old_freq: CPU frequency the kernel thinks the CPU runs at
1339 * @new_freq: CPU frequency the CPU actually runs at
1340 *
Dave Jones29464f22009-01-18 01:37:11 -05001341 * We adjust to current frequency first, and need to clean up later.
1342 * So either call to cpufreq_update_policy() or schedule handle_update()).
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343 */
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301344static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
1345 unsigned int new_freq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346{
Viresh Kumarb43a7ff2013-03-24 11:56:43 +05301347 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348 struct cpufreq_freqs freqs;
Viresh Kumarb43a7ff2013-03-24 11:56:43 +05301349 unsigned long flags;
1350
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001351 pr_debug("Warning: CPU frequency out of sync: cpufreq and timing "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001352 "core thinks of %u, is %u kHz.\n", old_freq, new_freq);
1353
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354 freqs.old = old_freq;
1355 freqs.new = new_freq;
Viresh Kumarb43a7ff2013-03-24 11:56:43 +05301356
1357 read_lock_irqsave(&cpufreq_driver_lock, flags);
1358 policy = per_cpu(cpufreq_cpu_data, cpu);
1359 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
1360
1361 cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
1362 cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363}
1364
Dave Jones32ee8c32006-02-28 00:43:23 -05001365/**
Dhaval Giani4ab70df2006-12-13 14:49:15 +05301366 * cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001367 * @cpu: CPU number
1368 *
1369 * This is the last known freq, without actually getting it from the driver.
1370 * Return value will be same as what is shown in scaling_cur_freq in sysfs.
1371 */
1372unsigned int cpufreq_quick_get(unsigned int cpu)
1373{
Dirk Brandewie9e21ba82013-02-06 09:02:08 -08001374 struct cpufreq_policy *policy;
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301375 unsigned int ret_freq = 0;
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001376
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001377 if (cpufreq_driver && cpufreq_driver->setpolicy && cpufreq_driver->get)
1378 return cpufreq_driver->get(cpu);
Dirk Brandewie9e21ba82013-02-06 09:02:08 -08001379
1380 policy = cpufreq_cpu_get(cpu);
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001381 if (policy) {
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301382 ret_freq = policy->cur;
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001383 cpufreq_cpu_put(policy);
1384 }
1385
Dave Jones4d34a672008-02-07 16:33:49 -05001386 return ret_freq;
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001387}
1388EXPORT_SYMBOL(cpufreq_quick_get);
1389
Jesse Barnes3d737102011-06-28 10:59:12 -07001390/**
1391 * cpufreq_quick_get_max - get the max reported CPU frequency for this CPU
1392 * @cpu: CPU number
1393 *
1394 * Just return the max possible frequency for a given CPU.
1395 */
1396unsigned int cpufreq_quick_get_max(unsigned int cpu)
1397{
1398 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
1399 unsigned int ret_freq = 0;
1400
1401 if (policy) {
1402 ret_freq = policy->max;
1403 cpufreq_cpu_put(policy);
1404 }
1405
1406 return ret_freq;
1407}
1408EXPORT_SYMBOL(cpufreq_quick_get_max);
1409
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001410static unsigned int __cpufreq_get(unsigned int cpu)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411{
Mike Travis7a6aedf2008-03-25 15:06:53 -07001412 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301413 unsigned int ret_freq = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001415 if (!cpufreq_driver->get)
Dave Jones4d34a672008-02-07 16:33:49 -05001416 return ret_freq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001417
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001418 ret_freq = cpufreq_driver->get(cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301420 if (ret_freq && policy->cur &&
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001421 !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301422 /* verify no discrepancy between actual and
1423 saved value exists */
1424 if (unlikely(ret_freq != policy->cur)) {
1425 cpufreq_out_of_sync(cpu, policy->cur, ret_freq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 schedule_work(&policy->update);
1427 }
1428 }
1429
Dave Jones4d34a672008-02-07 16:33:49 -05001430 return ret_freq;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001431}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001433/**
1434 * cpufreq_get - get the current CPU frequency (in kHz)
1435 * @cpu: CPU number
1436 *
1437 * Get the CPU current (static) CPU frequency
1438 */
1439unsigned int cpufreq_get(unsigned int cpu)
1440{
1441 unsigned int ret_freq = 0;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001442
Viresh Kumar26ca8692013-09-20 22:37:31 +05301443 if (cpufreq_disabled() || !cpufreq_driver)
1444 return -ENOENT;
1445
Viresh Kumar6eed9402013-08-06 22:53:11 +05301446 if (!down_read_trylock(&cpufreq_rwsem))
1447 return 0;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001448
Viresh Kumar1b750e32013-10-02 14:13:09 +05301449 lock_policy_rwsem_read(cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001450
1451 ret_freq = __cpufreq_get(cpu);
1452
1453 unlock_policy_rwsem_read(cpu);
Viresh Kumar6eed9402013-08-06 22:53:11 +05301454 up_read(&cpufreq_rwsem);
1455
Dave Jones4d34a672008-02-07 16:33:49 -05001456 return ret_freq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457}
1458EXPORT_SYMBOL(cpufreq_get);
1459
Kay Sievers8a25a2f2011-12-21 14:29:42 -08001460static struct subsys_interface cpufreq_interface = {
1461 .name = "cpufreq",
1462 .subsys = &cpu_subsys,
1463 .add_dev = cpufreq_add_dev,
1464 .remove_dev = cpufreq_remove_dev,
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001465};
1466
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467/**
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001468 * cpufreq_bp_suspend - Prepare the boot CPU for system suspend.
1469 *
1470 * This function is only executed for the boot processor. The other CPUs
1471 * have been put offline by means of CPU hotplug.
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001472 */
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001473static int cpufreq_bp_suspend(void)
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001474{
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301475 int ret = 0;
Dave Jones4bc5d342009-08-04 14:03:25 -04001476
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001477 int cpu = smp_processor_id();
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301478 struct cpufreq_policy *policy;
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001479
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001480 pr_debug("suspending cpu %u\n", cpu);
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001481
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001482 /* If there's no policy for the boot CPU, we have nothing to do. */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301483 policy = cpufreq_cpu_get(cpu);
1484 if (!policy)
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001485 return 0;
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001486
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001487 if (cpufreq_driver->suspend) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301488 ret = cpufreq_driver->suspend(policy);
Dominik Brodowskice6c3992009-08-07 22:58:51 +02001489 if (ret)
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001490 printk(KERN_ERR "cpufreq: suspend failed in ->suspend "
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301491 "step on CPU %u\n", policy->cpu);
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001492 }
1493
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301494 cpufreq_cpu_put(policy);
Dave Jonesc9060492008-02-07 16:32:18 -05001495 return ret;
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001496}
1497
1498/**
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001499 * cpufreq_bp_resume - Restore proper frequency handling of the boot CPU.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500 *
1501 * 1.) resume CPUfreq hardware support (cpufreq_driver->resume())
Dominik Brodowskice6c3992009-08-07 22:58:51 +02001502 * 2.) schedule call cpufreq_update_policy() ASAP as interrupts are
1503 * restored. It will verify that the current freq is in sync with
1504 * what we believe it to be. This is a bit later than when it
1505 * should be, but nonethteless it's better than calling
1506 * cpufreq_driver->get() here which might re-enable interrupts...
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001507 *
1508 * This function is only executed for the boot CPU. The other CPUs have not
1509 * been turned on yet.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 */
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001511static void cpufreq_bp_resume(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512{
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301513 int ret = 0;
Dave Jones4bc5d342009-08-04 14:03:25 -04001514
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001515 int cpu = smp_processor_id();
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301516 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001518 pr_debug("resuming cpu %u\n", cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001520 /* If there's no policy for the boot CPU, we have nothing to do. */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301521 policy = cpufreq_cpu_get(cpu);
1522 if (!policy)
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001523 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001525 if (cpufreq_driver->resume) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301526 ret = cpufreq_driver->resume(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 if (ret) {
1528 printk(KERN_ERR "cpufreq: resume failed in ->resume "
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301529 "step on CPU %u\n", policy->cpu);
Dave Jonesc9060492008-02-07 16:32:18 -05001530 goto fail;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531 }
1532 }
1533
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301534 schedule_work(&policy->update);
Dominik Brodowskice6c3992009-08-07 22:58:51 +02001535
Dave Jonesc9060492008-02-07 16:32:18 -05001536fail:
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301537 cpufreq_cpu_put(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538}
1539
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001540static struct syscore_ops cpufreq_syscore_ops = {
1541 .suspend = cpufreq_bp_suspend,
1542 .resume = cpufreq_bp_resume,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543};
1544
Borislav Petkov9d950462013-01-20 10:24:28 +00001545/**
1546 * cpufreq_get_current_driver - return current driver's name
1547 *
1548 * Return the name string of the currently loaded cpufreq driver
1549 * or NULL, if none.
1550 */
1551const char *cpufreq_get_current_driver(void)
1552{
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001553 if (cpufreq_driver)
1554 return cpufreq_driver->name;
1555
1556 return NULL;
Borislav Petkov9d950462013-01-20 10:24:28 +00001557}
1558EXPORT_SYMBOL_GPL(cpufreq_get_current_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559
1560/*********************************************************************
1561 * NOTIFIER LISTS INTERFACE *
1562 *********************************************************************/
1563
1564/**
1565 * cpufreq_register_notifier - register a driver with cpufreq
1566 * @nb: notifier function to register
1567 * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
1568 *
Dave Jones32ee8c32006-02-28 00:43:23 -05001569 * Add a driver to one of two lists: either a list of drivers that
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 * are notified about clock rate changes (once before and once after
1571 * the transition), or a list of drivers that are notified about
1572 * changes in cpufreq policy.
1573 *
1574 * This function may sleep, and has the same return conditions as
Alan Sterne041c682006-03-27 01:16:30 -08001575 * blocking_notifier_chain_register.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 */
1577int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
1578{
1579 int ret;
1580
Dirk Brandewied5aaffa2013-01-17 16:22:21 +00001581 if (cpufreq_disabled())
1582 return -EINVAL;
1583
Cesar Eduardo Barros74212ca2008-02-16 08:41:24 -02001584 WARN_ON(!init_cpufreq_transition_notifier_list_called);
1585
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 switch (list) {
1587 case CPUFREQ_TRANSITION_NOTIFIER:
Alan Sternb4dfdbb2006-10-04 02:17:06 -07001588 ret = srcu_notifier_chain_register(
Alan Sterne041c682006-03-27 01:16:30 -08001589 &cpufreq_transition_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590 break;
1591 case CPUFREQ_POLICY_NOTIFIER:
Alan Sterne041c682006-03-27 01:16:30 -08001592 ret = blocking_notifier_chain_register(
1593 &cpufreq_policy_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594 break;
1595 default:
1596 ret = -EINVAL;
1597 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001598
1599 return ret;
1600}
1601EXPORT_SYMBOL(cpufreq_register_notifier);
1602
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603/**
1604 * cpufreq_unregister_notifier - unregister a driver with cpufreq
1605 * @nb: notifier block to be unregistered
Viresh Kumarbb176f72013-06-19 14:19:33 +05301606 * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607 *
1608 * Remove a driver from the CPU frequency notifier list.
1609 *
1610 * This function may sleep, and has the same return conditions as
Alan Sterne041c682006-03-27 01:16:30 -08001611 * blocking_notifier_chain_unregister.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612 */
1613int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
1614{
1615 int ret;
1616
Dirk Brandewied5aaffa2013-01-17 16:22:21 +00001617 if (cpufreq_disabled())
1618 return -EINVAL;
1619
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 switch (list) {
1621 case CPUFREQ_TRANSITION_NOTIFIER:
Alan Sternb4dfdbb2006-10-04 02:17:06 -07001622 ret = srcu_notifier_chain_unregister(
Alan Sterne041c682006-03-27 01:16:30 -08001623 &cpufreq_transition_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 break;
1625 case CPUFREQ_POLICY_NOTIFIER:
Alan Sterne041c682006-03-27 01:16:30 -08001626 ret = blocking_notifier_chain_unregister(
1627 &cpufreq_policy_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 break;
1629 default:
1630 ret = -EINVAL;
1631 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632
1633 return ret;
1634}
1635EXPORT_SYMBOL(cpufreq_unregister_notifier);
1636
1637
1638/*********************************************************************
1639 * GOVERNORS *
1640 *********************************************************************/
1641
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642int __cpufreq_driver_target(struct cpufreq_policy *policy,
1643 unsigned int target_freq,
1644 unsigned int relation)
1645{
1646 int retval = -EINVAL;
Viresh Kumar72499242012-10-31 01:28:21 +01001647 unsigned int old_target_freq = target_freq;
Ashok Rajc32b6b82005-10-30 14:59:54 -08001648
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04001649 if (cpufreq_disabled())
1650 return -ENODEV;
1651
Viresh Kumar72499242012-10-31 01:28:21 +01001652 /* Make sure that target_freq is within supported range */
1653 if (target_freq > policy->max)
1654 target_freq = policy->max;
1655 if (target_freq < policy->min)
1656 target_freq = policy->min;
1657
1658 pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
1659 policy->cpu, target_freq, relation, old_target_freq);
Viresh Kumar5a1c0222012-10-31 01:28:15 +01001660
1661 if (target_freq == policy->cur)
1662 return 0;
1663
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001664 if (cpufreq_driver->target)
1665 retval = cpufreq_driver->target(policy, target_freq, relation);
Ashok Raj90d45d12005-11-08 21:34:24 -08001666
Linus Torvalds1da177e2005-04-16 15:20:36 -07001667 return retval;
1668}
1669EXPORT_SYMBOL_GPL(__cpufreq_driver_target);
1670
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671int cpufreq_driver_target(struct cpufreq_policy *policy,
1672 unsigned int target_freq,
1673 unsigned int relation)
1674{
Julia Lawallf1829e42008-07-25 22:44:53 +02001675 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676
Viresh Kumar1b750e32013-10-02 14:13:09 +05301677 lock_policy_rwsem_write(policy->cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001678
1679 ret = __cpufreq_driver_target(policy, target_freq, relation);
1680
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001681 unlock_policy_rwsem_write(policy->cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 return ret;
1684}
1685EXPORT_SYMBOL_GPL(cpufreq_driver_target);
1686
Arjan van de Ven153d7f32006-07-26 15:40:07 +02001687/*
Arjan van de Ven153d7f32006-07-26 15:40:07 +02001688 * when "event" is CPUFREQ_GOV_LIMITS
1689 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301691static int __cpufreq_governor(struct cpufreq_policy *policy,
1692 unsigned int event)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693{
Dave Jonescc993ca2005-07-28 09:43:56 -07001694 int ret;
Thomas Renninger6afde102007-10-02 13:28:13 -07001695
1696 /* Only must be defined when default governor is known to have latency
1697 restrictions, like e.g. conservative or ondemand.
1698 That this is the case is already ensured in Kconfig
1699 */
1700#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
1701 struct cpufreq_governor *gov = &cpufreq_gov_performance;
1702#else
1703 struct cpufreq_governor *gov = NULL;
1704#endif
Thomas Renninger1c256242007-10-02 13:28:12 -07001705
1706 if (policy->governor->max_transition_latency &&
1707 policy->cpuinfo.transition_latency >
1708 policy->governor->max_transition_latency) {
Thomas Renninger6afde102007-10-02 13:28:13 -07001709 if (!gov)
1710 return -EINVAL;
1711 else {
1712 printk(KERN_WARNING "%s governor failed, too long"
1713 " transition latency of HW, fallback"
1714 " to %s governor\n",
1715 policy->governor->name,
1716 gov->name);
1717 policy->governor = gov;
1718 }
Thomas Renninger1c256242007-10-02 13:28:12 -07001719 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720
Viresh Kumarfe492f32013-08-06 22:53:10 +05301721 if (event == CPUFREQ_GOV_POLICY_INIT)
1722 if (!try_module_get(policy->governor->owner))
1723 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001725 pr_debug("__cpufreq_governor for CPU %u, event %u\n",
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301726 policy->cpu, event);
Xiaoguang Chen95731eb2013-06-19 15:00:07 +08001727
1728 mutex_lock(&cpufreq_governor_lock);
Srivatsa S. Bhat56d07db2013-09-07 01:23:55 +05301729 if ((policy->governor_enabled && event == CPUFREQ_GOV_START)
Viresh Kumarf73d3932013-08-31 17:53:40 +05301730 || (!policy->governor_enabled
1731 && (event == CPUFREQ_GOV_LIMITS || event == CPUFREQ_GOV_STOP))) {
Xiaoguang Chen95731eb2013-06-19 15:00:07 +08001732 mutex_unlock(&cpufreq_governor_lock);
1733 return -EBUSY;
1734 }
1735
1736 if (event == CPUFREQ_GOV_STOP)
1737 policy->governor_enabled = false;
1738 else if (event == CPUFREQ_GOV_START)
1739 policy->governor_enabled = true;
1740
1741 mutex_unlock(&cpufreq_governor_lock);
1742
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 ret = policy->governor->governor(policy, event);
1744
Viresh Kumar4d5dcc42013-03-27 15:58:58 +00001745 if (!ret) {
1746 if (event == CPUFREQ_GOV_POLICY_INIT)
1747 policy->governor->initialized++;
1748 else if (event == CPUFREQ_GOV_POLICY_EXIT)
1749 policy->governor->initialized--;
Xiaoguang Chen95731eb2013-06-19 15:00:07 +08001750 } else {
1751 /* Restore original values */
1752 mutex_lock(&cpufreq_governor_lock);
1753 if (event == CPUFREQ_GOV_STOP)
1754 policy->governor_enabled = true;
1755 else if (event == CPUFREQ_GOV_START)
1756 policy->governor_enabled = false;
1757 mutex_unlock(&cpufreq_governor_lock);
Viresh Kumar4d5dcc42013-03-27 15:58:58 +00001758 }
Viresh Kumarb3940582013-02-01 05:42:58 +00001759
Viresh Kumarfe492f32013-08-06 22:53:10 +05301760 if (((event == CPUFREQ_GOV_POLICY_INIT) && ret) ||
1761 ((event == CPUFREQ_GOV_POLICY_EXIT) && !ret))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762 module_put(policy->governor->owner);
1763
1764 return ret;
1765}
1766
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767int cpufreq_register_governor(struct cpufreq_governor *governor)
1768{
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07001769 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770
1771 if (!governor)
1772 return -EINVAL;
1773
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04001774 if (cpufreq_disabled())
1775 return -ENODEV;
1776
akpm@osdl.org3fc54d32006-01-13 15:54:22 -08001777 mutex_lock(&cpufreq_governor_mutex);
Dave Jones32ee8c32006-02-28 00:43:23 -05001778
Viresh Kumarb3940582013-02-01 05:42:58 +00001779 governor->initialized = 0;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07001780 err = -EBUSY;
1781 if (__find_governor(governor->name) == NULL) {
1782 err = 0;
1783 list_add(&governor->governor_list, &cpufreq_governor_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001784 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785
Dave Jones32ee8c32006-02-28 00:43:23 -05001786 mutex_unlock(&cpufreq_governor_mutex);
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07001787 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788}
1789EXPORT_SYMBOL_GPL(cpufreq_register_governor);
1790
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791void cpufreq_unregister_governor(struct cpufreq_governor *governor)
1792{
Prarit Bhargava90e41ba2009-11-12 09:18:46 -05001793#ifdef CONFIG_HOTPLUG_CPU
1794 int cpu;
1795#endif
1796
Linus Torvalds1da177e2005-04-16 15:20:36 -07001797 if (!governor)
1798 return;
1799
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04001800 if (cpufreq_disabled())
1801 return;
1802
Prarit Bhargava90e41ba2009-11-12 09:18:46 -05001803#ifdef CONFIG_HOTPLUG_CPU
1804 for_each_present_cpu(cpu) {
1805 if (cpu_online(cpu))
1806 continue;
1807 if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
1808 strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
1809 }
1810#endif
1811
akpm@osdl.org3fc54d32006-01-13 15:54:22 -08001812 mutex_lock(&cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001813 list_del(&governor->governor_list);
akpm@osdl.org3fc54d32006-01-13 15:54:22 -08001814 mutex_unlock(&cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 return;
1816}
1817EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
1818
1819
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820/*********************************************************************
1821 * POLICY INTERFACE *
1822 *********************************************************************/
1823
1824/**
1825 * cpufreq_get_policy - get the current cpufreq_policy
Dave Jones29464f22009-01-18 01:37:11 -05001826 * @policy: struct cpufreq_policy into which the current cpufreq_policy
1827 * is written
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 *
1829 * Reads the current cpufreq policy.
1830 */
1831int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
1832{
1833 struct cpufreq_policy *cpu_policy;
1834 if (!policy)
1835 return -EINVAL;
1836
1837 cpu_policy = cpufreq_cpu_get(cpu);
1838 if (!cpu_policy)
1839 return -EINVAL;
1840
Viresh Kumard5b73cd2013-08-06 22:53:06 +05301841 memcpy(policy, cpu_policy, sizeof(*policy));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842
1843 cpufreq_cpu_put(cpu_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844 return 0;
1845}
1846EXPORT_SYMBOL(cpufreq_get_policy);
1847
Arjan van de Ven153d7f32006-07-26 15:40:07 +02001848/*
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301849 * data : current policy.
1850 * policy : policy to be set.
Arjan van de Ven153d7f32006-07-26 15:40:07 +02001851 */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301852static int __cpufreq_set_policy(struct cpufreq_policy *policy,
1853 struct cpufreq_policy *new_policy)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854{
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001855 int ret = 0, failed = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001856
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301857 pr_debug("setting new policy for CPU %u: %u - %u kHz\n", new_policy->cpu,
1858 new_policy->min, new_policy->max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001859
Viresh Kumard5b73cd2013-08-06 22:53:06 +05301860 memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301862 if (new_policy->min > policy->max || new_policy->max < policy->min) {
Mattia Dongili9c9a43e2006-07-05 23:12:20 +02001863 ret = -EINVAL;
1864 goto error_out;
1865 }
1866
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867 /* verify the cpu speed can be set within this limit */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301868 ret = cpufreq_driver->verify(new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869 if (ret)
1870 goto error_out;
1871
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872 /* adjust if necessary - all reasons */
Alan Sterne041c682006-03-27 01:16:30 -08001873 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301874 CPUFREQ_ADJUST, new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875
1876 /* adjust if necessary - hardware incompatibility*/
Alan Sterne041c682006-03-27 01:16:30 -08001877 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301878 CPUFREQ_INCOMPATIBLE, new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879
Viresh Kumarbb176f72013-06-19 14:19:33 +05301880 /*
1881 * verify the cpu speed can be set within this limit, which might be
1882 * different to the first one
1883 */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301884 ret = cpufreq_driver->verify(new_policy);
Alan Sterne041c682006-03-27 01:16:30 -08001885 if (ret)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886 goto error_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001887
1888 /* notification of the new policy */
Alan Sterne041c682006-03-27 01:16:30 -08001889 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301890 CPUFREQ_NOTIFY, new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301892 policy->min = new_policy->min;
1893 policy->max = new_policy->max;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001894
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001895 pr_debug("new min and max freqs are %u - %u kHz\n",
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301896 policy->min, policy->max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001898 if (cpufreq_driver->setpolicy) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301899 policy->policy = new_policy->policy;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001900 pr_debug("setting range\n");
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301901 ret = cpufreq_driver->setpolicy(new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902 } else {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301903 if (new_policy->governor != policy->governor) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001904 /* save old, working values */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301905 struct cpufreq_governor *old_gov = policy->governor;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001906
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001907 pr_debug("governor switch\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001908
1909 /* end old governor */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301910 if (policy->governor) {
1911 __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
1912 unlock_policy_rwsem_write(new_policy->cpu);
1913 __cpufreq_governor(policy,
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001914 CPUFREQ_GOV_POLICY_EXIT);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301915 lock_policy_rwsem_write(new_policy->cpu);
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001916 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917
1918 /* start new governor */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301919 policy->governor = new_policy->governor;
1920 if (!__cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT)) {
1921 if (!__cpufreq_governor(policy, CPUFREQ_GOV_START)) {
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001922 failed = 0;
Viresh Kumar955ef482013-05-16 05:09:58 +00001923 } else {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301924 unlock_policy_rwsem_write(new_policy->cpu);
1925 __cpufreq_governor(policy,
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001926 CPUFREQ_GOV_POLICY_EXIT);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301927 lock_policy_rwsem_write(new_policy->cpu);
Viresh Kumar955ef482013-05-16 05:09:58 +00001928 }
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001929 }
1930
1931 if (failed) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932 /* new governor failed, so re-start old one */
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001933 pr_debug("starting governor %s failed\n",
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301934 policy->governor->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001935 if (old_gov) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301936 policy->governor = old_gov;
1937 __cpufreq_governor(policy,
Viresh Kumar7bd353a2013-03-27 15:58:57 +00001938 CPUFREQ_GOV_POLICY_INIT);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301939 __cpufreq_governor(policy,
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301940 CPUFREQ_GOV_START);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001941 }
1942 ret = -EINVAL;
1943 goto error_out;
1944 }
1945 /* might be a policy change, too, so fall through */
1946 }
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001947 pr_debug("governor: change or update limits\n");
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301948 ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001949 }
1950
Dave Jones7d5e3502006-02-02 17:03:42 -05001951error_out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 return ret;
1953}
1954
1955/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07001956 * cpufreq_update_policy - re-evaluate an existing cpufreq policy
1957 * @cpu: CPU which shall be re-evaluated
1958 *
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001959 * Useful for policy notifiers which have different necessities
Linus Torvalds1da177e2005-04-16 15:20:36 -07001960 * at different times.
1961 */
1962int cpufreq_update_policy(unsigned int cpu)
1963{
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301964 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
1965 struct cpufreq_policy new_policy;
Julia Lawallf1829e42008-07-25 22:44:53 +02001966 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001967
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301968 if (!policy) {
Julia Lawallf1829e42008-07-25 22:44:53 +02001969 ret = -ENODEV;
1970 goto no_policy;
1971 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972
Viresh Kumar1b750e32013-10-02 14:13:09 +05301973 lock_policy_rwsem_write(cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001975 pr_debug("updating policy for CPU %u\n", cpu);
Viresh Kumard5b73cd2013-08-06 22:53:06 +05301976 memcpy(&new_policy, policy, sizeof(*policy));
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301977 new_policy.min = policy->user_policy.min;
1978 new_policy.max = policy->user_policy.max;
1979 new_policy.policy = policy->user_policy.policy;
1980 new_policy.governor = policy->user_policy.governor;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981
Viresh Kumarbb176f72013-06-19 14:19:33 +05301982 /*
1983 * BIOS might change freq behind our back
1984 * -> ask driver for current freq and notify governors about a change
1985 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001986 if (cpufreq_driver->get) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301987 new_policy.cur = cpufreq_driver->get(cpu);
1988 if (!policy->cur) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001989 pr_debug("Driver did not initialize current freq");
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301990 policy->cur = new_policy.cur;
Thomas Renningera85f7bd2006-02-01 11:36:04 +01001991 } else {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301992 if (policy->cur != new_policy.cur && cpufreq_driver->target)
1993 cpufreq_out_of_sync(cpu, policy->cur,
1994 new_policy.cur);
Thomas Renningera85f7bd2006-02-01 11:36:04 +01001995 }
Thomas Renninger0961dd02006-01-26 18:46:33 +01001996 }
1997
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301998 ret = __cpufreq_set_policy(policy, &new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002000 unlock_policy_rwsem_write(cpu);
2001
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302002 cpufreq_cpu_put(policy);
Julia Lawallf1829e42008-07-25 22:44:53 +02002003no_policy:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002004 return ret;
2005}
2006EXPORT_SYMBOL(cpufreq_update_policy);
2007
Paul Gortmaker27609842013-06-19 13:54:04 -04002008static int cpufreq_cpu_callback(struct notifier_block *nfb,
Ashok Rajc32b6b82005-10-30 14:59:54 -08002009 unsigned long action, void *hcpu)
2010{
2011 unsigned int cpu = (unsigned long)hcpu;
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002012 struct device *dev;
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302013 bool frozen = false;
Ashok Rajc32b6b82005-10-30 14:59:54 -08002014
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002015 dev = get_cpu_device(cpu);
2016 if (dev) {
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302017
2018 if (action & CPU_TASKS_FROZEN)
2019 frozen = true;
2020
2021 switch (action & ~CPU_TASKS_FROZEN) {
Ashok Rajc32b6b82005-10-30 14:59:54 -08002022 case CPU_ONLINE:
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302023 __cpufreq_add_dev(dev, NULL, frozen);
Srivatsa S. Bhat23d328992013-07-30 04:23:56 +05302024 cpufreq_update_policy(cpu);
Ashok Rajc32b6b82005-10-30 14:59:54 -08002025 break;
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302026
Ashok Rajc32b6b82005-10-30 14:59:54 -08002027 case CPU_DOWN_PREPARE:
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05302028 __cpufreq_remove_dev_prepare(dev, NULL, frozen);
Srivatsa S. Bhat1aee40a2013-09-07 01:23:27 +05302029 break;
2030
2031 case CPU_POST_DEAD:
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05302032 __cpufreq_remove_dev_finish(dev, NULL, frozen);
Ashok Rajc32b6b82005-10-30 14:59:54 -08002033 break;
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302034
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002035 case CPU_DOWN_FAILED:
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302036 __cpufreq_add_dev(dev, NULL, frozen);
Ashok Rajc32b6b82005-10-30 14:59:54 -08002037 break;
2038 }
2039 }
2040 return NOTIFY_OK;
2041}
2042
Neal Buckendahl9c36f742010-06-22 22:02:44 -05002043static struct notifier_block __refdata cpufreq_cpu_notifier = {
Viresh Kumarbb176f72013-06-19 14:19:33 +05302044 .notifier_call = cpufreq_cpu_callback,
Ashok Rajc32b6b82005-10-30 14:59:54 -08002045};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046
2047/*********************************************************************
2048 * REGISTER / UNREGISTER CPUFREQ DRIVER *
2049 *********************************************************************/
2050
2051/**
2052 * cpufreq_register_driver - register a CPU Frequency driver
2053 * @driver_data: A struct cpufreq_driver containing the values#
2054 * submitted by the CPU Frequency driver.
2055 *
Viresh Kumarbb176f72013-06-19 14:19:33 +05302056 * Registers a CPU Frequency driver to this core code. This code
Linus Torvalds1da177e2005-04-16 15:20:36 -07002057 * returns zero on success, -EBUSY when another driver got here first
Dave Jones32ee8c32006-02-28 00:43:23 -05002058 * (and isn't unregistered in the meantime).
Linus Torvalds1da177e2005-04-16 15:20:36 -07002059 *
2060 */
Linus Torvalds221dee22007-02-26 14:55:48 -08002061int cpufreq_register_driver(struct cpufreq_driver *driver_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062{
2063 unsigned long flags;
2064 int ret;
2065
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04002066 if (cpufreq_disabled())
2067 return -ENODEV;
2068
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 if (!driver_data || !driver_data->verify || !driver_data->init ||
2070 ((!driver_data->setpolicy) && (!driver_data->target)))
2071 return -EINVAL;
2072
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002073 pr_debug("trying to register driver %s\n", driver_data->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074
2075 if (driver_data->setpolicy)
2076 driver_data->flags |= CPUFREQ_CONST_LOOPS;
2077
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002078 write_lock_irqsave(&cpufreq_driver_lock, flags);
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002079 if (cpufreq_driver) {
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002080 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Yinghai Lu4dea5802013-09-18 21:05:20 -07002081 return -EEXIST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002083 cpufreq_driver = driver_data;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002084 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002086 ret = subsys_interface_register(&cpufreq_interface);
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002087 if (ret)
2088 goto err_null_driver;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002090 if (!(cpufreq_driver->flags & CPUFREQ_STICKY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091 int i;
2092 ret = -ENODEV;
2093
2094 /* check for at least one working CPU */
Mike Travis7a6aedf2008-03-25 15:06:53 -07002095 for (i = 0; i < nr_cpu_ids; i++)
2096 if (cpu_possible(i) && per_cpu(cpufreq_cpu_data, i)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097 ret = 0;
Mike Travis7a6aedf2008-03-25 15:06:53 -07002098 break;
2099 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100
2101 /* if all ->init() calls failed, unregister */
2102 if (ret) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002103 pr_debug("no CPU initialized for driver %s\n",
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05302104 driver_data->name);
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002105 goto err_if_unreg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106 }
2107 }
2108
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002109 register_hotcpu_notifier(&cpufreq_cpu_notifier);
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002110 pr_debug("driver %s up and running\n", driver_data->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002112 return 0;
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002113err_if_unreg:
2114 subsys_interface_unregister(&cpufreq_interface);
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002115err_null_driver:
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002116 write_lock_irqsave(&cpufreq_driver_lock, flags);
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002117 cpufreq_driver = NULL;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002118 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Dave Jones4d34a672008-02-07 16:33:49 -05002119 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120}
2121EXPORT_SYMBOL_GPL(cpufreq_register_driver);
2122
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123/**
2124 * cpufreq_unregister_driver - unregister the current CPUFreq driver
2125 *
Viresh Kumarbb176f72013-06-19 14:19:33 +05302126 * Unregister the current CPUFreq driver. Only call this if you have
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 * the right to do so, i.e. if you have succeeded in initialising before!
2128 * Returns zero if successful, and -EINVAL if the cpufreq_driver is
2129 * currently not initialised.
2130 */
Linus Torvalds221dee22007-02-26 14:55:48 -08002131int cpufreq_unregister_driver(struct cpufreq_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132{
2133 unsigned long flags;
2134
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002135 if (!cpufreq_driver || (driver != cpufreq_driver))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002138 pr_debug("unregistering driver %s\n", driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002140 subsys_interface_unregister(&cpufreq_interface);
Chandra Seetharaman65edc682006-06-27 02:54:08 -07002141 unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142
Viresh Kumar6eed9402013-08-06 22:53:11 +05302143 down_write(&cpufreq_rwsem);
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002144 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar6eed9402013-08-06 22:53:11 +05302145
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002146 cpufreq_driver = NULL;
Viresh Kumar6eed9402013-08-06 22:53:11 +05302147
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002148 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumar6eed9402013-08-06 22:53:11 +05302149 up_write(&cpufreq_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150
2151 return 0;
2152}
2153EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002154
2155static int __init cpufreq_core_init(void)
2156{
2157 int cpu;
2158
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04002159 if (cpufreq_disabled())
2160 return -ENODEV;
2161
Viresh Kumar474deff2013-08-20 12:08:25 +05302162 for_each_possible_cpu(cpu)
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002163 init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
Thomas Renninger8aa84ad2009-07-24 15:25:05 +02002164
Viresh Kumar2361be22013-05-17 16:09:09 +05302165 cpufreq_global_kobject = kobject_create();
Thomas Renninger8aa84ad2009-07-24 15:25:05 +02002166 BUG_ON(!cpufreq_global_kobject);
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01002167 register_syscore_ops(&cpufreq_syscore_ops);
Thomas Renninger8aa84ad2009-07-24 15:25:05 +02002168
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002169 return 0;
2170}
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002171core_initcall(cpufreq_core_init);