blob: 09f333f4df88001d5dd97623b8435ef1a7176824 [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>
Viresh Kumar2f0aea92014-03-04 11:00:26 +080029#include <linux/suspend.h>
Doug Anderson90de2a42014-12-23 22:09:48 -080030#include <linux/syscore_ops.h>
Viresh Kumar5ff0a262013-08-06 22:53:03 +053031#include <linux/tick.h>
Thomas Renninger6f4f2722010-04-20 13:17:36 +020032#include <trace/events/power.h>
33
Linus Torvalds1da177e2005-04-16 15:20:36 -070034/**
Dave Jonescd878472006-08-11 17:59:28 -040035 * The "cpufreq driver" - the arch- or hardware-dependent low
Linus Torvalds1da177e2005-04-16 15:20:36 -070036 * level driver of CPUFreq support, and its spinlock. This lock
37 * also protects the cpufreq_cpu_data array.
38 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +020039static struct cpufreq_driver *cpufreq_driver;
Mike Travis7a6aedf2008-03-25 15:06:53 -070040static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +053041static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data_fallback);
Viresh Kumarbb176f72013-06-19 14:19:33 +053042static DEFINE_RWLOCK(cpufreq_driver_lock);
Jane Li6f1e4ef2014-01-03 17:17:41 +080043DEFINE_MUTEX(cpufreq_governor_lock);
Lukasz Majewskic88a1f82013-08-06 22:53:08 +053044static LIST_HEAD(cpufreq_policy_list);
Viresh Kumarbb176f72013-06-19 14:19:33 +053045
Thomas Renninger084f3492007-07-09 11:35:28 -070046/* 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);
Linus Torvalds1da177e2005-04-16 15:20:36 -070048
Viresh Kumar2f0aea92014-03-04 11:00:26 +080049/* Flag to suspend/resume CPUFreq governors */
50static bool cpufreq_suspended;
Linus Torvalds1da177e2005-04-16 15:20:36 -070051
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +053052static inline bool has_target(void)
53{
54 return cpufreq_driver->target_index || cpufreq_driver->target;
55}
56
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -080057/*
Viresh Kumar6eed9402013-08-06 22:53:11 +053058 * rwsem to guarantee that cpufreq driver module doesn't unload during critical
59 * sections
60 */
61static DECLARE_RWSEM(cpufreq_rwsem);
62
Linus Torvalds1da177e2005-04-16 15:20:36 -070063/* internal prototypes */
Dave Jones29464f22009-01-18 01:37:11 -050064static int __cpufreq_governor(struct cpufreq_policy *policy,
65 unsigned int event);
Viresh Kumard92d50a2015-01-02 12:34:29 +053066static unsigned int __cpufreq_get(struct cpufreq_policy *policy);
David Howells65f27f32006-11-22 14:55:48 +000067static void handle_update(struct work_struct *work);
Linus Torvalds1da177e2005-04-16 15:20:36 -070068
69/**
Dave Jones32ee8c32006-02-28 00:43:23 -050070 * Two notifier lists: the "policy" list is involved in the
71 * validation process for a new CPU frequency policy; the
Linus Torvalds1da177e2005-04-16 15:20:36 -070072 * "transition" list for kernel code that needs to handle
73 * changes to devices when the CPU clock speed changes.
74 * The mutex locks both lists.
75 */
Alan Sterne041c682006-03-27 01:16:30 -080076static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
Alan Sternb4dfdbb2006-10-04 02:17:06 -070077static struct srcu_notifier_head cpufreq_transition_notifier_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -070078
Cesar Eduardo Barros74212ca2008-02-16 08:41:24 -020079static bool init_cpufreq_transition_notifier_list_called;
Alan Sternb4dfdbb2006-10-04 02:17:06 -070080static int __init init_cpufreq_transition_notifier_list(void)
81{
82 srcu_init_notifier_head(&cpufreq_transition_notifier_list);
Cesar Eduardo Barros74212ca2008-02-16 08:41:24 -020083 init_cpufreq_transition_notifier_list_called = true;
Alan Sternb4dfdbb2006-10-04 02:17:06 -070084 return 0;
85}
Linus Torvaldsb3438f82006-11-20 11:47:18 -080086pure_initcall(init_cpufreq_transition_notifier_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -070087
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -040088static int off __read_mostly;
Viresh Kumarda584452012-10-26 00:51:32 +020089static int cpufreq_disabled(void)
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -040090{
91 return off;
92}
93void disable_cpufreq(void)
94{
95 off = 1;
96}
Linus Torvalds1da177e2005-04-16 15:20:36 -070097static LIST_HEAD(cpufreq_governor_list);
Dave Jones29464f22009-01-18 01:37:11 -050098static DEFINE_MUTEX(cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -070099
Viresh Kumar4d5dcc42013-03-27 15:58:58 +0000100bool have_governor_per_policy(void)
101{
Viresh Kumar0b981e72013-10-02 14:13:18 +0530102 return !!(cpufreq_driver->flags & CPUFREQ_HAVE_GOVERNOR_PER_POLICY);
Viresh Kumar4d5dcc42013-03-27 15:58:58 +0000103}
Viresh Kumar3f869d62013-05-16 05:09:56 +0000104EXPORT_SYMBOL_GPL(have_governor_per_policy);
Viresh Kumar4d5dcc42013-03-27 15:58:58 +0000105
Viresh Kumar944e9a02013-05-16 05:09:57 +0000106struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
107{
108 if (have_governor_per_policy())
109 return &policy->kobj;
110 else
111 return cpufreq_global_kobject;
112}
113EXPORT_SYMBOL_GPL(get_governor_parent_kobj);
114
Viresh Kumar72a4ce32013-05-17 11:26:32 +0000115static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
116{
117 u64 idle_time;
118 u64 cur_wall_time;
119 u64 busy_time;
120
121 cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
122
123 busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
124 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
125 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
126 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
127 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
128 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
129
130 idle_time = cur_wall_time - busy_time;
131 if (wall)
132 *wall = cputime_to_usecs(cur_wall_time);
133
134 return cputime_to_usecs(idle_time);
135}
136
137u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
138{
139 u64 idle_time = get_cpu_idle_time_us(cpu, io_busy ? wall : NULL);
140
141 if (idle_time == -1ULL)
142 return get_cpu_idle_time_jiffy(cpu, wall);
143 else if (!io_busy)
144 idle_time += get_cpu_iowait_time_us(cpu, wall);
145
146 return idle_time;
147}
148EXPORT_SYMBOL_GPL(get_cpu_idle_time);
149
Viresh Kumar70e9e772013-10-03 20:29:07 +0530150/*
151 * This is a generic cpufreq init() routine which can be used by cpufreq
152 * drivers of SMP systems. It will do following:
153 * - validate & show freq table passed
154 * - set policies transition latency
155 * - policy->cpus with all possible CPUs
156 */
157int cpufreq_generic_init(struct cpufreq_policy *policy,
158 struct cpufreq_frequency_table *table,
159 unsigned int transition_latency)
160{
161 int ret;
162
163 ret = cpufreq_table_validate_and_show(policy, table);
164 if (ret) {
165 pr_err("%s: invalid frequency table: %d\n", __func__, ret);
166 return ret;
167 }
168
169 policy->cpuinfo.transition_latency = transition_latency;
170
171 /*
172 * The driver only supports the SMP configuartion where all processors
173 * share the clock and voltage and clock.
174 */
175 cpumask_setall(policy->cpus);
176
177 return 0;
178}
179EXPORT_SYMBOL_GPL(cpufreq_generic_init);
180
Viresh Kumar652ed952014-01-09 20:38:43 +0530181unsigned int cpufreq_generic_get(unsigned int cpu)
182{
183 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
184
185 if (!policy || IS_ERR(policy->clk)) {
Joe Perchese837f9b2014-03-11 10:03:00 -0700186 pr_err("%s: No %s associated to cpu: %d\n",
187 __func__, policy ? "clk" : "policy", cpu);
Viresh Kumar652ed952014-01-09 20:38:43 +0530188 return 0;
189 }
190
191 return clk_get_rate(policy->clk) / 1000;
192}
193EXPORT_SYMBOL_GPL(cpufreq_generic_get);
194
Viresh Kumare0b31652014-03-10 14:53:33 +0530195/* Only for cpufreq core internal use */
196struct cpufreq_policy *cpufreq_cpu_get_raw(unsigned int cpu)
197{
198 return per_cpu(cpufreq_cpu_data, cpu);
199}
200
Viresh Kumar6eed9402013-08-06 22:53:11 +0530201struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202{
Viresh Kumar6eed9402013-08-06 22:53:11 +0530203 struct cpufreq_policy *policy = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 unsigned long flags;
205
Viresh Kumar6eed9402013-08-06 22:53:11 +0530206 if (cpufreq_disabled() || (cpu >= nr_cpu_ids))
207 return NULL;
208
209 if (!down_read_trylock(&cpufreq_rwsem))
210 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
212 /* get the cpufreq driver */
Nathan Zimmer0d1857a2013-02-22 16:24:34 +0000213 read_lock_irqsave(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214
Viresh Kumar6eed9402013-08-06 22:53:11 +0530215 if (cpufreq_driver) {
216 /* get the CPU */
217 policy = per_cpu(cpufreq_cpu_data, cpu);
218 if (policy)
219 kobject_get(&policy->kobj);
220 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200221
Viresh Kumar6eed9402013-08-06 22:53:11 +0530222 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530224 if (!policy)
Viresh Kumar6eed9402013-08-06 22:53:11 +0530225 up_read(&cpufreq_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530227 return policy;
Stephen Boyda9144432012-07-20 18:14:38 +0000228}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229EXPORT_SYMBOL_GPL(cpufreq_cpu_get);
230
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530231void cpufreq_cpu_put(struct cpufreq_policy *policy)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232{
Dirk Brandewied5aaffa2013-01-17 16:22:21 +0000233 if (cpufreq_disabled())
234 return;
235
Viresh Kumar6eed9402013-08-06 22:53:11 +0530236 kobject_put(&policy->kobj);
237 up_read(&cpufreq_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238}
239EXPORT_SYMBOL_GPL(cpufreq_cpu_put);
240
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241/*********************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 * EXTERNALLY AFFECTING FREQUENCY CHANGES *
243 *********************************************************************/
244
245/**
246 * adjust_jiffies - adjust the system "loops_per_jiffy"
247 *
248 * This function alters the system "loops_per_jiffy" for the clock
249 * speed change. Note that loops_per_jiffy cannot be updated on SMP
Dave Jones32ee8c32006-02-28 00:43:23 -0500250 * systems as each CPU might be scaled differently. So, use the arch
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 * per-CPU loops_per_jiffy value wherever possible.
252 */
Arjan van de Ven858119e2006-01-14 13:20:43 -0800253static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254{
Viresh Kumar39c132e2015-01-02 12:34:34 +0530255#ifndef CONFIG_SMP
256 static unsigned long l_p_j_ref;
257 static unsigned int l_p_j_ref_freq;
258
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259 if (ci->flags & CPUFREQ_CONST_LOOPS)
260 return;
261
262 if (!l_p_j_ref_freq) {
263 l_p_j_ref = loops_per_jiffy;
264 l_p_j_ref_freq = ci->old;
Joe Perchese837f9b2014-03-11 10:03:00 -0700265 pr_debug("saving %lu as reference value for loops_per_jiffy; freq is %u kHz\n",
266 l_p_j_ref, l_p_j_ref_freq);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 }
Viresh Kumar0b443ea2014-03-19 11:24:58 +0530268 if (val == CPUFREQ_POSTCHANGE && ci->old != ci->new) {
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530269 loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
270 ci->new);
Joe Perchese837f9b2014-03-11 10:03:00 -0700271 pr_debug("scaling loops_per_jiffy to %lu for frequency %u kHz\n",
272 loops_per_jiffy, ci->new);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274#endif
Viresh Kumar39c132e2015-01-02 12:34:34 +0530275}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276
Viresh Kumar0956df9c2013-06-19 14:19:34 +0530277static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
Viresh Kumarb43a7ff2013-03-24 11:56:43 +0530278 struct cpufreq_freqs *freqs, unsigned int state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279{
280 BUG_ON(irqs_disabled());
281
Dirk Brandewied5aaffa2013-01-17 16:22:21 +0000282 if (cpufreq_disabled())
283 return;
284
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200285 freqs->flags = cpufreq_driver->flags;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200286 pr_debug("notification %u of frequency transition to %u kHz\n",
Joe Perchese837f9b2014-03-11 10:03:00 -0700287 state, freqs->new);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 switch (state) {
Dave Jonese4472cb2006-01-31 15:53:55 -0800290
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291 case CPUFREQ_PRECHANGE:
Dave Jones32ee8c32006-02-28 00:43:23 -0500292 /* detect if the driver reported a value as "old frequency"
Dave Jonese4472cb2006-01-31 15:53:55 -0800293 * which is not equal to what the cpufreq core thinks is
294 * "old frequency".
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200296 if (!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
Dave Jonese4472cb2006-01-31 15:53:55 -0800297 if ((policy) && (policy->cpu == freqs->cpu) &&
298 (policy->cur) && (policy->cur != freqs->old)) {
Joe Perchese837f9b2014-03-11 10:03:00 -0700299 pr_debug("Warning: CPU frequency is %u, cpufreq assumed %u kHz\n",
300 freqs->old, policy->cur);
Dave Jonese4472cb2006-01-31 15:53:55 -0800301 freqs->old = policy->cur;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302 }
303 }
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_PRECHANGE, freqs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306 adjust_jiffies(CPUFREQ_PRECHANGE, freqs);
307 break;
Dave Jonese4472cb2006-01-31 15:53:55 -0800308
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309 case CPUFREQ_POSTCHANGE:
310 adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
Joe Perchese837f9b2014-03-11 10:03:00 -0700311 pr_debug("FREQ: %lu - CPU: %lu\n",
312 (unsigned long)freqs->new, (unsigned long)freqs->cpu);
Thomas Renninger25e41932011-01-03 17:50:44 +0100313 trace_cpu_frequency(freqs->new, freqs->cpu);
Alan Sternb4dfdbb2006-10-04 02:17:06 -0700314 srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
Alan Sterne041c682006-03-27 01:16:30 -0800315 CPUFREQ_POSTCHANGE, freqs);
Dave Jonese4472cb2006-01-31 15:53:55 -0800316 if (likely(policy) && likely(policy->cpu == freqs->cpu))
317 policy->cur = freqs->new;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700318 break;
319 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320}
Viresh Kumarbb176f72013-06-19 14:19:33 +0530321
Viresh Kumarb43a7ff2013-03-24 11:56:43 +0530322/**
323 * cpufreq_notify_transition - call notifier chain and adjust_jiffies
324 * on frequency transition.
325 *
326 * This function calls the transition notifiers and the "adjust_jiffies"
327 * function. It is called twice on all CPU frequency changes that have
328 * external effects.
329 */
Viresh Kumar236a9802014-03-24 13:35:46 +0530330static void cpufreq_notify_transition(struct cpufreq_policy *policy,
Viresh Kumarb43a7ff2013-03-24 11:56:43 +0530331 struct cpufreq_freqs *freqs, unsigned int state)
332{
333 for_each_cpu(freqs->cpu, policy->cpus)
334 __cpufreq_notify_transition(policy, freqs, state);
335}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336
Viresh Kumarf7ba3b42013-12-02 11:04:12 +0530337/* Do post notifications when there are chances that transition has failed */
Viresh Kumar236a9802014-03-24 13:35:46 +0530338static void cpufreq_notify_post_transition(struct cpufreq_policy *policy,
Viresh Kumarf7ba3b42013-12-02 11:04:12 +0530339 struct cpufreq_freqs *freqs, int transition_failed)
340{
341 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE);
342 if (!transition_failed)
343 return;
344
345 swap(freqs->old, freqs->new);
346 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE);
347 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE);
348}
Viresh Kumarf7ba3b42013-12-02 11:04:12 +0530349
Srivatsa S. Bhat12478cf2014-03-24 13:35:44 +0530350void cpufreq_freq_transition_begin(struct cpufreq_policy *policy,
351 struct cpufreq_freqs *freqs)
352{
Srivatsa S. Bhatca654dc2014-05-05 12:52:39 +0530353
354 /*
355 * Catch double invocations of _begin() which lead to self-deadlock.
356 * ASYNC_NOTIFICATION drivers are left out because the cpufreq core
357 * doesn't invoke _begin() on their behalf, and hence the chances of
358 * double invocations are very low. Moreover, there are scenarios
359 * where these checks can emit false-positive warnings in these
360 * drivers; so we avoid that by skipping them altogether.
361 */
362 WARN_ON(!(cpufreq_driver->flags & CPUFREQ_ASYNC_NOTIFICATION)
363 && current == policy->transition_task);
364
Srivatsa S. Bhat12478cf2014-03-24 13:35:44 +0530365wait:
366 wait_event(policy->transition_wait, !policy->transition_ongoing);
367
368 spin_lock(&policy->transition_lock);
369
370 if (unlikely(policy->transition_ongoing)) {
371 spin_unlock(&policy->transition_lock);
372 goto wait;
373 }
374
375 policy->transition_ongoing = true;
Srivatsa S. Bhatca654dc2014-05-05 12:52:39 +0530376 policy->transition_task = current;
Srivatsa S. Bhat12478cf2014-03-24 13:35:44 +0530377
378 spin_unlock(&policy->transition_lock);
379
380 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE);
381}
382EXPORT_SYMBOL_GPL(cpufreq_freq_transition_begin);
383
384void cpufreq_freq_transition_end(struct cpufreq_policy *policy,
385 struct cpufreq_freqs *freqs, int transition_failed)
386{
387 if (unlikely(WARN_ON(!policy->transition_ongoing)))
388 return;
389
390 cpufreq_notify_post_transition(policy, freqs, transition_failed);
391
392 policy->transition_ongoing = false;
Srivatsa S. Bhatca654dc2014-05-05 12:52:39 +0530393 policy->transition_task = NULL;
Srivatsa S. Bhat12478cf2014-03-24 13:35:44 +0530394
395 wake_up(&policy->transition_wait);
396}
397EXPORT_SYMBOL_GPL(cpufreq_freq_transition_end);
398
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399
Linus Torvalds1da177e2005-04-16 15:20:36 -0700400/*********************************************************************
401 * SYSFS INTERFACE *
402 *********************************************************************/
Rashika Kheria8a5c74a2014-02-26 22:12:42 +0530403static ssize_t show_boost(struct kobject *kobj,
Lukasz Majewski6f19efc2013-12-20 15:24:49 +0100404 struct attribute *attr, char *buf)
405{
406 return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
407}
408
409static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
410 const char *buf, size_t count)
411{
412 int ret, enable;
413
414 ret = sscanf(buf, "%d", &enable);
415 if (ret != 1 || enable < 0 || enable > 1)
416 return -EINVAL;
417
418 if (cpufreq_boost_trigger_state(enable)) {
Joe Perchese837f9b2014-03-11 10:03:00 -0700419 pr_err("%s: Cannot %s BOOST!\n",
420 __func__, enable ? "enable" : "disable");
Lukasz Majewski6f19efc2013-12-20 15:24:49 +0100421 return -EINVAL;
422 }
423
Joe Perchese837f9b2014-03-11 10:03:00 -0700424 pr_debug("%s: cpufreq BOOST %s\n",
425 __func__, enable ? "enabled" : "disabled");
Lukasz Majewski6f19efc2013-12-20 15:24:49 +0100426
427 return count;
428}
429define_one_global_rw(boost);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430
Viresh Kumar42f91fa2015-01-02 12:34:26 +0530431static struct cpufreq_governor *find_governor(const char *str_governor)
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700432{
433 struct cpufreq_governor *t;
434
435 list_for_each_entry(t, &cpufreq_governor_list, governor_list)
Rasmus Villemoes7c4f4532014-09-29 15:50:11 +0200436 if (!strncasecmp(str_governor, t->name, CPUFREQ_NAME_LEN))
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700437 return t;
438
439 return NULL;
440}
441
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442/**
443 * cpufreq_parse_governor - parse a governor string
444 */
Dave Jones905d77c2008-03-05 14:28:32 -0500445static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 struct cpufreq_governor **governor)
447{
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700448 int err = -EINVAL;
449
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200450 if (!cpufreq_driver)
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700451 goto out;
452
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200453 if (cpufreq_driver->setpolicy) {
Rasmus Villemoes7c4f4532014-09-29 15:50:11 +0200454 if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 *policy = CPUFREQ_POLICY_PERFORMANCE;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700456 err = 0;
Rasmus Villemoes7c4f4532014-09-29 15:50:11 +0200457 } else if (!strncasecmp(str_governor, "powersave",
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530458 CPUFREQ_NAME_LEN)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459 *policy = CPUFREQ_POLICY_POWERSAVE;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700460 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 }
Viresh Kumar2e1cc3a2015-01-02 12:34:27 +0530462 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 struct cpufreq_governor *t;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700464
akpm@osdl.org3fc54d32006-01-13 15:54:22 -0800465 mutex_lock(&cpufreq_governor_mutex);
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700466
Viresh Kumar42f91fa2015-01-02 12:34:26 +0530467 t = find_governor(str_governor);
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700468
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700469 if (t == NULL) {
Kees Cook1a8e1462011-05-04 08:38:56 -0700470 int ret;
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700471
Kees Cook1a8e1462011-05-04 08:38:56 -0700472 mutex_unlock(&cpufreq_governor_mutex);
473 ret = request_module("cpufreq_%s", str_governor);
474 mutex_lock(&cpufreq_governor_mutex);
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700475
Kees Cook1a8e1462011-05-04 08:38:56 -0700476 if (ret == 0)
Viresh Kumar42f91fa2015-01-02 12:34:26 +0530477 t = find_governor(str_governor);
Jeremy Fitzhardingeea714972006-07-06 12:32:01 -0700478 }
479
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700480 if (t != NULL) {
481 *governor = t;
482 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 }
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700484
akpm@osdl.org3fc54d32006-01-13 15:54:22 -0800485 mutex_unlock(&cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 }
Dave Jones29464f22009-01-18 01:37:11 -0500487out:
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -0700488 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491/**
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530492 * cpufreq_per_cpu_attr_read() / show_##file_name() -
493 * print out cpufreq information
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 *
495 * Write out information from cpufreq_driver->policy[cpu]; object must be
496 * "unsigned int".
497 */
498
Dave Jones32ee8c32006-02-28 00:43:23 -0500499#define show_one(file_name, object) \
500static ssize_t show_##file_name \
Dave Jones905d77c2008-03-05 14:28:32 -0500501(struct cpufreq_policy *policy, char *buf) \
Dave Jones32ee8c32006-02-28 00:43:23 -0500502{ \
Dave Jones29464f22009-01-18 01:37:11 -0500503 return sprintf(buf, "%u\n", policy->object); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504}
505
506show_one(cpuinfo_min_freq, cpuinfo.min_freq);
507show_one(cpuinfo_max_freq, cpuinfo.max_freq);
Thomas Renningered129782009-02-04 01:17:41 +0100508show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509show_one(scaling_min_freq, min);
510show_one(scaling_max_freq, max);
Dirk Brandewiec034b022014-10-13 08:37:40 -0700511
Viresh Kumar09347b22015-01-02 12:34:24 +0530512static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf)
Dirk Brandewiec034b022014-10-13 08:37:40 -0700513{
514 ssize_t ret;
515
516 if (cpufreq_driver && cpufreq_driver->setpolicy && cpufreq_driver->get)
517 ret = sprintf(buf, "%u\n", cpufreq_driver->get(policy->cpu));
518 else
519 ret = sprintf(buf, "%u\n", policy->cur);
520 return ret;
521}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522
Viresh Kumar037ce832013-10-02 14:13:16 +0530523static int cpufreq_set_policy(struct cpufreq_policy *policy,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +0530524 struct cpufreq_policy *new_policy);
Thomas Renninger7970e082006-04-13 15:14:04 +0200525
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526/**
527 * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
528 */
529#define store_one(file_name, object) \
530static ssize_t store_##file_name \
Dave Jones905d77c2008-03-05 14:28:32 -0500531(struct cpufreq_policy *policy, const char *buf, size_t count) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532{ \
Vince Hsu619c144c2014-11-10 14:14:50 +0800533 int ret, temp; \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 struct cpufreq_policy new_policy; \
535 \
536 ret = cpufreq_get_policy(&new_policy, policy->cpu); \
537 if (ret) \
538 return -EINVAL; \
539 \
Dave Jones29464f22009-01-18 01:37:11 -0500540 ret = sscanf(buf, "%u", &new_policy.object); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 if (ret != 1) \
542 return -EINVAL; \
543 \
Vince Hsu619c144c2014-11-10 14:14:50 +0800544 temp = new_policy.object; \
Viresh Kumar037ce832013-10-02 14:13:16 +0530545 ret = cpufreq_set_policy(policy, &new_policy); \
Vince Hsu619c144c2014-11-10 14:14:50 +0800546 if (!ret) \
547 policy->user_policy.object = temp; \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 \
549 return ret ? ret : count; \
550}
551
Dave Jones29464f22009-01-18 01:37:11 -0500552store_one(scaling_min_freq, min);
553store_one(scaling_max_freq, max);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554
555/**
556 * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
557 */
Dave Jones905d77c2008-03-05 14:28:32 -0500558static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
559 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560{
Viresh Kumard92d50a2015-01-02 12:34:29 +0530561 unsigned int cur_freq = __cpufreq_get(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 if (!cur_freq)
563 return sprintf(buf, "<unknown>");
564 return sprintf(buf, "%u\n", cur_freq);
565}
566
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567/**
568 * show_scaling_governor - show the current policy for the specified CPU
569 */
Dave Jones905d77c2008-03-05 14:28:32 -0500570static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571{
Dave Jones29464f22009-01-18 01:37:11 -0500572 if (policy->policy == CPUFREQ_POLICY_POWERSAVE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 return sprintf(buf, "powersave\n");
574 else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE)
575 return sprintf(buf, "performance\n");
576 else if (policy->governor)
viresh kumar4b972f02012-10-23 01:23:43 +0200577 return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n",
Dave Jones29464f22009-01-18 01:37:11 -0500578 policy->governor->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 return -EINVAL;
580}
581
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582/**
583 * store_scaling_governor - store policy for the specified CPU
584 */
Dave Jones905d77c2008-03-05 14:28:32 -0500585static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
586 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587{
Srivatsa S. Bhat5136fa52013-09-07 01:24:06 +0530588 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 char str_governor[16];
590 struct cpufreq_policy new_policy;
591
592 ret = cpufreq_get_policy(&new_policy, policy->cpu);
593 if (ret)
594 return ret;
595
Dave Jones29464f22009-01-18 01:37:11 -0500596 ret = sscanf(buf, "%15s", str_governor);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597 if (ret != 1)
598 return -EINVAL;
599
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530600 if (cpufreq_parse_governor(str_governor, &new_policy.policy,
601 &new_policy.governor))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 return -EINVAL;
603
Viresh Kumar037ce832013-10-02 14:13:16 +0530604 ret = cpufreq_set_policy(policy, &new_policy);
Thomas Renninger7970e082006-04-13 15:14:04 +0200605
606 policy->user_policy.policy = policy->policy;
607 policy->user_policy.governor = policy->governor;
Thomas Renninger7970e082006-04-13 15:14:04 +0200608
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530609 if (ret)
610 return ret;
611 else
612 return count;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613}
614
615/**
616 * show_scaling_driver - show the cpufreq driver currently loaded
617 */
Dave Jones905d77c2008-03-05 14:28:32 -0500618static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619{
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200620 return scnprintf(buf, CPUFREQ_NAME_PLEN, "%s\n", cpufreq_driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621}
622
623/**
624 * show_scaling_available_governors - show the available CPUfreq governors
625 */
Dave Jones905d77c2008-03-05 14:28:32 -0500626static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
627 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628{
629 ssize_t i = 0;
630 struct cpufreq_governor *t;
631
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530632 if (!has_target()) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 i += sprintf(buf, "performance powersave");
634 goto out;
635 }
636
637 list_for_each_entry(t, &cpufreq_governor_list, governor_list) {
Dave Jones29464f22009-01-18 01:37:11 -0500638 if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
639 - (CPUFREQ_NAME_LEN + 2)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 goto out;
viresh kumar4b972f02012-10-23 01:23:43 +0200641 i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700642 }
Dave Jones7d5e3502006-02-02 17:03:42 -0500643out:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644 i += sprintf(&buf[i], "\n");
645 return i;
646}
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700647
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800648ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649{
650 ssize_t i = 0;
651 unsigned int cpu;
652
Rusty Russell835481d2009-01-04 05:18:06 -0800653 for_each_cpu(cpu, mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654 if (i)
655 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), " ");
656 i += scnprintf(&buf[i], (PAGE_SIZE - i - 2), "%u", cpu);
657 if (i >= (PAGE_SIZE - 5))
Dave Jones29464f22009-01-18 01:37:11 -0500658 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700659 }
660 i += sprintf(&buf[i], "\n");
661 return i;
662}
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800663EXPORT_SYMBOL_GPL(cpufreq_show_cpus);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700665/**
666 * show_related_cpus - show the CPUs affected by each transition even if
667 * hw coordination is in use
668 */
669static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf)
670{
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800671 return cpufreq_show_cpus(policy->related_cpus, buf);
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700672}
673
674/**
675 * show_affected_cpus - show the CPUs affected by each transition
676 */
677static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf)
678{
Lan Tianyuf4fd3792013-06-27 15:08:54 +0800679 return cpufreq_show_cpus(policy->cpus, buf);
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700680}
681
Venki Pallipadi9e769882007-10-26 10:18:21 -0700682static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy,
Dave Jones905d77c2008-03-05 14:28:32 -0500683 const char *buf, size_t count)
Venki Pallipadi9e769882007-10-26 10:18:21 -0700684{
685 unsigned int freq = 0;
686 unsigned int ret;
687
CHIKAMA masaki879000f2008-06-05 22:46:33 -0700688 if (!policy->governor || !policy->governor->store_setspeed)
Venki Pallipadi9e769882007-10-26 10:18:21 -0700689 return -EINVAL;
690
691 ret = sscanf(buf, "%u", &freq);
692 if (ret != 1)
693 return -EINVAL;
694
695 policy->governor->store_setspeed(policy, freq);
696
697 return count;
698}
699
700static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
701{
CHIKAMA masaki879000f2008-06-05 22:46:33 -0700702 if (!policy->governor || !policy->governor->show_setspeed)
Venki Pallipadi9e769882007-10-26 10:18:21 -0700703 return sprintf(buf, "<unsupported>\n");
704
705 return policy->governor->show_setspeed(policy, buf);
706}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707
Thomas Renningere2f74f32009-11-19 12:31:01 +0100708/**
viresh kumar8bf1ac722012-10-23 01:23:33 +0200709 * show_bios_limit - show the current cpufreq HW/BIOS limitation
Thomas Renningere2f74f32009-11-19 12:31:01 +0100710 */
711static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)
712{
713 unsigned int limit;
714 int ret;
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200715 if (cpufreq_driver->bios_limit) {
716 ret = cpufreq_driver->bios_limit(policy->cpu, &limit);
Thomas Renningere2f74f32009-11-19 12:31:01 +0100717 if (!ret)
718 return sprintf(buf, "%u\n", limit);
719 }
720 return sprintf(buf, "%u\n", policy->cpuinfo.max_freq);
721}
722
Borislav Petkov6dad2a22010-03-31 21:56:46 +0200723cpufreq_freq_attr_ro_perm(cpuinfo_cur_freq, 0400);
724cpufreq_freq_attr_ro(cpuinfo_min_freq);
725cpufreq_freq_attr_ro(cpuinfo_max_freq);
726cpufreq_freq_attr_ro(cpuinfo_transition_latency);
727cpufreq_freq_attr_ro(scaling_available_governors);
728cpufreq_freq_attr_ro(scaling_driver);
729cpufreq_freq_attr_ro(scaling_cur_freq);
730cpufreq_freq_attr_ro(bios_limit);
731cpufreq_freq_attr_ro(related_cpus);
732cpufreq_freq_attr_ro(affected_cpus);
733cpufreq_freq_attr_rw(scaling_min_freq);
734cpufreq_freq_attr_rw(scaling_max_freq);
735cpufreq_freq_attr_rw(scaling_governor);
736cpufreq_freq_attr_rw(scaling_setspeed);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737
Dave Jones905d77c2008-03-05 14:28:32 -0500738static struct attribute *default_attrs[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 &cpuinfo_min_freq.attr,
740 &cpuinfo_max_freq.attr,
Thomas Renningered129782009-02-04 01:17:41 +0100741 &cpuinfo_transition_latency.attr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 &scaling_min_freq.attr,
743 &scaling_max_freq.attr,
744 &affected_cpus.attr,
Darrick J. Wonge8628dd2008-04-18 13:31:12 -0700745 &related_cpus.attr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746 &scaling_governor.attr,
747 &scaling_driver.attr,
748 &scaling_available_governors.attr,
Venki Pallipadi9e769882007-10-26 10:18:21 -0700749 &scaling_setspeed.attr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750 NULL
751};
752
Dave Jones29464f22009-01-18 01:37:11 -0500753#define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
754#define to_attr(a) container_of(a, struct freq_attr, attr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755
Dave Jones29464f22009-01-18 01:37:11 -0500756static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757{
Dave Jones905d77c2008-03-05 14:28:32 -0500758 struct cpufreq_policy *policy = to_policy(kobj);
759 struct freq_attr *fattr = to_attr(attr);
Viresh Kumar1b750e32013-10-02 14:13:09 +0530760 ssize_t ret;
Viresh Kumar6eed9402013-08-06 22:53:11 +0530761
762 if (!down_read_trylock(&cpufreq_rwsem))
Viresh Kumar1b750e32013-10-02 14:13:09 +0530763 return -EINVAL;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800764
viresh kumarad7722d2013-10-18 19:10:15 +0530765 down_read(&policy->rwsem);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800766
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530767 if (fattr->show)
768 ret = fattr->show(policy, buf);
769 else
770 ret = -EIO;
771
viresh kumarad7722d2013-10-18 19:10:15 +0530772 up_read(&policy->rwsem);
Viresh Kumar6eed9402013-08-06 22:53:11 +0530773 up_read(&cpufreq_rwsem);
Viresh Kumar1b750e32013-10-02 14:13:09 +0530774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 return ret;
776}
777
Dave Jones905d77c2008-03-05 14:28:32 -0500778static ssize_t store(struct kobject *kobj, struct attribute *attr,
779 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780{
Dave Jones905d77c2008-03-05 14:28:32 -0500781 struct cpufreq_policy *policy = to_policy(kobj);
782 struct freq_attr *fattr = to_attr(attr);
Dave Jonesa07530b2008-03-05 14:22:25 -0500783 ssize_t ret = -EINVAL;
Viresh Kumar6eed9402013-08-06 22:53:11 +0530784
Srivatsa S. Bhat4f750c92013-09-07 01:23:43 +0530785 get_online_cpus();
786
787 if (!cpu_online(policy->cpu))
788 goto unlock;
789
Viresh Kumar6eed9402013-08-06 22:53:11 +0530790 if (!down_read_trylock(&cpufreq_rwsem))
Srivatsa S. Bhat4f750c92013-09-07 01:23:43 +0530791 goto unlock;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800792
viresh kumarad7722d2013-10-18 19:10:15 +0530793 down_write(&policy->rwsem);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -0800794
Gautham R Shenoye08f5f52006-10-26 16:20:58 +0530795 if (fattr->store)
796 ret = fattr->store(policy, buf, count);
797 else
798 ret = -EIO;
799
viresh kumarad7722d2013-10-18 19:10:15 +0530800 up_write(&policy->rwsem);
Viresh Kumar6eed9402013-08-06 22:53:11 +0530801
Viresh Kumar6eed9402013-08-06 22:53:11 +0530802 up_read(&cpufreq_rwsem);
Srivatsa S. Bhat4f750c92013-09-07 01:23:43 +0530803unlock:
804 put_online_cpus();
805
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 return ret;
807}
808
Dave Jones905d77c2008-03-05 14:28:32 -0500809static void cpufreq_sysfs_release(struct kobject *kobj)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810{
Dave Jones905d77c2008-03-05 14:28:32 -0500811 struct cpufreq_policy *policy = to_policy(kobj);
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200812 pr_debug("last reference is dropped\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 complete(&policy->kobj_unregister);
814}
815
Emese Revfy52cf25d2010-01-19 02:58:23 +0100816static const struct sysfs_ops sysfs_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817 .show = show,
818 .store = store,
819};
820
821static struct kobj_type ktype_cpufreq = {
822 .sysfs_ops = &sysfs_ops,
823 .default_attrs = default_attrs,
824 .release = cpufreq_sysfs_release,
825};
826
Viresh Kumar2361be22013-05-17 16:09:09 +0530827struct kobject *cpufreq_global_kobject;
828EXPORT_SYMBOL(cpufreq_global_kobject);
829
830static int cpufreq_global_kobject_usage;
831
832int cpufreq_get_global_kobject(void)
833{
834 if (!cpufreq_global_kobject_usage++)
835 return kobject_add(cpufreq_global_kobject,
836 &cpu_subsys.dev_root->kobj, "%s", "cpufreq");
837
838 return 0;
839}
840EXPORT_SYMBOL(cpufreq_get_global_kobject);
841
842void cpufreq_put_global_kobject(void)
843{
844 if (!--cpufreq_global_kobject_usage)
845 kobject_del(cpufreq_global_kobject);
846}
847EXPORT_SYMBOL(cpufreq_put_global_kobject);
848
849int cpufreq_sysfs_create_file(const struct attribute *attr)
850{
851 int ret = cpufreq_get_global_kobject();
852
853 if (!ret) {
854 ret = sysfs_create_file(cpufreq_global_kobject, attr);
855 if (ret)
856 cpufreq_put_global_kobject();
857 }
858
859 return ret;
860}
861EXPORT_SYMBOL(cpufreq_sysfs_create_file);
862
863void cpufreq_sysfs_remove_file(const struct attribute *attr)
864{
865 sysfs_remove_file(cpufreq_global_kobject, attr);
866 cpufreq_put_global_kobject();
867}
868EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
869
Dave Jones19d6f7e2009-07-08 17:35:39 -0400870/* symlink affected CPUs */
Viresh Kumar308b60e2013-07-31 14:35:14 +0200871static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy)
Dave Jones19d6f7e2009-07-08 17:35:39 -0400872{
873 unsigned int j;
874 int ret = 0;
875
876 for_each_cpu(j, policy->cpus) {
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800877 struct device *cpu_dev;
Dave Jones19d6f7e2009-07-08 17:35:39 -0400878
Viresh Kumar308b60e2013-07-31 14:35:14 +0200879 if (j == policy->cpu)
Dave Jones19d6f7e2009-07-08 17:35:39 -0400880 continue;
Dave Jones19d6f7e2009-07-08 17:35:39 -0400881
Viresh Kumare8fdde12013-07-31 14:31:33 +0200882 pr_debug("Adding link for CPU: %u\n", j);
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800883 cpu_dev = get_cpu_device(j);
884 ret = sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
Dave Jones19d6f7e2009-07-08 17:35:39 -0400885 "cpufreq");
Rafael J. Wysocki71c34612013-08-04 01:19:34 +0200886 if (ret)
887 break;
Dave Jones19d6f7e2009-07-08 17:35:39 -0400888 }
889 return ret;
890}
891
Viresh Kumar308b60e2013-07-31 14:35:14 +0200892static int cpufreq_add_dev_interface(struct cpufreq_policy *policy,
Kay Sievers8a25a2f2011-12-21 14:29:42 -0800893 struct device *dev)
Dave Jones909a6942009-07-08 18:05:42 -0400894{
895 struct freq_attr **drv_attr;
Dave Jones909a6942009-07-08 18:05:42 -0400896 int ret = 0;
Dave Jones909a6942009-07-08 18:05:42 -0400897
Dave Jones909a6942009-07-08 18:05:42 -0400898 /* set up files for this cpu device */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200899 drv_attr = cpufreq_driver->attr;
Viresh Kumarf13f1182015-01-02 12:34:23 +0530900 while (drv_attr && *drv_attr) {
Dave Jones909a6942009-07-08 18:05:42 -0400901 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
902 if (ret)
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +0100903 return ret;
Dave Jones909a6942009-07-08 18:05:42 -0400904 drv_attr++;
905 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200906 if (cpufreq_driver->get) {
Dave Jones909a6942009-07-08 18:05:42 -0400907 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
908 if (ret)
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +0100909 return ret;
Dave Jones909a6942009-07-08 18:05:42 -0400910 }
Dirk Brandewiec034b022014-10-13 08:37:40 -0700911
912 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
913 if (ret)
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +0100914 return ret;
Dirk Brandewiec034b022014-10-13 08:37:40 -0700915
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200916 if (cpufreq_driver->bios_limit) {
Thomas Renningere2f74f32009-11-19 12:31:01 +0100917 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr);
918 if (ret)
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +0100919 return ret;
Thomas Renningere2f74f32009-11-19 12:31:01 +0100920 }
Dave Jones909a6942009-07-08 18:05:42 -0400921
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +0100922 return cpufreq_add_dev_symlink(policy);
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +0530923}
924
925static void cpufreq_init_policy(struct cpufreq_policy *policy)
926{
viresh kumar6e2c89d2014-03-04 11:43:59 +0800927 struct cpufreq_governor *gov = NULL;
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +0530928 struct cpufreq_policy new_policy;
929 int ret = 0;
930
Viresh Kumard5b73cd2013-08-06 22:53:06 +0530931 memcpy(&new_policy, policy, sizeof(*policy));
Jason Barona27a9ab2013-12-19 22:50:50 +0000932
viresh kumar6e2c89d2014-03-04 11:43:59 +0800933 /* Update governor of new_policy to the governor used before hotplug */
Viresh Kumar42f91fa2015-01-02 12:34:26 +0530934 gov = find_governor(per_cpu(cpufreq_cpu_governor, policy->cpu));
viresh kumar6e2c89d2014-03-04 11:43:59 +0800935 if (gov)
936 pr_debug("Restoring governor %s for cpu %d\n",
937 policy->governor->name, policy->cpu);
938 else
939 gov = CPUFREQ_DEFAULT_GOVERNOR;
940
941 new_policy.governor = gov;
942
Jason Barona27a9ab2013-12-19 22:50:50 +0000943 /* Use the default policy if its valid. */
944 if (cpufreq_driver->setpolicy)
viresh kumar6e2c89d2014-03-04 11:43:59 +0800945 cpufreq_parse_governor(gov->name, &new_policy.policy, NULL);
Dave Jonesecf7e462009-07-08 18:48:47 -0400946
947 /* set default policy */
Viresh Kumar037ce832013-10-02 14:13:16 +0530948 ret = cpufreq_set_policy(policy, &new_policy);
Dave Jonesecf7e462009-07-08 18:48:47 -0400949 if (ret) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +0200950 pr_debug("setting policy failed\n");
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +0200951 if (cpufreq_driver->exit)
952 cpufreq_driver->exit(policy);
Dave Jonesecf7e462009-07-08 18:48:47 -0400953 }
Dave Jones909a6942009-07-08 18:05:42 -0400954}
955
Viresh Kumard8d3b472013-08-04 01:20:07 +0200956static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy,
Viresh Kumar42f921a2013-12-20 21:26:02 +0530957 unsigned int cpu, struct device *dev)
Viresh Kumarfcf80582013-01-29 14:39:08 +0000958{
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530959 int ret = 0;
Viresh Kumarfcf80582013-01-29 14:39:08 +0000960 unsigned long flags;
961
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530962 if (has_target()) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +0530963 ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
964 if (ret) {
965 pr_err("%s: Failed to stop governor\n", __func__);
966 return ret;
967 }
968 }
Viresh Kumarfcf80582013-01-29 14:39:08 +0000969
viresh kumarad7722d2013-10-18 19:10:15 +0530970 down_write(&policy->rwsem);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +0530971
Nathan Zimmer0d1857a2013-02-22 16:24:34 +0000972 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +0530973
Viresh Kumarfcf80582013-01-29 14:39:08 +0000974 cpumask_set_cpu(cpu, policy->cpus);
975 per_cpu(cpufreq_cpu_data, cpu) = policy;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +0000976 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumarfcf80582013-01-29 14:39:08 +0000977
viresh kumarad7722d2013-10-18 19:10:15 +0530978 up_write(&policy->rwsem);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +0530979
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +0530980 if (has_target()) {
Stratos Karafotise5c87b72014-03-19 23:29:17 +0200981 ret = __cpufreq_governor(policy, CPUFREQ_GOV_START);
982 if (!ret)
983 ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
984
985 if (ret) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +0530986 pr_err("%s: Failed to start governor\n", __func__);
987 return ret;
988 }
Viresh Kumar820c6ca2013-04-22 00:48:03 +0200989 }
Viresh Kumarfcf80582013-01-29 14:39:08 +0000990
Viresh Kumar42f921a2013-12-20 21:26:02 +0530991 return sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
Viresh Kumarfcf80582013-01-29 14:39:08 +0000992}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993
Srivatsa S. Bhat84148092013-07-30 04:25:10 +0530994static struct cpufreq_policy *cpufreq_policy_restore(unsigned int cpu)
995{
996 struct cpufreq_policy *policy;
997 unsigned long flags;
998
Lan Tianyu44871c92013-09-11 15:05:05 +0800999 read_lock_irqsave(&cpufreq_driver_lock, flags);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301000
1001 policy = per_cpu(cpufreq_cpu_data_fallback, cpu);
1002
Lan Tianyu44871c92013-09-11 15:05:05 +08001003 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301004
Geert Uytterhoeven09712f52014-11-04 17:05:25 +01001005 if (policy)
1006 policy->governor = NULL;
viresh kumar6e2c89d2014-03-04 11:43:59 +08001007
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301008 return policy;
1009}
1010
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +05301011static struct cpufreq_policy *cpufreq_policy_alloc(void)
1012{
1013 struct cpufreq_policy *policy;
1014
1015 policy = kzalloc(sizeof(*policy), GFP_KERNEL);
1016 if (!policy)
1017 return NULL;
1018
1019 if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
1020 goto err_free_policy;
1021
1022 if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
1023 goto err_free_cpumask;
1024
Lukasz Majewskic88a1f82013-08-06 22:53:08 +05301025 INIT_LIST_HEAD(&policy->policy_list);
viresh kumarad7722d2013-10-18 19:10:15 +05301026 init_rwsem(&policy->rwsem);
Srivatsa S. Bhat12478cf2014-03-24 13:35:44 +05301027 spin_lock_init(&policy->transition_lock);
1028 init_waitqueue_head(&policy->transition_wait);
viresh kumarad7722d2013-10-18 19:10:15 +05301029
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +05301030 return policy;
1031
1032err_free_cpumask:
1033 free_cpumask_var(policy->cpus);
1034err_free_policy:
1035 kfree(policy);
1036
1037 return NULL;
1038}
1039
Viresh Kumar42f921a2013-12-20 21:26:02 +05301040static void cpufreq_policy_put_kobj(struct cpufreq_policy *policy)
1041{
1042 struct kobject *kobj;
1043 struct completion *cmp;
1044
Viresh Kumarfcd7af92014-01-07 07:10:10 +05301045 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1046 CPUFREQ_REMOVE_POLICY, policy);
1047
Viresh Kumar42f921a2013-12-20 21:26:02 +05301048 down_read(&policy->rwsem);
1049 kobj = &policy->kobj;
1050 cmp = &policy->kobj_unregister;
1051 up_read(&policy->rwsem);
1052 kobject_put(kobj);
1053
1054 /*
1055 * We need to make sure that the underlying kobj is
1056 * actually not referenced anymore by anybody before we
1057 * proceed with unloading.
1058 */
1059 pr_debug("waiting for dropping of refcount\n");
1060 wait_for_completion(cmp);
1061 pr_debug("wait complete\n");
1062}
1063
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +05301064static void cpufreq_policy_free(struct cpufreq_policy *policy)
1065{
1066 free_cpumask_var(policy->related_cpus);
1067 free_cpumask_var(policy->cpus);
1068 kfree(policy);
1069}
1070
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301071static int update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu,
1072 struct device *cpu_dev)
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301073{
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301074 int ret;
1075
Srivatsa S. Bhat99ec8992013-09-12 17:29:09 +05301076 if (WARN_ON(cpu == policy->cpu))
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301077 return 0;
1078
1079 /* Move kobject to the new policy->cpu */
1080 ret = kobject_move(&policy->kobj, &cpu_dev->kobj);
1081 if (ret) {
1082 pr_err("%s: Failed to move kobj: %d\n", __func__, ret);
1083 return ret;
1084 }
Srivatsa S. Bhatcb38ed52013-09-12 01:43:42 +05301085
viresh kumarad7722d2013-10-18 19:10:15 +05301086 down_write(&policy->rwsem);
Viresh Kumar8efd5762013-09-17 10:22:11 +05301087
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301088 policy->last_cpu = policy->cpu;
1089 policy->cpu = cpu;
1090
viresh kumarad7722d2013-10-18 19:10:15 +05301091 up_write(&policy->rwsem);
Viresh Kumar8efd5762013-09-17 10:22:11 +05301092
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301093 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1094 CPUFREQ_UPDATE_POLICY_CPU, policy);
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301095
1096 return 0;
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301097}
1098
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301099static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100{
Viresh Kumarfcf80582013-01-29 14:39:08 +00001101 unsigned int j, cpu = dev->id;
Viresh Kumar65922462013-02-07 10:56:03 +05301102 int ret = -ENOMEM;
Viresh Kumar7f0c0202015-01-02 12:34:32 +05301103 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 unsigned long flags;
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301105 bool recover_policy = cpufreq_suspended;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106
Ashok Rajc32b6b82005-10-30 14:59:54 -08001107 if (cpu_is_offline(cpu))
1108 return 0;
1109
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001110 pr_debug("adding CPU %u\n", cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 /* check whether a different CPU already registered this
1113 * CPU because it is in the same boat. */
Viresh Kumard7a97712015-01-02 12:34:33 +05301114 policy = cpufreq_cpu_get_raw(cpu);
1115 if (unlikely(policy))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 return 0;
Viresh Kumarfcf80582013-01-29 14:39:08 +00001117
Viresh Kumar6eed9402013-08-06 22:53:11 +05301118 if (!down_read_trylock(&cpufreq_rwsem))
1119 return 0;
1120
Viresh Kumarfcf80582013-01-29 14:39:08 +00001121 /* Check if this cpu was hot-unplugged earlier and has siblings */
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001122 read_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar7f0c0202015-01-02 12:34:32 +05301123 list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
1124 if (cpumask_test_cpu(cpu, policy->related_cpus)) {
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001125 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumar7f0c0202015-01-02 12:34:32 +05301126 ret = cpufreq_add_policy_cpu(policy, cpu, dev);
Viresh Kumar6eed9402013-08-06 22:53:11 +05301127 up_read(&cpufreq_rwsem);
1128 return ret;
Viresh Kumar2eaa3e22013-02-07 10:55:00 +05301129 }
Viresh Kumarfcf80582013-01-29 14:39:08 +00001130 }
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001131 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132
Rafael J. Wysocki72368d12013-12-27 01:07:11 +01001133 /*
1134 * Restore the saved policy when doing light-weight init and fall back
1135 * to the full init if that fails.
1136 */
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301137 policy = recover_policy ? cpufreq_policy_restore(cpu) : NULL;
Rafael J. Wysocki72368d12013-12-27 01:07:11 +01001138 if (!policy) {
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301139 recover_policy = false;
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301140 policy = cpufreq_policy_alloc();
Rafael J. Wysocki72368d12013-12-27 01:07:11 +01001141 if (!policy)
1142 goto nomem_out;
1143 }
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301144
1145 /*
1146 * In the resume path, since we restore a saved policy, the assignment
1147 * to policy->cpu is like an update of the existing policy, rather than
1148 * the creation of a brand new one. So we need to perform this update
1149 * by invoking update_policy_cpu().
1150 */
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301151 if (recover_policy && cpu != policy->cpu)
1152 WARN_ON(update_policy_cpu(policy, cpu, dev));
1153 else
Srivatsa S. Bhat0d66b912013-09-12 01:42:59 +05301154 policy->cpu = cpu;
1155
Rusty Russell835481d2009-01-04 05:18:06 -08001156 cpumask_copy(policy->cpus, cpumask_of(cpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 init_completion(&policy->kobj_unregister);
David Howells65f27f32006-11-22 14:55:48 +00001159 INIT_WORK(&policy->update, handle_update);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160
1161 /* call driver. From then on the cpufreq must be able
1162 * to accept all calls to ->verify and ->setpolicy for this CPU
1163 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001164 ret = cpufreq_driver->init(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 if (ret) {
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001166 pr_debug("initialization failed\n");
Viresh Kumar2eaa3e22013-02-07 10:55:00 +05301167 goto err_set_policy_cpu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 }
Viresh Kumar643ae6e2013-01-12 05:14:38 +00001169
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +01001170 down_write(&policy->rwsem);
1171
Viresh Kumar5a7e56a2014-03-04 11:44:00 +08001172 /* related cpus should atleast have policy->cpus */
1173 cpumask_or(policy->related_cpus, policy->related_cpus, policy->cpus);
1174
1175 /*
1176 * affected cpus must always be the one, which are online. We aren't
1177 * managing offline cpus here.
1178 */
1179 cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);
1180
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301181 if (!recover_policy) {
Viresh Kumar5a7e56a2014-03-04 11:44:00 +08001182 policy->user_policy.min = policy->min;
1183 policy->user_policy.max = policy->max;
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +01001184
1185 /* prepare interface data */
1186 ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
1187 &dev->kobj, "cpufreq");
1188 if (ret) {
1189 pr_err("%s: failed to init policy->kobj: %d\n",
1190 __func__, ret);
1191 goto err_init_policy_kobj;
1192 }
Viresh Kumar5a7e56a2014-03-04 11:44:00 +08001193 }
1194
Viresh Kumar652ed952014-01-09 20:38:43 +05301195 write_lock_irqsave(&cpufreq_driver_lock, flags);
1196 for_each_cpu(j, policy->cpus)
1197 per_cpu(cpufreq_cpu_data, j) = policy;
1198 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1199
Rafael J. Wysocki2ed99e32014-03-12 21:49:33 +01001200 if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
Viresh Kumarda60ce92013-10-03 20:28:30 +05301201 policy->cur = cpufreq_driver->get(policy->cpu);
1202 if (!policy->cur) {
1203 pr_err("%s: ->get() failed\n", __func__);
1204 goto err_get_freq;
1205 }
1206 }
1207
Viresh Kumard3916692013-12-03 11:20:46 +05301208 /*
1209 * Sometimes boot loaders set CPU frequency to a value outside of
1210 * frequency table present with cpufreq core. In such cases CPU might be
1211 * unstable if it has to run on that frequency for long duration of time
1212 * and so its better to set it to a frequency which is specified in
1213 * freq-table. This also makes cpufreq stats inconsistent as
1214 * cpufreq-stats would fail to register because current frequency of CPU
1215 * isn't found in freq-table.
1216 *
1217 * Because we don't want this change to effect boot process badly, we go
1218 * for the next freq which is >= policy->cur ('cur' must be set by now,
1219 * otherwise we will end up setting freq to lowest of the table as 'cur'
1220 * is initialized to zero).
1221 *
1222 * We are passing target-freq as "policy->cur - 1" otherwise
1223 * __cpufreq_driver_target() would simply fail, as policy->cur will be
1224 * equal to target-freq.
1225 */
1226 if ((cpufreq_driver->flags & CPUFREQ_NEED_INITIAL_FREQ_CHECK)
1227 && has_target()) {
1228 /* Are we running at unknown frequency ? */
1229 ret = cpufreq_frequency_table_get_index(policy, policy->cur);
1230 if (ret == -EINVAL) {
1231 /* Warn user and fix it */
1232 pr_warn("%s: CPU%d: Running at unlisted freq: %u KHz\n",
1233 __func__, policy->cpu, policy->cur);
1234 ret = __cpufreq_driver_target(policy, policy->cur - 1,
1235 CPUFREQ_RELATION_L);
1236
1237 /*
1238 * Reaching here after boot in a few seconds may not
1239 * mean that system will remain stable at "unknown"
1240 * frequency for longer duration. Hence, a BUG_ON().
1241 */
1242 BUG_ON(ret);
1243 pr_warn("%s: CPU%d: Unlisted initial frequency changed to: %u KHz\n",
1244 __func__, policy->cpu, policy->cur);
1245 }
1246 }
1247
Thomas Renningera1531ac2008-07-29 22:32:58 -07001248 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1249 CPUFREQ_START, policy);
1250
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301251 if (!recover_policy) {
Viresh Kumar308b60e2013-07-31 14:35:14 +02001252 ret = cpufreq_add_dev_interface(policy, dev);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301253 if (ret)
1254 goto err_out_unregister;
Viresh Kumarfcd7af92014-01-07 07:10:10 +05301255 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
1256 CPUFREQ_CREATE_POLICY, policy);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301257 }
Dave Jones8ff69732006-03-05 03:37:23 -05001258
Viresh Kumar9515f4d2013-08-20 12:08:23 +05301259 write_lock_irqsave(&cpufreq_driver_lock, flags);
1260 list_add(&policy->policy_list, &cpufreq_policy_list);
1261 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1262
Srivatsa S. Bhate18f1682013-07-30 04:24:23 +05301263 cpufreq_init_policy(policy);
1264
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301265 if (!recover_policy) {
Viresh Kumar08fd8c1c2013-12-24 07:11:01 +05301266 policy->user_policy.policy = policy->policy;
1267 policy->user_policy.governor = policy->governor;
1268 }
Viresh Kumar4e97b632014-03-04 11:44:01 +08001269 up_write(&policy->rwsem);
Viresh Kumar08fd8c1c2013-12-24 07:11:01 +05301270
Greg Kroah-Hartman038c5b32007-12-17 15:54:39 -04001271 kobject_uevent(&policy->kobj, KOBJ_ADD);
Viresh Kumar7c45cf32014-11-27 06:07:51 +05301272
Viresh Kumar6eed9402013-08-06 22:53:11 +05301273 up_read(&cpufreq_rwsem);
1274
Viresh Kumar7c45cf32014-11-27 06:07:51 +05301275 /* Callback for handling stuff after policy is ready */
1276 if (cpufreq_driver->ready)
1277 cpufreq_driver->ready(policy);
1278
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001279 pr_debug("initialization complete\n");
Dave Jones87c32272006-03-29 01:48:37 -05001280
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 return 0;
1282
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283err_out_unregister:
Viresh Kumar652ed952014-01-09 20:38:43 +05301284err_get_freq:
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001285 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar474deff2013-08-20 12:08:25 +05301286 for_each_cpu(j, policy->cpus)
Mike Travis7a6aedf2008-03-25 15:06:53 -07001287 per_cpu(cpufreq_cpu_data, j) = NULL;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001288 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289
Tomeu Vizoso6d4e81e2014-11-24 10:08:03 +01001290 if (!recover_policy) {
1291 kobject_put(&policy->kobj);
1292 wait_for_completion(&policy->kobj_unregister);
1293 }
1294err_init_policy_kobj:
Prarit Bhargava7106e022014-09-10 10:12:08 -04001295 up_write(&policy->rwsem);
1296
Viresh Kumarda60ce92013-10-03 20:28:30 +05301297 if (cpufreq_driver->exit)
1298 cpufreq_driver->exit(policy);
Viresh Kumar2eaa3e22013-02-07 10:55:00 +05301299err_set_policy_cpu:
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301300 if (recover_policy) {
Rafael J. Wysocki72368d12013-12-27 01:07:11 +01001301 /* Do not leave stale fallback data behind. */
1302 per_cpu(cpufreq_cpu_data_fallback, cpu) = NULL;
Viresh Kumar42f921a2013-12-20 21:26:02 +05301303 cpufreq_policy_put_kobj(policy);
Rafael J. Wysocki72368d12013-12-27 01:07:11 +01001304 }
Srivatsa S. Bhate9698cc2013-07-30 04:24:11 +05301305 cpufreq_policy_free(policy);
Viresh Kumar42f921a2013-12-20 21:26:02 +05301306
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307nomem_out:
Viresh Kumar6eed9402013-08-06 22:53:11 +05301308 up_read(&cpufreq_rwsem);
1309
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310 return ret;
1311}
1312
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301313/**
1314 * cpufreq_add_dev - add a CPU device
1315 *
1316 * Adds the cpufreq interface for a CPU device.
1317 *
1318 * The Oracle says: try running cpufreq registration/unregistration concurrently
1319 * with with cpu hotplugging and all hell will break loose. Tried to clean this
1320 * mess up, but more thorough testing is needed. - Mathieu
1321 */
1322static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
1323{
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301324 return __cpufreq_add_dev(dev, sif);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301325}
1326
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301327static int __cpufreq_remove_dev_prepare(struct device *dev,
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301328 struct subsys_interface *sif)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329{
Srivatsa S. Bhatf9ba6802013-07-30 04:24:36 +05301330 unsigned int cpu = dev->id, cpus;
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301331 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332 unsigned long flags;
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301333 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001335 pr_debug("%s: unregistering CPU %u\n", __func__, cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001336
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001337 write_lock_irqsave(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301339 policy = per_cpu(cpufreq_cpu_data, cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301341 /* Save the policy somewhere when doing a light-weight tear-down */
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301342 if (cpufreq_suspended)
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301343 per_cpu(cpufreq_cpu_data_fallback, cpu) = policy;
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301344
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00001345 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301347 if (!policy) {
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001348 pr_debug("%s: No cpu_data found\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301352 if (has_target()) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301353 ret = __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
1354 if (ret) {
1355 pr_err("%s: Failed to stop governor\n", __func__);
1356 return ret;
1357 }
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001358
Dirk Brandewiefa69e332013-02-06 09:02:11 -08001359 strncpy(per_cpu(cpufreq_cpu_governor, cpu),
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301360 policy->governor->name, CPUFREQ_NAME_LEN);
Viresh Kumardb5f2992015-01-02 12:34:25 +05301361 }
Jacob Shin27ecddc2011-04-27 13:32:11 -05001362
viresh kumarad7722d2013-10-18 19:10:15 +05301363 down_read(&policy->rwsem);
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301364 cpus = cpumask_weight(policy->cpus);
viresh kumarad7722d2013-10-18 19:10:15 +05301365 up_read(&policy->rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366
Srivatsa S. Bhat61173f22013-09-12 01:43:25 +05301367 if (cpu != policy->cpu) {
viresh kumar6964d912014-02-17 14:52:11 +05301368 sysfs_remove_link(&dev->kobj, "cpufreq");
Viresh Kumar73bf0fc2013-02-05 22:21:14 +01001369 } else if (cpus > 1) {
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301370 /* Nominate new CPU */
1371 int new_cpu = cpumask_any_but(policy->cpus, cpu);
1372 struct device *cpu_dev = get_cpu_device(new_cpu);
Srivatsa S. Bhata82fab22013-07-30 04:24:49 +05301373
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301374 sysfs_remove_link(&cpu_dev->kobj, "cpufreq");
1375 ret = update_policy_cpu(policy, new_cpu, cpu_dev);
1376 if (ret) {
1377 if (sysfs_create_link(&cpu_dev->kobj, &policy->kobj,
1378 "cpufreq"))
1379 pr_err("%s: Failed to restore kobj link to cpu:%d\n",
1380 __func__, cpu_dev->id);
1381 return ret;
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001382 }
Viresh Kumar1bfb4252014-07-17 10:48:28 +05301383
1384 if (!cpufreq_suspended)
1385 pr_debug("%s: policy Kobject moved to cpu: %d from: %d\n",
1386 __func__, new_cpu, cpu);
Preeti U Murthy789ca242014-09-29 15:47:12 +02001387 } else if (cpufreq_driver->stop_cpu) {
Dirk Brandewie367dc4a2014-03-19 08:45:53 -07001388 cpufreq_driver->stop_cpu(policy);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001389 }
Venki Pallipadiec282972007-03-26 12:03:19 -07001390
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301391 return 0;
1392}
1393
1394static int __cpufreq_remove_dev_finish(struct device *dev,
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301395 struct subsys_interface *sif)
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301396{
1397 unsigned int cpu = dev->id, cpus;
1398 int ret;
1399 unsigned long flags;
1400 struct cpufreq_policy *policy;
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301401
1402 read_lock_irqsave(&cpufreq_driver_lock, flags);
1403 policy = per_cpu(cpufreq_cpu_data, cpu);
1404 read_unlock_irqrestore(&cpufreq_driver_lock, flags);
1405
1406 if (!policy) {
1407 pr_debug("%s: No cpu_data found\n", __func__);
1408 return -EINVAL;
1409 }
1410
viresh kumarad7722d2013-10-18 19:10:15 +05301411 down_write(&policy->rwsem);
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301412 cpus = cpumask_weight(policy->cpus);
Viresh Kumar9c8f1ee2013-09-12 17:06:33 +05301413
1414 if (cpus > 1)
1415 cpumask_clear_cpu(cpu, policy->cpus);
viresh kumarad7722d2013-10-18 19:10:15 +05301416 up_write(&policy->rwsem);
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301417
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001418 /* If cpu is last user of policy, free policy */
1419 if (cpus == 1) {
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301420 if (has_target()) {
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301421 ret = __cpufreq_governor(policy,
1422 CPUFREQ_GOV_POLICY_EXIT);
1423 if (ret) {
1424 pr_err("%s: Failed to exit governor\n",
Joe Perchese837f9b2014-03-11 10:03:00 -07001425 __func__);
Viresh Kumar3de9bde2013-08-06 22:53:13 +05301426 return ret;
1427 }
Viresh Kumaredab2fb2013-08-20 12:08:22 +05301428 }
Rafael J. Wysocki2a998592013-07-30 00:32:00 +02001429
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301430 if (!cpufreq_suspended)
Viresh Kumar42f921a2013-12-20 21:26:02 +05301431 cpufreq_policy_put_kobj(policy);
Srivatsa S. Bhat84148092013-07-30 04:25:10 +05301432
1433 /*
1434 * Perform the ->exit() even during light-weight tear-down,
1435 * since this is a core component, and is essential for the
1436 * subsequent light-weight ->init() to succeed.
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001437 */
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001438 if (cpufreq_driver->exit)
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301439 cpufreq_driver->exit(policy);
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001440
Viresh Kumar9515f4d2013-08-20 12:08:23 +05301441 /* Remove policy from list of active policies */
1442 write_lock_irqsave(&cpufreq_driver_lock, flags);
1443 list_del(&policy->policy_list);
1444 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1445
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301446 if (!cpufreq_suspended)
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301447 cpufreq_policy_free(policy);
Stratos Karafotise5c87b72014-03-19 23:29:17 +02001448 } else if (has_target()) {
1449 ret = __cpufreq_governor(policy, CPUFREQ_GOV_START);
1450 if (!ret)
1451 ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
1452
1453 if (ret) {
1454 pr_err("%s: Failed to start governor\n", __func__);
1455 return ret;
Rafael J. Wysocki2a998592013-07-30 00:32:00 +02001456 }
Viresh Kumarb8eed8a2013-01-14 13:23:03 +00001457 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458
Viresh Kumar474deff2013-08-20 12:08:25 +05301459 per_cpu(cpufreq_cpu_data, cpu) = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 return 0;
1461}
1462
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301463/**
Viresh Kumar27a862e2013-10-02 14:13:14 +05301464 * cpufreq_remove_dev - remove a CPU device
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301465 *
1466 * Removes the cpufreq interface for a CPU device.
Srivatsa S. Bhatcedb70a2013-09-07 01:23:09 +05301467 */
Kay Sievers8a25a2f2011-12-21 14:29:42 -08001468static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001469{
Kay Sievers8a25a2f2011-12-21 14:29:42 -08001470 unsigned int cpu = dev->id;
Viresh Kumar27a862e2013-10-02 14:13:14 +05301471 int ret;
Venki Pallipadiec282972007-03-26 12:03:19 -07001472
1473 if (cpu_is_offline(cpu))
1474 return 0;
1475
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301476 ret = __cpufreq_remove_dev_prepare(dev, sif);
Viresh Kumar27a862e2013-10-02 14:13:14 +05301477
1478 if (!ret)
Viresh Kumar96bbbe42014-03-10 14:53:35 +05301479 ret = __cpufreq_remove_dev_finish(dev, sif);
Viresh Kumar27a862e2013-10-02 14:13:14 +05301480
1481 return ret;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001482}
1483
David Howells65f27f32006-11-22 14:55:48 +00001484static void handle_update(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485{
David Howells65f27f32006-11-22 14:55:48 +00001486 struct cpufreq_policy *policy =
1487 container_of(work, struct cpufreq_policy, update);
1488 unsigned int cpu = policy->cpu;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02001489 pr_debug("handle_update for cpu %u called\n", cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 cpufreq_update_policy(cpu);
1491}
1492
1493/**
Viresh Kumarbb176f72013-06-19 14:19:33 +05301494 * cpufreq_out_of_sync - If actual and saved CPU frequency differs, we're
1495 * in deep trouble.
Viresh Kumara1e1dc42015-01-02 12:34:28 +05301496 * @policy: policy managing CPUs
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 * @new_freq: CPU frequency the CPU actually runs at
1498 *
Dave Jones29464f22009-01-18 01:37:11 -05001499 * We adjust to current frequency first, and need to clean up later.
1500 * So either call to cpufreq_update_policy() or schedule handle_update()).
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501 */
Viresh Kumara1e1dc42015-01-02 12:34:28 +05301502static void cpufreq_out_of_sync(struct cpufreq_policy *policy,
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301503 unsigned int new_freq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504{
1505 struct cpufreq_freqs freqs;
Viresh Kumarb43a7ff2013-03-24 11:56:43 +05301506
Joe Perchese837f9b2014-03-11 10:03:00 -07001507 pr_debug("Warning: CPU frequency out of sync: cpufreq and timing core thinks of %u, is %u kHz\n",
Viresh Kumara1e1dc42015-01-02 12:34:28 +05301508 policy->cur, new_freq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
Viresh Kumara1e1dc42015-01-02 12:34:28 +05301510 freqs.old = policy->cur;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 freqs.new = new_freq;
Viresh Kumarb43a7ff2013-03-24 11:56:43 +05301512
Viresh Kumar8fec0512014-03-24 13:35:45 +05301513 cpufreq_freq_transition_begin(policy, &freqs);
1514 cpufreq_freq_transition_end(policy, &freqs, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515}
1516
Dave Jones32ee8c32006-02-28 00:43:23 -05001517/**
Dhaval Giani4ab70df2006-12-13 14:49:15 +05301518 * cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001519 * @cpu: CPU number
1520 *
1521 * This is the last known freq, without actually getting it from the driver.
1522 * Return value will be same as what is shown in scaling_cur_freq in sysfs.
1523 */
1524unsigned int cpufreq_quick_get(unsigned int cpu)
1525{
Dirk Brandewie9e21ba82013-02-06 09:02:08 -08001526 struct cpufreq_policy *policy;
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301527 unsigned int ret_freq = 0;
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001528
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001529 if (cpufreq_driver && cpufreq_driver->setpolicy && cpufreq_driver->get)
1530 return cpufreq_driver->get(cpu);
Dirk Brandewie9e21ba82013-02-06 09:02:08 -08001531
1532 policy = cpufreq_cpu_get(cpu);
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001533 if (policy) {
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301534 ret_freq = policy->cur;
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001535 cpufreq_cpu_put(policy);
1536 }
1537
Dave Jones4d34a672008-02-07 16:33:49 -05001538 return ret_freq;
Venkatesh Pallipadi95235ca2005-12-02 10:43:20 -08001539}
1540EXPORT_SYMBOL(cpufreq_quick_get);
1541
Jesse Barnes3d737102011-06-28 10:59:12 -07001542/**
1543 * cpufreq_quick_get_max - get the max reported CPU frequency for this CPU
1544 * @cpu: CPU number
1545 *
1546 * Just return the max possible frequency for a given CPU.
1547 */
1548unsigned int cpufreq_quick_get_max(unsigned int cpu)
1549{
1550 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
1551 unsigned int ret_freq = 0;
1552
1553 if (policy) {
1554 ret_freq = policy->max;
1555 cpufreq_cpu_put(policy);
1556 }
1557
1558 return ret_freq;
1559}
1560EXPORT_SYMBOL(cpufreq_quick_get_max);
1561
Viresh Kumard92d50a2015-01-02 12:34:29 +05301562static unsigned int __cpufreq_get(struct cpufreq_policy *policy)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563{
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301564 unsigned int ret_freq = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001565
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001566 if (!cpufreq_driver->get)
Dave Jones4d34a672008-02-07 16:33:49 -05001567 return ret_freq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001568
Viresh Kumard92d50a2015-01-02 12:34:29 +05301569 ret_freq = cpufreq_driver->get(policy->cpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301571 if (ret_freq && policy->cur &&
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001572 !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301573 /* verify no discrepancy between actual and
1574 saved value exists */
1575 if (unlikely(ret_freq != policy->cur)) {
Viresh Kumara1e1dc42015-01-02 12:34:28 +05301576 cpufreq_out_of_sync(policy, ret_freq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577 schedule_work(&policy->update);
1578 }
1579 }
1580
Dave Jones4d34a672008-02-07 16:33:49 -05001581 return ret_freq;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001582}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001584/**
1585 * cpufreq_get - get the current CPU frequency (in kHz)
1586 * @cpu: CPU number
1587 *
1588 * Get the CPU current (static) CPU frequency
1589 */
1590unsigned int cpufreq_get(unsigned int cpu)
1591{
Aaron Plattner999976e2014-03-04 12:42:15 -08001592 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001593 unsigned int ret_freq = 0;
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08001594
Aaron Plattner999976e2014-03-04 12:42:15 -08001595 if (policy) {
1596 down_read(&policy->rwsem);
Viresh Kumard92d50a2015-01-02 12:34:29 +05301597 ret_freq = __cpufreq_get(policy);
Aaron Plattner999976e2014-03-04 12:42:15 -08001598 up_read(&policy->rwsem);
Viresh Kumar26ca8692013-09-20 22:37:31 +05301599
Aaron Plattner999976e2014-03-04 12:42:15 -08001600 cpufreq_cpu_put(policy);
1601 }
Viresh Kumar6eed9402013-08-06 22:53:11 +05301602
Dave Jones4d34a672008-02-07 16:33:49 -05001603 return ret_freq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604}
1605EXPORT_SYMBOL(cpufreq_get);
1606
Kay Sievers8a25a2f2011-12-21 14:29:42 -08001607static struct subsys_interface cpufreq_interface = {
1608 .name = "cpufreq",
1609 .subsys = &cpu_subsys,
1610 .add_dev = cpufreq_add_dev,
1611 .remove_dev = cpufreq_remove_dev,
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001612};
1613
Viresh Kumare28867e2014-03-04 11:00:27 +08001614/*
1615 * In case platform wants some specific frequency to be configured
1616 * during suspend..
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001617 */
Viresh Kumare28867e2014-03-04 11:00:27 +08001618int cpufreq_generic_suspend(struct cpufreq_policy *policy)
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001619{
Viresh Kumare28867e2014-03-04 11:00:27 +08001620 int ret;
Dave Jones4bc5d342009-08-04 14:03:25 -04001621
Viresh Kumare28867e2014-03-04 11:00:27 +08001622 if (!policy->suspend_freq) {
1623 pr_err("%s: suspend_freq can't be zero\n", __func__);
1624 return -EINVAL;
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001625 }
1626
Viresh Kumare28867e2014-03-04 11:00:27 +08001627 pr_debug("%s: Setting suspend-freq: %u\n", __func__,
1628 policy->suspend_freq);
1629
1630 ret = __cpufreq_driver_target(policy, policy->suspend_freq,
1631 CPUFREQ_RELATION_H);
1632 if (ret)
1633 pr_err("%s: unable to set suspend-freq: %u. err: %d\n",
1634 __func__, policy->suspend_freq, ret);
1635
Dave Jonesc9060492008-02-07 16:32:18 -05001636 return ret;
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001637}
Viresh Kumare28867e2014-03-04 11:00:27 +08001638EXPORT_SYMBOL(cpufreq_generic_suspend);
Benjamin Herrenschmidt42d4dc32005-04-29 07:40:12 -07001639
1640/**
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001641 * cpufreq_suspend() - Suspend CPUFreq governors
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642 *
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001643 * Called during system wide Suspend/Hibernate cycles for suspending governors
1644 * as some platforms can't change frequency after this point in suspend cycle.
1645 * Because some of the devices (like: i2c, regulators, etc) they use for
1646 * changing frequency are suspended quickly after this point.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001647 */
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001648void cpufreq_suspend(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649{
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05301650 struct cpufreq_policy *policy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001652 if (!cpufreq_driver)
Rafael J. Wysockie00e56d2011-03-23 22:16:32 +01001653 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001655 if (!has_target())
Viresh Kumarb1b12bab2014-09-30 09:33:17 +05301656 goto suspend;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001658 pr_debug("%s: Suspending Governors\n", __func__);
1659
1660 list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
1661 if (__cpufreq_governor(policy, CPUFREQ_GOV_STOP))
1662 pr_err("%s: Failed to stop governor for policy: %p\n",
1663 __func__, policy);
1664 else if (cpufreq_driver->suspend
1665 && cpufreq_driver->suspend(policy))
1666 pr_err("%s: Failed to suspend driver: %p\n", __func__,
1667 policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 }
Viresh Kumarb1b12bab2014-09-30 09:33:17 +05301669
1670suspend:
1671 cpufreq_suspended = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672}
1673
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674/**
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001675 * cpufreq_resume() - Resume CPUFreq governors
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676 *
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001677 * Called during system wide Suspend/Hibernate cycle for resuming governors that
1678 * are suspended with cpufreq_suspend().
Linus Torvalds1da177e2005-04-16 15:20:36 -07001679 */
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001680void cpufreq_resume(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682 struct cpufreq_policy *policy;
1683
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001684 if (!cpufreq_driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685 return;
1686
Lan Tianyu8e304442014-09-18 15:03:07 +08001687 cpufreq_suspended = false;
1688
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001689 if (!has_target())
1690 return;
1691
1692 pr_debug("%s: Resuming Governors\n", __func__);
1693
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001694 list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
Viresh Kumar0c5aa402014-03-24 12:30:29 +05301695 if (cpufreq_driver->resume && cpufreq_driver->resume(policy))
1696 pr_err("%s: Failed to resume driver: %p\n", __func__,
1697 policy);
1698 else if (__cpufreq_governor(policy, CPUFREQ_GOV_START)
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001699 || __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
1700 pr_err("%s: Failed to start governor for policy: %p\n",
1701 __func__, policy);
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001702
1703 /*
1704 * schedule call cpufreq_update_policy() for boot CPU, i.e. last
1705 * policy in list. It will verify that the current freq is in
1706 * sync with what we believe it to be.
1707 */
1708 if (list_is_last(&policy->policy_list, &cpufreq_policy_list))
1709 schedule_work(&policy->update);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001710 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712
Borislav Petkov9d950462013-01-20 10:24:28 +00001713/**
1714 * cpufreq_get_current_driver - return current driver's name
1715 *
1716 * Return the name string of the currently loaded cpufreq driver
1717 * or NULL, if none.
1718 */
1719const char *cpufreq_get_current_driver(void)
1720{
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001721 if (cpufreq_driver)
1722 return cpufreq_driver->name;
1723
1724 return NULL;
Borislav Petkov9d950462013-01-20 10:24:28 +00001725}
1726EXPORT_SYMBOL_GPL(cpufreq_get_current_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727
Thomas Petazzoni51315cd2014-10-19 11:30:27 +02001728/**
1729 * cpufreq_get_driver_data - return current driver data
1730 *
1731 * Return the private data of the currently loaded cpufreq
1732 * driver, or NULL if no cpufreq driver is loaded.
1733 */
1734void *cpufreq_get_driver_data(void)
1735{
1736 if (cpufreq_driver)
1737 return cpufreq_driver->driver_data;
1738
1739 return NULL;
1740}
1741EXPORT_SYMBOL_GPL(cpufreq_get_driver_data);
1742
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743/*********************************************************************
1744 * NOTIFIER LISTS INTERFACE *
1745 *********************************************************************/
1746
1747/**
1748 * cpufreq_register_notifier - register a driver with cpufreq
1749 * @nb: notifier function to register
1750 * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
1751 *
Dave Jones32ee8c32006-02-28 00:43:23 -05001752 * Add a driver to one of two lists: either a list of drivers that
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753 * are notified about clock rate changes (once before and once after
1754 * the transition), or a list of drivers that are notified about
1755 * changes in cpufreq policy.
1756 *
1757 * This function may sleep, and has the same return conditions as
Alan Sterne041c682006-03-27 01:16:30 -08001758 * blocking_notifier_chain_register.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759 */
1760int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
1761{
1762 int ret;
1763
Dirk Brandewied5aaffa2013-01-17 16:22:21 +00001764 if (cpufreq_disabled())
1765 return -EINVAL;
1766
Cesar Eduardo Barros74212ca2008-02-16 08:41:24 -02001767 WARN_ON(!init_cpufreq_transition_notifier_list_called);
1768
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 switch (list) {
1770 case CPUFREQ_TRANSITION_NOTIFIER:
Alan Sternb4dfdbb2006-10-04 02:17:06 -07001771 ret = srcu_notifier_chain_register(
Alan Sterne041c682006-03-27 01:16:30 -08001772 &cpufreq_transition_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 break;
1774 case CPUFREQ_POLICY_NOTIFIER:
Alan Sterne041c682006-03-27 01:16:30 -08001775 ret = blocking_notifier_chain_register(
1776 &cpufreq_policy_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 break;
1778 default:
1779 ret = -EINVAL;
1780 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781
1782 return ret;
1783}
1784EXPORT_SYMBOL(cpufreq_register_notifier);
1785
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786/**
1787 * cpufreq_unregister_notifier - unregister a driver with cpufreq
1788 * @nb: notifier block to be unregistered
Viresh Kumarbb176f72013-06-19 14:19:33 +05301789 * @list: CPUFREQ_TRANSITION_NOTIFIER or CPUFREQ_POLICY_NOTIFIER
Linus Torvalds1da177e2005-04-16 15:20:36 -07001790 *
1791 * Remove a driver from the CPU frequency notifier list.
1792 *
1793 * This function may sleep, and has the same return conditions as
Alan Sterne041c682006-03-27 01:16:30 -08001794 * blocking_notifier_chain_unregister.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001795 */
1796int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
1797{
1798 int ret;
1799
Dirk Brandewied5aaffa2013-01-17 16:22:21 +00001800 if (cpufreq_disabled())
1801 return -EINVAL;
1802
Linus Torvalds1da177e2005-04-16 15:20:36 -07001803 switch (list) {
1804 case CPUFREQ_TRANSITION_NOTIFIER:
Alan Sternb4dfdbb2006-10-04 02:17:06 -07001805 ret = srcu_notifier_chain_unregister(
Alan Sterne041c682006-03-27 01:16:30 -08001806 &cpufreq_transition_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 break;
1808 case CPUFREQ_POLICY_NOTIFIER:
Alan Sterne041c682006-03-27 01:16:30 -08001809 ret = blocking_notifier_chain_unregister(
1810 &cpufreq_policy_notifier_list, nb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811 break;
1812 default:
1813 ret = -EINVAL;
1814 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815
1816 return ret;
1817}
1818EXPORT_SYMBOL(cpufreq_unregister_notifier);
1819
1820
1821/*********************************************************************
1822 * GOVERNORS *
1823 *********************************************************************/
1824
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301825/* Must set freqs->new to intermediate frequency */
1826static int __target_intermediate(struct cpufreq_policy *policy,
1827 struct cpufreq_freqs *freqs, int index)
1828{
1829 int ret;
1830
1831 freqs->new = cpufreq_driver->get_intermediate(policy, index);
1832
1833 /* We don't need to switch to intermediate freq */
1834 if (!freqs->new)
1835 return 0;
1836
1837 pr_debug("%s: cpu: %d, switching to intermediate freq: oldfreq: %u, intermediate freq: %u\n",
1838 __func__, policy->cpu, freqs->old, freqs->new);
1839
1840 cpufreq_freq_transition_begin(policy, freqs);
1841 ret = cpufreq_driver->target_intermediate(policy, index);
1842 cpufreq_freq_transition_end(policy, freqs, ret);
1843
1844 if (ret)
1845 pr_err("%s: Failed to change to intermediate frequency: %d\n",
1846 __func__, ret);
1847
1848 return ret;
1849}
1850
Viresh Kumar8d657752014-05-21 14:29:29 +05301851static int __target_index(struct cpufreq_policy *policy,
1852 struct cpufreq_frequency_table *freq_table, int index)
1853{
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301854 struct cpufreq_freqs freqs = {.old = policy->cur, .flags = 0};
1855 unsigned int intermediate_freq = 0;
Viresh Kumar8d657752014-05-21 14:29:29 +05301856 int retval = -EINVAL;
1857 bool notify;
1858
1859 notify = !(cpufreq_driver->flags & CPUFREQ_ASYNC_NOTIFICATION);
Viresh Kumar8d657752014-05-21 14:29:29 +05301860 if (notify) {
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301861 /* Handle switching to intermediate frequency */
1862 if (cpufreq_driver->get_intermediate) {
1863 retval = __target_intermediate(policy, &freqs, index);
1864 if (retval)
1865 return retval;
Viresh Kumar8d657752014-05-21 14:29:29 +05301866
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301867 intermediate_freq = freqs.new;
1868 /* Set old freq to intermediate */
1869 if (intermediate_freq)
1870 freqs.old = freqs.new;
1871 }
1872
1873 freqs.new = freq_table[index].frequency;
Viresh Kumar8d657752014-05-21 14:29:29 +05301874 pr_debug("%s: cpu: %d, oldfreq: %u, new freq: %u\n",
1875 __func__, policy->cpu, freqs.old, freqs.new);
1876
1877 cpufreq_freq_transition_begin(policy, &freqs);
1878 }
1879
1880 retval = cpufreq_driver->target_index(policy, index);
1881 if (retval)
1882 pr_err("%s: Failed to change cpu frequency: %d\n", __func__,
1883 retval);
1884
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301885 if (notify) {
Viresh Kumar8d657752014-05-21 14:29:29 +05301886 cpufreq_freq_transition_end(policy, &freqs, retval);
1887
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301888 /*
1889 * Failed after setting to intermediate freq? Driver should have
1890 * reverted back to initial frequency and so should we. Check
1891 * here for intermediate_freq instead of get_intermediate, in
1892 * case we have't switched to intermediate freq at all.
1893 */
1894 if (unlikely(retval && intermediate_freq)) {
1895 freqs.old = intermediate_freq;
1896 freqs.new = policy->restore_freq;
1897 cpufreq_freq_transition_begin(policy, &freqs);
1898 cpufreq_freq_transition_end(policy, &freqs, 0);
1899 }
1900 }
1901
Viresh Kumar8d657752014-05-21 14:29:29 +05301902 return retval;
1903}
1904
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905int __cpufreq_driver_target(struct cpufreq_policy *policy,
1906 unsigned int target_freq,
1907 unsigned int relation)
1908{
Viresh Kumar72499242012-10-31 01:28:21 +01001909 unsigned int old_target_freq = target_freq;
Viresh Kumar8d657752014-05-21 14:29:29 +05301910 int retval = -EINVAL;
Ashok Rajc32b6b82005-10-30 14:59:54 -08001911
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04001912 if (cpufreq_disabled())
1913 return -ENODEV;
1914
Viresh Kumar72499242012-10-31 01:28:21 +01001915 /* Make sure that target_freq is within supported range */
1916 if (target_freq > policy->max)
1917 target_freq = policy->max;
1918 if (target_freq < policy->min)
1919 target_freq = policy->min;
1920
1921 pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
Joe Perchese837f9b2014-03-11 10:03:00 -07001922 policy->cpu, target_freq, relation, old_target_freq);
Viresh Kumar5a1c0222012-10-31 01:28:15 +01001923
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301924 /*
1925 * This might look like a redundant call as we are checking it again
1926 * after finding index. But it is left intentionally for cases where
1927 * exactly same freq is called again and so we can save on few function
1928 * calls.
1929 */
Viresh Kumar5a1c0222012-10-31 01:28:15 +01001930 if (target_freq == policy->cur)
1931 return 0;
1932
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05301933 /* Save last value to restore later on errors */
1934 policy->restore_freq = policy->cur;
1935
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02001936 if (cpufreq_driver->target)
1937 retval = cpufreq_driver->target(policy, target_freq, relation);
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301938 else if (cpufreq_driver->target_index) {
1939 struct cpufreq_frequency_table *freq_table;
1940 int index;
Ashok Raj90d45d12005-11-08 21:34:24 -08001941
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301942 freq_table = cpufreq_frequency_get_table(policy->cpu);
1943 if (unlikely(!freq_table)) {
1944 pr_err("%s: Unable to find freq_table\n", __func__);
1945 goto out;
1946 }
1947
1948 retval = cpufreq_frequency_table_target(policy, freq_table,
1949 target_freq, relation, &index);
1950 if (unlikely(retval)) {
1951 pr_err("%s: Unable to find matching freq\n", __func__);
1952 goto out;
1953 }
1954
Viresh Kumard4019f02013-08-14 19:38:24 +05301955 if (freq_table[index].frequency == policy->cur) {
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301956 retval = 0;
Viresh Kumard4019f02013-08-14 19:38:24 +05301957 goto out;
1958 }
1959
Viresh Kumar8d657752014-05-21 14:29:29 +05301960 retval = __target_index(policy, freq_table, index);
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05301961 }
1962
1963out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 return retval;
1965}
1966EXPORT_SYMBOL_GPL(__cpufreq_driver_target);
1967
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968int cpufreq_driver_target(struct cpufreq_policy *policy,
1969 unsigned int target_freq,
1970 unsigned int relation)
1971{
Julia Lawallf1829e42008-07-25 22:44:53 +02001972 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001973
viresh kumarad7722d2013-10-18 19:10:15 +05301974 down_write(&policy->rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001975
1976 ret = __cpufreq_driver_target(policy, target_freq, relation);
1977
viresh kumarad7722d2013-10-18 19:10:15 +05301978 up_write(&policy->rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980 return ret;
1981}
1982EXPORT_SYMBOL_GPL(cpufreq_driver_target);
1983
Gautham R Shenoye08f5f52006-10-26 16:20:58 +05301984static int __cpufreq_governor(struct cpufreq_policy *policy,
1985 unsigned int event)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001986{
Dave Jonescc993ca2005-07-28 09:43:56 -07001987 int ret;
Thomas Renninger6afde102007-10-02 13:28:13 -07001988
1989 /* Only must be defined when default governor is known to have latency
1990 restrictions, like e.g. conservative or ondemand.
1991 That this is the case is already ensured in Kconfig
1992 */
1993#ifdef CONFIG_CPU_FREQ_GOV_PERFORMANCE
1994 struct cpufreq_governor *gov = &cpufreq_gov_performance;
1995#else
1996 struct cpufreq_governor *gov = NULL;
1997#endif
Thomas Renninger1c256242007-10-02 13:28:12 -07001998
Viresh Kumar2f0aea92014-03-04 11:00:26 +08001999 /* Don't start any governor operations if we are entering suspend */
2000 if (cpufreq_suspended)
2001 return 0;
Ethan Zhaocb57720b2014-12-18 15:28:19 +09002002 /*
2003 * Governor might not be initiated here if ACPI _PPC changed
2004 * notification happened, so check it.
2005 */
2006 if (!policy->governor)
2007 return -EINVAL;
Viresh Kumar2f0aea92014-03-04 11:00:26 +08002008
Thomas Renninger1c256242007-10-02 13:28:12 -07002009 if (policy->governor->max_transition_latency &&
2010 policy->cpuinfo.transition_latency >
2011 policy->governor->max_transition_latency) {
Thomas Renninger6afde102007-10-02 13:28:13 -07002012 if (!gov)
2013 return -EINVAL;
2014 else {
Joe Perchese837f9b2014-03-11 10:03:00 -07002015 pr_warn("%s governor failed, too long transition latency of HW, fallback to %s governor\n",
2016 policy->governor->name, gov->name);
Thomas Renninger6afde102007-10-02 13:28:13 -07002017 policy->governor = gov;
2018 }
Thomas Renninger1c256242007-10-02 13:28:12 -07002019 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020
Viresh Kumarfe492f32013-08-06 22:53:10 +05302021 if (event == CPUFREQ_GOV_POLICY_INIT)
2022 if (!try_module_get(policy->governor->owner))
2023 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002025 pr_debug("__cpufreq_governor for CPU %u, event %u\n",
Joe Perchese837f9b2014-03-11 10:03:00 -07002026 policy->cpu, event);
Xiaoguang Chen95731eb2013-06-19 15:00:07 +08002027
2028 mutex_lock(&cpufreq_governor_lock);
Srivatsa S. Bhat56d07db2013-09-07 01:23:55 +05302029 if ((policy->governor_enabled && event == CPUFREQ_GOV_START)
Viresh Kumarf73d3932013-08-31 17:53:40 +05302030 || (!policy->governor_enabled
2031 && (event == CPUFREQ_GOV_LIMITS || event == CPUFREQ_GOV_STOP))) {
Xiaoguang Chen95731eb2013-06-19 15:00:07 +08002032 mutex_unlock(&cpufreq_governor_lock);
2033 return -EBUSY;
2034 }
2035
2036 if (event == CPUFREQ_GOV_STOP)
2037 policy->governor_enabled = false;
2038 else if (event == CPUFREQ_GOV_START)
2039 policy->governor_enabled = true;
2040
2041 mutex_unlock(&cpufreq_governor_lock);
2042
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043 ret = policy->governor->governor(policy, event);
2044
Viresh Kumar4d5dcc42013-03-27 15:58:58 +00002045 if (!ret) {
2046 if (event == CPUFREQ_GOV_POLICY_INIT)
2047 policy->governor->initialized++;
2048 else if (event == CPUFREQ_GOV_POLICY_EXIT)
2049 policy->governor->initialized--;
Xiaoguang Chen95731eb2013-06-19 15:00:07 +08002050 } else {
2051 /* Restore original values */
2052 mutex_lock(&cpufreq_governor_lock);
2053 if (event == CPUFREQ_GOV_STOP)
2054 policy->governor_enabled = true;
2055 else if (event == CPUFREQ_GOV_START)
2056 policy->governor_enabled = false;
2057 mutex_unlock(&cpufreq_governor_lock);
Viresh Kumar4d5dcc42013-03-27 15:58:58 +00002058 }
Viresh Kumarb3940582013-02-01 05:42:58 +00002059
Viresh Kumarfe492f32013-08-06 22:53:10 +05302060 if (((event == CPUFREQ_GOV_POLICY_INIT) && ret) ||
2061 ((event == CPUFREQ_GOV_POLICY_EXIT) && !ret))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062 module_put(policy->governor->owner);
2063
2064 return ret;
2065}
2066
Linus Torvalds1da177e2005-04-16 15:20:36 -07002067int cpufreq_register_governor(struct cpufreq_governor *governor)
2068{
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07002069 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070
2071 if (!governor)
2072 return -EINVAL;
2073
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04002074 if (cpufreq_disabled())
2075 return -ENODEV;
2076
akpm@osdl.org3fc54d32006-01-13 15:54:22 -08002077 mutex_lock(&cpufreq_governor_mutex);
Dave Jones32ee8c32006-02-28 00:43:23 -05002078
Viresh Kumarb3940582013-02-01 05:42:58 +00002079 governor->initialized = 0;
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07002080 err = -EBUSY;
Viresh Kumar42f91fa2015-01-02 12:34:26 +05302081 if (!find_governor(governor->name)) {
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07002082 err = 0;
2083 list_add(&governor->governor_list, &cpufreq_governor_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085
Dave Jones32ee8c32006-02-28 00:43:23 -05002086 mutex_unlock(&cpufreq_governor_mutex);
Jeremy Fitzhardinge3bcb09a2006-07-06 12:30:26 -07002087 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088}
2089EXPORT_SYMBOL_GPL(cpufreq_register_governor);
2090
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091void cpufreq_unregister_governor(struct cpufreq_governor *governor)
2092{
Prarit Bhargava90e41ba2009-11-12 09:18:46 -05002093 int cpu;
Prarit Bhargava90e41ba2009-11-12 09:18:46 -05002094
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095 if (!governor)
2096 return;
2097
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04002098 if (cpufreq_disabled())
2099 return;
2100
Prarit Bhargava90e41ba2009-11-12 09:18:46 -05002101 for_each_present_cpu(cpu) {
2102 if (cpu_online(cpu))
2103 continue;
2104 if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
2105 strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
2106 }
Prarit Bhargava90e41ba2009-11-12 09:18:46 -05002107
akpm@osdl.org3fc54d32006-01-13 15:54:22 -08002108 mutex_lock(&cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 list_del(&governor->governor_list);
akpm@osdl.org3fc54d32006-01-13 15:54:22 -08002110 mutex_unlock(&cpufreq_governor_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111 return;
2112}
2113EXPORT_SYMBOL_GPL(cpufreq_unregister_governor);
2114
2115
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116/*********************************************************************
2117 * POLICY INTERFACE *
2118 *********************************************************************/
2119
2120/**
2121 * cpufreq_get_policy - get the current cpufreq_policy
Dave Jones29464f22009-01-18 01:37:11 -05002122 * @policy: struct cpufreq_policy into which the current cpufreq_policy
2123 * is written
Linus Torvalds1da177e2005-04-16 15:20:36 -07002124 *
2125 * Reads the current cpufreq policy.
2126 */
2127int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
2128{
2129 struct cpufreq_policy *cpu_policy;
2130 if (!policy)
2131 return -EINVAL;
2132
2133 cpu_policy = cpufreq_cpu_get(cpu);
2134 if (!cpu_policy)
2135 return -EINVAL;
2136
Viresh Kumard5b73cd2013-08-06 22:53:06 +05302137 memcpy(policy, cpu_policy, sizeof(*policy));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
2139 cpufreq_cpu_put(cpu_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140 return 0;
2141}
2142EXPORT_SYMBOL(cpufreq_get_policy);
2143
Arjan van de Ven153d7f32006-07-26 15:40:07 +02002144/*
Viresh Kumar037ce832013-10-02 14:13:16 +05302145 * policy : current policy.
2146 * new_policy: policy to be set.
Arjan van de Ven153d7f32006-07-26 15:40:07 +02002147 */
Viresh Kumar037ce832013-10-02 14:13:16 +05302148static int cpufreq_set_policy(struct cpufreq_policy *policy,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302149 struct cpufreq_policy *new_policy)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150{
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002151 struct cpufreq_governor *old_gov;
2152 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153
Joe Perchese837f9b2014-03-11 10:03:00 -07002154 pr_debug("setting new policy for CPU %u: %u - %u kHz\n",
2155 new_policy->cpu, new_policy->min, new_policy->max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156
Viresh Kumard5b73cd2013-08-06 22:53:06 +05302157 memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002159 if (new_policy->min > policy->max || new_policy->max < policy->min)
2160 return -EINVAL;
Mattia Dongili9c9a43e2006-07-05 23:12:20 +02002161
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 /* verify the cpu speed can be set within this limit */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302163 ret = cpufreq_driver->verify(new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164 if (ret)
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002165 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 /* adjust if necessary - all reasons */
Alan Sterne041c682006-03-27 01:16:30 -08002168 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302169 CPUFREQ_ADJUST, new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170
2171 /* adjust if necessary - hardware incompatibility*/
Alan Sterne041c682006-03-27 01:16:30 -08002172 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302173 CPUFREQ_INCOMPATIBLE, new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174
Viresh Kumarbb176f72013-06-19 14:19:33 +05302175 /*
2176 * verify the cpu speed can be set within this limit, which might be
2177 * different to the first one
2178 */
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302179 ret = cpufreq_driver->verify(new_policy);
Alan Sterne041c682006-03-27 01:16:30 -08002180 if (ret)
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002181 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182
2183 /* notification of the new policy */
Alan Sterne041c682006-03-27 01:16:30 -08002184 blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302185 CPUFREQ_NOTIFY, new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302187 policy->min = new_policy->min;
2188 policy->max = new_policy->max;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002190 pr_debug("new min and max freqs are %u - %u kHz\n",
Joe Perchese837f9b2014-03-11 10:03:00 -07002191 policy->min, policy->max);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002193 if (cpufreq_driver->setpolicy) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302194 policy->policy = new_policy->policy;
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002195 pr_debug("setting range\n");
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002196 return cpufreq_driver->setpolicy(new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197 }
2198
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002199 if (new_policy->governor == policy->governor)
2200 goto out;
2201
2202 pr_debug("governor switch\n");
2203
2204 /* save old, working values */
2205 old_gov = policy->governor;
2206 /* end old governor */
2207 if (old_gov) {
2208 __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
2209 up_write(&policy->rwsem);
Stratos Karafotise5c87b72014-03-19 23:29:17 +02002210 __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT);
Rafael J. Wysockid9a789c2014-02-17 22:56:35 +01002211 down_write(&policy->rwsem);
2212 }
2213
2214 /* start new governor */
2215 policy->governor = new_policy->governor;
2216 if (!__cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT)) {
2217 if (!__cpufreq_governor(policy, CPUFREQ_GOV_START))
2218 goto out;
2219
2220 up_write(&policy->rwsem);
2221 __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT);
2222 down_write(&policy->rwsem);
2223 }
2224
2225 /* new governor failed, so re-start old one */
2226 pr_debug("starting governor %s failed\n", policy->governor->name);
2227 if (old_gov) {
2228 policy->governor = old_gov;
2229 __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT);
2230 __cpufreq_governor(policy, CPUFREQ_GOV_START);
2231 }
2232
2233 return -EINVAL;
2234
2235 out:
2236 pr_debug("governor: change or update limits\n");
2237 return __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238}
2239
2240/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241 * cpufreq_update_policy - re-evaluate an existing cpufreq policy
2242 * @cpu: CPU which shall be re-evaluated
2243 *
Lucas De Marchi25985ed2011-03-30 22:57:33 -03002244 * Useful for policy notifiers which have different necessities
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 * at different times.
2246 */
2247int cpufreq_update_policy(unsigned int cpu)
2248{
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302249 struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
2250 struct cpufreq_policy new_policy;
Julia Lawallf1829e42008-07-25 22:44:53 +02002251 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252
Aaron Plattnerfefa8ff2014-06-18 11:27:32 -07002253 if (!policy)
2254 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255
viresh kumarad7722d2013-10-18 19:10:15 +05302256 down_write(&policy->rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002258 pr_debug("updating policy for CPU %u\n", cpu);
Viresh Kumard5b73cd2013-08-06 22:53:06 +05302259 memcpy(&new_policy, policy, sizeof(*policy));
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302260 new_policy.min = policy->user_policy.min;
2261 new_policy.max = policy->user_policy.max;
2262 new_policy.policy = policy->user_policy.policy;
2263 new_policy.governor = policy->user_policy.governor;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264
Viresh Kumarbb176f72013-06-19 14:19:33 +05302265 /*
2266 * BIOS might change freq behind our back
2267 * -> ask driver for current freq and notify governors about a change
2268 */
Rafael J. Wysocki2ed99e32014-03-12 21:49:33 +01002269 if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302270 new_policy.cur = cpufreq_driver->get(cpu);
Viresh Kumarbd0fa9b2014-02-25 14:29:44 +05302271 if (WARN_ON(!new_policy.cur)) {
2272 ret = -EIO;
Aaron Plattnerfefa8ff2014-06-18 11:27:32 -07002273 goto unlock;
Viresh Kumarbd0fa9b2014-02-25 14:29:44 +05302274 }
2275
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302276 if (!policy->cur) {
Joe Perchese837f9b2014-03-11 10:03:00 -07002277 pr_debug("Driver did not initialize current freq\n");
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302278 policy->cur = new_policy.cur;
Thomas Renningera85f7bd2006-02-01 11:36:04 +01002279 } else {
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05302280 if (policy->cur != new_policy.cur && has_target())
Viresh Kumara1e1dc42015-01-02 12:34:28 +05302281 cpufreq_out_of_sync(policy, new_policy.cur);
Thomas Renningera85f7bd2006-02-01 11:36:04 +01002282 }
Thomas Renninger0961dd02006-01-26 18:46:33 +01002283 }
2284
Viresh Kumar037ce832013-10-02 14:13:16 +05302285 ret = cpufreq_set_policy(policy, &new_policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286
Aaron Plattnerfefa8ff2014-06-18 11:27:32 -07002287unlock:
viresh kumarad7722d2013-10-18 19:10:15 +05302288 up_write(&policy->rwsem);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002289
Viresh Kumar3a3e9e02013-08-06 22:53:05 +05302290 cpufreq_cpu_put(policy);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 return ret;
2292}
2293EXPORT_SYMBOL(cpufreq_update_policy);
2294
Paul Gortmaker27609842013-06-19 13:54:04 -04002295static int cpufreq_cpu_callback(struct notifier_block *nfb,
Ashok Rajc32b6b82005-10-30 14:59:54 -08002296 unsigned long action, void *hcpu)
2297{
2298 unsigned int cpu = (unsigned long)hcpu;
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002299 struct device *dev;
Ashok Rajc32b6b82005-10-30 14:59:54 -08002300
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002301 dev = get_cpu_device(cpu);
2302 if (dev) {
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302303 switch (action & ~CPU_TASKS_FROZEN) {
Ashok Rajc32b6b82005-10-30 14:59:54 -08002304 case CPU_ONLINE:
Viresh Kumar96bbbe42014-03-10 14:53:35 +05302305 __cpufreq_add_dev(dev, NULL);
Ashok Rajc32b6b82005-10-30 14:59:54 -08002306 break;
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302307
Ashok Rajc32b6b82005-10-30 14:59:54 -08002308 case CPU_DOWN_PREPARE:
Viresh Kumar96bbbe42014-03-10 14:53:35 +05302309 __cpufreq_remove_dev_prepare(dev, NULL);
Srivatsa S. Bhat1aee40a2013-09-07 01:23:27 +05302310 break;
2311
2312 case CPU_POST_DEAD:
Viresh Kumar96bbbe42014-03-10 14:53:35 +05302313 __cpufreq_remove_dev_finish(dev, NULL);
Ashok Rajc32b6b82005-10-30 14:59:54 -08002314 break;
Srivatsa S. Bhat5302c3f2013-07-30 04:25:25 +05302315
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002316 case CPU_DOWN_FAILED:
Viresh Kumar96bbbe42014-03-10 14:53:35 +05302317 __cpufreq_add_dev(dev, NULL);
Ashok Rajc32b6b82005-10-30 14:59:54 -08002318 break;
2319 }
2320 }
2321 return NOTIFY_OK;
2322}
2323
Neal Buckendahl9c36f742010-06-22 22:02:44 -05002324static struct notifier_block __refdata cpufreq_cpu_notifier = {
Viresh Kumarbb176f72013-06-19 14:19:33 +05302325 .notifier_call = cpufreq_cpu_callback,
Ashok Rajc32b6b82005-10-30 14:59:54 -08002326};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327
2328/*********************************************************************
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002329 * BOOST *
2330 *********************************************************************/
2331static int cpufreq_boost_set_sw(int state)
2332{
2333 struct cpufreq_frequency_table *freq_table;
2334 struct cpufreq_policy *policy;
2335 int ret = -EINVAL;
2336
2337 list_for_each_entry(policy, &cpufreq_policy_list, policy_list) {
2338 freq_table = cpufreq_frequency_get_table(policy->cpu);
2339 if (freq_table) {
2340 ret = cpufreq_frequency_table_cpuinfo(policy,
2341 freq_table);
2342 if (ret) {
2343 pr_err("%s: Policy frequency update failed\n",
2344 __func__);
2345 break;
2346 }
2347 policy->user_policy.max = policy->max;
2348 __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
2349 }
2350 }
2351
2352 return ret;
2353}
2354
2355int cpufreq_boost_trigger_state(int state)
2356{
2357 unsigned long flags;
2358 int ret = 0;
2359
2360 if (cpufreq_driver->boost_enabled == state)
2361 return 0;
2362
2363 write_lock_irqsave(&cpufreq_driver_lock, flags);
2364 cpufreq_driver->boost_enabled = state;
2365 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
2366
2367 ret = cpufreq_driver->set_boost(state);
2368 if (ret) {
2369 write_lock_irqsave(&cpufreq_driver_lock, flags);
2370 cpufreq_driver->boost_enabled = !state;
2371 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
2372
Joe Perchese837f9b2014-03-11 10:03:00 -07002373 pr_err("%s: Cannot %s BOOST\n",
2374 __func__, state ? "enable" : "disable");
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002375 }
2376
2377 return ret;
2378}
2379
2380int cpufreq_boost_supported(void)
2381{
2382 if (likely(cpufreq_driver))
2383 return cpufreq_driver->boost_supported;
2384
2385 return 0;
2386}
2387EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
2388
2389int cpufreq_boost_enabled(void)
2390{
2391 return cpufreq_driver->boost_enabled;
2392}
2393EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
2394
2395/*********************************************************************
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396 * REGISTER / UNREGISTER CPUFREQ DRIVER *
2397 *********************************************************************/
2398
2399/**
2400 * cpufreq_register_driver - register a CPU Frequency driver
2401 * @driver_data: A struct cpufreq_driver containing the values#
2402 * submitted by the CPU Frequency driver.
2403 *
Viresh Kumarbb176f72013-06-19 14:19:33 +05302404 * Registers a CPU Frequency driver to this core code. This code
Linus Torvalds1da177e2005-04-16 15:20:36 -07002405 * returns zero on success, -EBUSY when another driver got here first
Dave Jones32ee8c32006-02-28 00:43:23 -05002406 * (and isn't unregistered in the meantime).
Linus Torvalds1da177e2005-04-16 15:20:36 -07002407 *
2408 */
Linus Torvalds221dee22007-02-26 14:55:48 -08002409int cpufreq_register_driver(struct cpufreq_driver *driver_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410{
2411 unsigned long flags;
2412 int ret;
2413
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04002414 if (cpufreq_disabled())
2415 return -ENODEV;
2416
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417 if (!driver_data || !driver_data->verify || !driver_data->init ||
Viresh Kumar9c0ebcf2013-10-25 19:45:48 +05302418 !(driver_data->setpolicy || driver_data->target_index ||
Rafael J. Wysocki98322352014-03-19 12:48:30 +01002419 driver_data->target) ||
2420 (driver_data->setpolicy && (driver_data->target_index ||
Viresh Kumar1c03a2d2014-06-02 22:49:28 +05302421 driver_data->target)) ||
2422 (!!driver_data->get_intermediate != !!driver_data->target_intermediate))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002423 return -EINVAL;
2424
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002425 pr_debug("trying to register driver %s\n", driver_data->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002427 write_lock_irqsave(&cpufreq_driver_lock, flags);
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002428 if (cpufreq_driver) {
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002429 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Yinghai Lu4dea58062013-09-18 21:05:20 -07002430 return -EEXIST;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431 }
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002432 cpufreq_driver = driver_data;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002433 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002434
Viresh Kumarbc68b7d2015-01-02 12:34:30 +05302435 if (driver_data->setpolicy)
2436 driver_data->flags |= CPUFREQ_CONST_LOOPS;
2437
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002438 if (cpufreq_boost_supported()) {
2439 /*
2440 * Check if driver provides function to enable boost -
2441 * if not, use cpufreq_boost_set_sw as default
2442 */
2443 if (!cpufreq_driver->set_boost)
2444 cpufreq_driver->set_boost = cpufreq_boost_set_sw;
2445
2446 ret = cpufreq_sysfs_create_file(&boost.attr);
2447 if (ret) {
2448 pr_err("%s: cannot register global BOOST sysfs file\n",
Joe Perchese837f9b2014-03-11 10:03:00 -07002449 __func__);
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002450 goto err_null_driver;
2451 }
2452 }
2453
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002454 ret = subsys_interface_register(&cpufreq_interface);
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002455 if (ret)
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002456 goto err_boost_unreg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002457
Viresh Kumarce1bcfe2015-01-02 12:34:35 +05302458 if (!(cpufreq_driver->flags & CPUFREQ_STICKY) &&
2459 list_empty(&cpufreq_policy_list)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002460 /* if all ->init() calls failed, unregister */
Viresh Kumarce1bcfe2015-01-02 12:34:35 +05302461 pr_debug("%s: No CPU initialized for driver %s\n", __func__,
2462 driver_data->name);
2463 goto err_if_unreg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464 }
2465
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002466 register_hotcpu_notifier(&cpufreq_cpu_notifier);
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002467 pr_debug("driver %s up and running\n", driver_data->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002468
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002469 return 0;
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002470err_if_unreg:
2471 subsys_interface_unregister(&cpufreq_interface);
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002472err_boost_unreg:
2473 if (cpufreq_boost_supported())
2474 cpufreq_sysfs_remove_file(&boost.attr);
Jiri Slaby8f5bc2a2011-03-01 17:41:10 +01002475err_null_driver:
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002476 write_lock_irqsave(&cpufreq_driver_lock, flags);
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002477 cpufreq_driver = NULL;
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002478 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Dave Jones4d34a672008-02-07 16:33:49 -05002479 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002480}
2481EXPORT_SYMBOL_GPL(cpufreq_register_driver);
2482
Linus Torvalds1da177e2005-04-16 15:20:36 -07002483/**
2484 * cpufreq_unregister_driver - unregister the current CPUFreq driver
2485 *
Viresh Kumarbb176f72013-06-19 14:19:33 +05302486 * Unregister the current CPUFreq driver. Only call this if you have
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487 * the right to do so, i.e. if you have succeeded in initialising before!
2488 * Returns zero if successful, and -EINVAL if the cpufreq_driver is
2489 * currently not initialised.
2490 */
Linus Torvalds221dee22007-02-26 14:55:48 -08002491int cpufreq_unregister_driver(struct cpufreq_driver *driver)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002492{
2493 unsigned long flags;
2494
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002495 if (!cpufreq_driver || (driver != cpufreq_driver))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002496 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002497
Dominik Brodowski2d06d8c2011-03-27 15:04:46 +02002498 pr_debug("unregistering driver %s\n", driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499
Kay Sievers8a25a2f2011-12-21 14:29:42 -08002500 subsys_interface_unregister(&cpufreq_interface);
Lukasz Majewski6f19efc2013-12-20 15:24:49 +01002501 if (cpufreq_boost_supported())
2502 cpufreq_sysfs_remove_file(&boost.attr);
2503
Chandra Seetharaman65edc682006-06-27 02:54:08 -07002504 unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505
Viresh Kumar6eed9402013-08-06 22:53:11 +05302506 down_write(&cpufreq_rwsem);
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002507 write_lock_irqsave(&cpufreq_driver_lock, flags);
Viresh Kumar6eed9402013-08-06 22:53:11 +05302508
Rafael J. Wysocki1c3d85d2013-04-29 00:08:16 +02002509 cpufreq_driver = NULL;
Viresh Kumar6eed9402013-08-06 22:53:11 +05302510
Nathan Zimmer0d1857a2013-02-22 16:24:34 +00002511 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
Viresh Kumar6eed9402013-08-06 22:53:11 +05302512 up_write(&cpufreq_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002513
2514 return 0;
2515}
2516EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002517
Doug Anderson90de2a42014-12-23 22:09:48 -08002518/*
2519 * Stop cpufreq at shutdown to make sure it isn't holding any locks
2520 * or mutexes when secondary CPUs are halted.
2521 */
2522static struct syscore_ops cpufreq_syscore_ops = {
2523 .shutdown = cpufreq_suspend,
2524};
2525
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002526static int __init cpufreq_core_init(void)
2527{
Konrad Rzeszutek Wilka7b422c2012-03-13 19:18:39 -04002528 if (cpufreq_disabled())
2529 return -ENODEV;
2530
Viresh Kumar2361be22013-05-17 16:09:09 +05302531 cpufreq_global_kobject = kobject_create();
Thomas Renninger8aa84ad2009-07-24 15:25:05 +02002532 BUG_ON(!cpufreq_global_kobject);
2533
Doug Anderson90de2a42014-12-23 22:09:48 -08002534 register_syscore_ops(&cpufreq_syscore_ops);
2535
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002536 return 0;
2537}
Venkatesh Pallipadi5a01f2e2007-02-05 16:12:44 -08002538core_initcall(cpufreq_core_init);