Blame view

include/linux/cpufreq.h 28.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
bb176f7d0   Viresh Kumar   cpufreq: Fix mino...
2
   * linux/include/linux/cpufreq.h
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   *
bb176f7d0   Viresh Kumar   cpufreq: Fix mino...
4
5
   * Copyright (C) 2001 Russell King
   *           (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
6
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  #ifndef _LINUX_CPUFREQ_H
  #define _LINUX_CPUFREQ_H
652ed95d5   Viresh Kumar   cpufreq: introduc...
13
  #include <linux/clk.h>
5ff0a2680   Viresh Kumar   cpufreq: Clean up...
14
15
  #include <linux/cpumask.h>
  #include <linux/completion.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
  #include <linux/kobject.h>
5ff0a2680   Viresh Kumar   cpufreq: Clean up...
17
  #include <linux/notifier.h>
12478cf0c   Srivatsa S. Bhat   cpufreq: Make sur...
18
  #include <linux/spinlock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
  #include <linux/sysfs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  /*********************************************************************
74aca95da   Viresh Kumar   cpufreq: Re-arran...
22
   *                        CPUFREQ INTERFACE                          *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
   *********************************************************************/
74aca95da   Viresh Kumar   cpufreq: Re-arran...
24
25
26
  /*
   * Frequency values here are CPU kHz
   *
b53cc6ead   Dave Jones   [CPUFREQ] fix up ...
27
   * Maximum transition latency is in nanoseconds - if it's unknown,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
   * CPUFREQ_ETERNAL shall be used.
   */
74aca95da   Viresh Kumar   cpufreq: Re-arran...
30
31
  #define CPUFREQ_ETERNAL			(-1)
  #define CPUFREQ_NAME_LEN		16
565ebe807   Viresh Kumar   cpufreq: Fix typo...
32
33
  /* Print length for names. Extra 1 space for accommodating '
  ' in prints */
74aca95da   Viresh Kumar   cpufreq: Re-arran...
34
  #define CPUFREQ_NAME_PLEN		(CPUFREQ_NAME_LEN + 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  struct cpufreq_governor;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
36
37
38
39
40
  enum cpufreq_table_sorting {
  	CPUFREQ_TABLE_UNSORTED,
  	CPUFREQ_TABLE_SORTED_ASCENDING,
  	CPUFREQ_TABLE_SORTED_DESCENDING
  };
74aca95da   Viresh Kumar   cpufreq: Re-arran...
41
42
43
44
45
46
  struct cpufreq_freqs {
  	unsigned int cpu;	/* cpu nr */
  	unsigned int old;
  	unsigned int new;
  	u8 flags;		/* flags of cpufreq_driver, see below. */
  };
8aa84ad8d   Thomas Renninger   [CPUFREQ] Introdu...
47

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
  struct cpufreq_cpuinfo {
  	unsigned int		max_freq;
  	unsigned int		min_freq;
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
51
52
53
  
  	/* in 10^(-9) s = nanoseconds */
  	unsigned int		transition_latency;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  };
c7a7b418d   Viresh Kumar   cpufreq: rename c...
55
  struct cpufreq_user_policy {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
  	unsigned int		min;    /* in kHz */
  	unsigned int		max;    /* in kHz */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
  };
  
  struct cpufreq_policy {
951fc5f45   Viresh Kumar   cpufreq: Update D...
61
62
63
  	/* CPUs sharing clock, require sw coordination */
  	cpumask_var_t		cpus;	/* Online CPUs only */
  	cpumask_var_t		related_cpus; /* Online + Offline CPUs */
559ed4075   Rafael J. Wysocki   cpufreq: Avoid at...
64
  	cpumask_var_t		real_cpus; /* Related and present */
951fc5f45   Viresh Kumar   cpufreq: Update D...
65

62b36cc1c   Viresh Kumar   cpufreq: Remove u...
66
  	unsigned int		shared_type; /* ACPI: ANY or ALL affected CPUs
3b2d99429   Venkatesh Pallipadi   P-state software ...
67
  						should set cpufreq */
9d16f2071   Saravana Kannan   cpufreq: Track cp...
68
  	unsigned int		cpu;    /* cpu managing this policy, must be online */
9d16f2071   Saravana Kannan   cpufreq: Track cp...
69

652ed95d5   Viresh Kumar   cpufreq: introduc...
70
  	struct clk		*clk;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
75
76
  	struct cpufreq_cpuinfo	cpuinfo;/* see above */
  
  	unsigned int		min;    /* in kHz */
  	unsigned int		max;    /* in kHz */
  	unsigned int		cur;    /* in kHz, only needed if cpufreq
  					 * governors are used */
1c03a2d04   Viresh Kumar   cpufreq: add supp...
77
  	unsigned int		restore_freq; /* = policy->cur before transition */
e28867eab   Viresh Kumar   cpufreq: Implemen...
78
  	unsigned int		suspend_freq; /* freq to set during suspend */
335dc3335   Thiago Farina   [CPUFREQ] cpufreq...
79
  	unsigned int		policy; /* see above */
69030dd1c   Srinivas Pandruvada   cpufreq: use last...
80
  	unsigned int		last_policy; /* policy before unplug */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  	struct cpufreq_governor	*governor; /* see below */
7bd353a99   Viresh Kumar   cpufreq: Add per ...
82
  	void			*governor_data;
4573237b0   Viresh Kumar   cpufreq: Manage g...
83
  	char			last_governor[CPUFREQ_NAME_LEN]; /* last governor used */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
  	struct work_struct	update; /* if update_policy() needs to be
  					 * called, but you're in IRQ context */
c7a7b418d   Viresh Kumar   cpufreq: rename c...
87
  	struct cpufreq_user_policy user_policy;
e0b3165ba   Viresh Kumar   cpufreq: add 'fre...
88
  	struct cpufreq_frequency_table	*freq_table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
89
  	enum cpufreq_table_sorting freq_table_sorted;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90

c88a1f8b9   Lukasz Majewski   cpufreq: Store cp...
91
  	struct list_head        policy_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
  	struct kobject		kobj;
  	struct completion	kobj_unregister;
ad7722dab   viresh kumar   cpufreq: create p...
94
95
96
97
98
99
100
101
  
  	/*
  	 * The rules for this semaphore:
  	 * - Any routine that wants to read from the policy structure will
  	 *   do a down_read on this semaphore.
  	 * - Any routine that will write to the policy structure and/or may take away
  	 *   the policy altogether (eg. CPU hotplug), will hold this lock in write
  	 *   mode before doing so.
ad7722dab   viresh kumar   cpufreq: create p...
102
103
  	 */
  	struct rw_semaphore	rwsem;
12478cf0c   Srivatsa S. Bhat   cpufreq: Make sur...
104

b7898fda5   Rafael J. Wysocki   cpufreq: Support ...
105
106
107
108
109
110
  	/*
  	 * Fast switch flags:
  	 * - fast_switch_possible should be set by the driver if it can
  	 *   guarantee that frequency can be changed on any CPU sharing the
  	 *   policy and that the change will affect all of the policy CPUs then.
  	 * - fast_switch_enabled is to be set by governors that support fast
565ebe807   Viresh Kumar   cpufreq: Fix typo...
111
  	 *   frequency switching with the help of cpufreq_enable_fast_switch().
b7898fda5   Rafael J. Wysocki   cpufreq: Support ...
112
113
114
  	 */
  	bool			fast_switch_possible;
  	bool			fast_switch_enabled;
1b72e7fd3   Rafael J. Wysocki   cpufreq: scheduti...
115
116
117
118
119
120
  	/*
  	 * Preferred average time interval between consecutive invocations of
  	 * the driver to set the frequency for this policy.  To be set by the
  	 * scaling driver (0, which is the default, means no preference).
  	 */
  	unsigned int		transition_delay_us;
99d14d0e1   Viresh Kumar   cpufreq: Process ...
121
122
123
124
125
126
127
128
  	/*
  	 * Remote DVFS flag (Not added to the driver structure as we don't want
  	 * to access another structure from scheduler hotpath).
  	 *
  	 * Should be set if CPUs can do DVFS on behalf of other CPUs from
  	 * different cpufreq policies.
  	 */
  	bool			dvfs_possible_from_any_cpu;
e3c062360   Steve Muckle   cpufreq: add cpuf...
129
130
131
  	 /* Cached frequency lookup from cpufreq_driver_resolve_freq. */
  	unsigned int cached_target_freq;
  	int cached_resolved_idx;
12478cf0c   Srivatsa S. Bhat   cpufreq: Make sur...
132
133
134
135
  	/* Synchronization for frequency transitions */
  	bool			transition_ongoing; /* Tracks transition status */
  	spinlock_t		transition_lock;
  	wait_queue_head_t	transition_wait;
ca654dc3a   Srivatsa S. Bhat   cpufreq: Catch do...
136
  	struct task_struct	*transition_task; /* Task which is doing the transition */
413fffc3a   Viresh Kumar   cpufreq: Add supp...
137

a9aaf2915   Viresh Kumar   cpufreq: stats: g...
138
139
  	/* cpufreq-stats */
  	struct cpufreq_stats	*stats;
413fffc3a   Viresh Kumar   cpufreq: Add supp...
140
141
  	/* For cpufreq driver's internal use */
  	void			*driver_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  };
62b36cc1c   Viresh Kumar   cpufreq: Remove u...
143
  /* Only for ACPI */
46f18e3a2   Venkatesh Pallipadi   ACPI: HW P-state ...
144
145
146
147
  #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */
  #define CPUFREQ_SHARED_TYPE_HW	 (1) /* HW does needed coordination */
  #define CPUFREQ_SHARED_TYPE_ALL	 (2) /* All dependent CPUs should set freq */
  #define CPUFREQ_SHARED_TYPE_ANY	 (3) /* Freq can be set from any dependent CPU*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148

c75b505dd   Daniel Vetter   cpufreq: Add dumm...
149
  #ifdef CONFIG_CPU_FREQ
1f0bd44e9   Rafael J. Wysocki   cpufreq: acpi-cpu...
150
  struct cpufreq_policy *cpufreq_cpu_get_raw(unsigned int cpu);
74aca95da   Viresh Kumar   cpufreq: Re-arran...
151
  struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu);
3a3e9e06d   Viresh Kumar   cpufreq: Give con...
152
  void cpufreq_cpu_put(struct cpufreq_policy *policy);
c75b505dd   Daniel Vetter   cpufreq: Add dumm...
153
  #else
1f0bd44e9   Rafael J. Wysocki   cpufreq: acpi-cpu...
154
155
156
157
  static inline struct cpufreq_policy *cpufreq_cpu_get_raw(unsigned int cpu)
  {
  	return NULL;
  }
c75b505dd   Daniel Vetter   cpufreq: Add dumm...
158
159
160
161
162
163
  static inline struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu)
  {
  	return NULL;
  }
  static inline void cpufreq_cpu_put(struct cpufreq_policy *policy) { }
  #endif
74aca95da   Viresh Kumar   cpufreq: Re-arran...
164

2624f90c1   Fabio Baltieri   cpufreq: governor...
165
166
167
168
  static inline bool policy_is_shared(struct cpufreq_policy *policy)
  {
  	return cpumask_weight(policy->cpus) > 1;
  }
74aca95da   Viresh Kumar   cpufreq: Re-arran...
169
170
  /* /sys/devices/system/cpu/cpufreq: entry point for global variables */
  extern struct kobject *cpufreq_global_kobject;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171

74aca95da   Viresh Kumar   cpufreq: Re-arran...
172
173
174
175
176
  #ifdef CONFIG_CPU_FREQ
  unsigned int cpufreq_get(unsigned int cpu);
  unsigned int cpufreq_quick_get(unsigned int cpu);
  unsigned int cpufreq_quick_get_max(unsigned int cpu);
  void disable_cpufreq(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177

74aca95da   Viresh Kumar   cpufreq: Re-arran...
178
179
  u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy);
  int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
30248feff   Rafael J. Wysocki   cpufreq: Make cpu...
180
  void cpufreq_update_policy(unsigned int cpu);
74aca95da   Viresh Kumar   cpufreq: Re-arran...
181
182
  bool have_governor_per_policy(void);
  struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy);
b7898fda5   Rafael J. Wysocki   cpufreq: Support ...
183
  void cpufreq_enable_fast_switch(struct cpufreq_policy *policy);
6c9d9c819   Rafael J. Wysocki   cpufreq: Call cpu...
184
  void cpufreq_disable_fast_switch(struct cpufreq_policy *policy);
74aca95da   Viresh Kumar   cpufreq: Re-arran...
185
186
  #else
  static inline unsigned int cpufreq_get(unsigned int cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
  {
74aca95da   Viresh Kumar   cpufreq: Re-arran...
188
189
190
191
192
193
194
195
196
197
198
  	return 0;
  }
  static inline unsigned int cpufreq_quick_get(unsigned int cpu)
  {
  	return 0;
  }
  static inline unsigned int cpufreq_quick_get_max(unsigned int cpu)
  {
  	return 0;
  }
  static inline void disable_cpufreq(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200

1aefc75b2   Rafael J. Wysocki   cpufreq: stats: M...
201
202
203
204
205
206
207
208
209
210
211
  #ifdef CONFIG_CPU_FREQ_STAT
  void cpufreq_stats_create_table(struct cpufreq_policy *policy);
  void cpufreq_stats_free_table(struct cpufreq_policy *policy);
  void cpufreq_stats_record_transition(struct cpufreq_policy *policy,
  				     unsigned int new_freq);
  #else
  static inline void cpufreq_stats_create_table(struct cpufreq_policy *policy) { }
  static inline void cpufreq_stats_free_table(struct cpufreq_policy *policy) { }
  static inline void cpufreq_stats_record_transition(struct cpufreq_policy *policy,
  						   unsigned int new_freq) { }
  #endif /* CONFIG_CPU_FREQ_STAT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
  /*********************************************************************
74aca95da   Viresh Kumar   cpufreq: Re-arran...
213
   *                      CPUFREQ DRIVER INTERFACE                     *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
   *********************************************************************/
74aca95da   Viresh Kumar   cpufreq: Re-arran...
215
216
  #define CPUFREQ_RELATION_L 0  /* lowest frequency at or above target */
  #define CPUFREQ_RELATION_H 1  /* highest frequency below or at target */
5b0c0b16d   Stratos Karafotis   cpufreq: Introduc...
217
  #define CPUFREQ_RELATION_C 2  /* closest frequency to target */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218

74aca95da   Viresh Kumar   cpufreq: Re-arran...
219
220
221
222
  struct freq_attr {
  	struct attribute attr;
  	ssize_t (*show)(struct cpufreq_policy *, char *);
  	ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
  };
74aca95da   Viresh Kumar   cpufreq: Re-arran...
224
225
226
  #define cpufreq_freq_attr_ro(_name)		\
  static struct freq_attr _name =			\
  __ATTR(_name, 0444, show_##_name, NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227

74aca95da   Viresh Kumar   cpufreq: Re-arran...
228
229
230
  #define cpufreq_freq_attr_ro_perm(_name, _perm)	\
  static struct freq_attr _name =			\
  __ATTR(_name, _perm, show_##_name, NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231

74aca95da   Viresh Kumar   cpufreq: Re-arran...
232
233
234
  #define cpufreq_freq_attr_rw(_name)		\
  static struct freq_attr _name =			\
  __ATTR(_name, 0644, show_##_name, store_##_name)
ee7930ee2   Markus Mayer   cpufreq: stats: N...
235
236
237
  #define cpufreq_freq_attr_wo(_name)		\
  static struct freq_attr _name =			\
  __ATTR(_name, 0200, NULL, store_##_name)
74aca95da   Viresh Kumar   cpufreq: Re-arran...
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
  struct global_attr {
  	struct attribute attr;
  	ssize_t (*show)(struct kobject *kobj,
  			struct attribute *attr, char *buf);
  	ssize_t (*store)(struct kobject *a, struct attribute *b,
  			 const char *c, size_t count);
  };
  
  #define define_one_global_ro(_name)		\
  static struct global_attr _name =		\
  __ATTR(_name, 0444, show_##_name, NULL)
  
  #define define_one_global_rw(_name)		\
  static struct global_attr _name =		\
  __ATTR(_name, 0644, show_##_name, store_##_name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
  
  struct cpufreq_driver {
90452e611   Viresh Kumar   cpufreq: Fix form...
256
257
258
  	char		name[CPUFREQ_NAME_LEN];
  	u8		flags;
  	void		*driver_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
260
  
  	/* needed by all drivers */
90452e611   Viresh Kumar   cpufreq: Fix form...
261
262
  	int		(*init)(struct cpufreq_policy *policy);
  	int		(*verify)(struct cpufreq_policy *policy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
  
  	/* define one out of two */
90452e611   Viresh Kumar   cpufreq: Fix form...
265
  	int		(*setpolicy)(struct cpufreq_policy *policy);
1c03a2d04   Viresh Kumar   cpufreq: add supp...
266
267
268
269
270
  
  	/*
  	 * On failure, should always restore frequency to policy->restore_freq
  	 * (i.e. old freq).
  	 */
90452e611   Viresh Kumar   cpufreq: Fix form...
271
272
273
274
275
  	int		(*target)(struct cpufreq_policy *policy,
  				  unsigned int target_freq,
  				  unsigned int relation);	/* Deprecated */
  	int		(*target_index)(struct cpufreq_policy *policy,
  					unsigned int index);
b7898fda5   Rafael J. Wysocki   cpufreq: Support ...
276
277
  	unsigned int	(*fast_switch)(struct cpufreq_policy *policy,
  				       unsigned int target_freq);
e3c062360   Steve Muckle   cpufreq: add cpuf...
278
279
280
281
282
283
284
285
286
  
  	/*
  	 * Caches and returns the lowest driver-supported frequency greater than
  	 * or equal to the target frequency, subject to any driver limitations.
  	 * Does not set the frequency. Only to be implemented for drivers with
  	 * target().
  	 */
  	unsigned int	(*resolve_freq)(struct cpufreq_policy *policy,
  					unsigned int target_freq);
1c03a2d04   Viresh Kumar   cpufreq: add supp...
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
  	/*
  	 * Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION
  	 * unset.
  	 *
  	 * get_intermediate should return a stable intermediate frequency
  	 * platform wants to switch to and target_intermediate() should set CPU
  	 * to to that frequency, before jumping to the frequency corresponding
  	 * to 'index'. Core will take care of sending notifications and driver
  	 * doesn't have to handle them in target_intermediate() or
  	 * target_index().
  	 *
  	 * Drivers can return '0' from get_intermediate() in case they don't
  	 * wish to switch to intermediate frequency for some target frequency.
  	 * In that case core will directly call ->target_index().
  	 */
90452e611   Viresh Kumar   cpufreq: Fix form...
302
303
304
305
  	unsigned int	(*get_intermediate)(struct cpufreq_policy *policy,
  					    unsigned int index);
  	int		(*target_intermediate)(struct cpufreq_policy *policy,
  					       unsigned int index);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
307
  
  	/* should be defined, if possible */
90452e611   Viresh Kumar   cpufreq: Fix form...
308
  	unsigned int	(*get)(unsigned int cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
  
  	/* optional */
90452e611   Viresh Kumar   cpufreq: Fix form...
311
  	int		(*bios_limit)(int cpu, unsigned int *limit);
bf0b90e35   venkatesh.pallipadi@intel.com   [CPUFREQ][1/6] cp...
312

90452e611   Viresh Kumar   cpufreq: Fix form...
313
314
315
316
  	int		(*exit)(struct cpufreq_policy *policy);
  	void		(*stop_cpu)(struct cpufreq_policy *policy);
  	int		(*suspend)(struct cpufreq_policy *policy);
  	int		(*resume)(struct cpufreq_policy *policy);
7c45cf31b   Viresh Kumar   cpufreq: Introduc...
317
318
319
  
  	/* Will be called after the driver is fully initialized */
  	void		(*ready)(struct cpufreq_policy *policy);
90452e611   Viresh Kumar   cpufreq: Fix form...
320
  	struct freq_attr **attr;
6f19efc0a   Lukasz Majewski   cpufreq: Add boos...
321
322
  
  	/* platform specific boost support code */
90452e611   Viresh Kumar   cpufreq: Fix form...
323
324
  	bool		boost_enabled;
  	int		(*set_boost)(int state);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
327
  };
  
  /* flags */
6461f018e   Viresh Kumar   cpufreq: rewrite ...
328
329
330
331
332
333
334
335
  #define CPUFREQ_STICKY		(1 << 0)	/* driver isn't removed even if
  						   all ->init() calls failed */
  #define CPUFREQ_CONST_LOOPS	(1 << 1)	/* loops_per_jiffy or other
  						   kernel "constants" aren't
  						   affected by frequency
  						   transitions */
  #define CPUFREQ_PM_NO_WARN	(1 << 2)	/* don't warn on suspend/resume
  						   speed mismatches */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336

0b981e707   Viresh Kumar   cpufreq: use cpuf...
337
338
339
340
341
342
343
  /*
   * This should be set by platforms having multiple clock-domains, i.e.
   * supporting multiple policies. With this sysfs directories of governor would
   * be created in cpu/cpu<num>/cpufreq/ directory and so they can use the same
   * governor with different tunables for different clusters.
   */
  #define CPUFREQ_HAVE_GOVERNOR_PER_POLICY (1 << 3)
7dbf694db   Viresh Kumar   cpufreq: distingu...
344
345
346
347
348
349
  /*
   * Driver will do POSTCHANGE notifications from outside of their ->target()
   * routine and so must set cpufreq_driver->flags with this flag, so that core
   * can handle them specially.
   */
  #define CPUFREQ_ASYNC_NOTIFICATION  (1 << 4)
ae6b42713   Viresh Kumar   cpufreq: Mark ARM...
350
351
352
353
354
355
356
357
  /*
   * Set by drivers which want cpufreq core to check if CPU is running at a
   * frequency present in freq-table exposed by the driver. For these drivers if
   * CPU is found running at an out of table freq, we will try to set it to a freq
   * from the table. And if that fails, we will stop further boot process by
   * issuing a BUG_ON().
   */
  #define CPUFREQ_NEED_INITIAL_FREQ_CHECK	(1 << 5)
fe829ed8e   Viresh Kumar   cpufreq: Add CPUF...
358
359
360
361
362
  /*
   * Set by drivers to disallow use of governors with "dynamic_switching" flag
   * set.
   */
  #define CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING (1 << 6)
221dee285   Linus Torvalds   Revert "[CPUFREQ]...
363
364
  int cpufreq_register_driver(struct cpufreq_driver *driver_data);
  int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365

74aca95da   Viresh Kumar   cpufreq: Re-arran...
366
  const char *cpufreq_get_current_driver(void);
51315cdfa   Thomas Petazzoni   cpufreq: allow dr...
367
  void *cpufreq_get_driver_data(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368

bb176f7d0   Viresh Kumar   cpufreq: Fix mino...
369
370
  static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
  		unsigned int min, unsigned int max)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
372
373
374
375
376
377
378
379
380
381
382
383
  {
  	if (policy->min < min)
  		policy->min = min;
  	if (policy->max < min)
  		policy->max = min;
  	if (policy->min > max)
  		policy->min = max;
  	if (policy->max > max)
  		policy->max = max;
  	if (policy->min > policy->max)
  		policy->min = policy->max;
  	return;
  }
be49e3465   Viresh Kumar   cpufreq: add new ...
384
385
386
387
388
389
  static inline void
  cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy)
  {
  	cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
  			policy->cpuinfo.max_freq);
  }
2f0aea936   Viresh Kumar   cpufreq: suspend ...
390
391
392
  #ifdef CONFIG_CPU_FREQ
  void cpufreq_suspend(void);
  void cpufreq_resume(void);
e28867eab   Viresh Kumar   cpufreq: Implemen...
393
  int cpufreq_generic_suspend(struct cpufreq_policy *policy);
2f0aea936   Viresh Kumar   cpufreq: suspend ...
394
395
396
397
  #else
  static inline void cpufreq_suspend(void) {}
  static inline void cpufreq_resume(void) {}
  #endif
74aca95da   Viresh Kumar   cpufreq: Re-arran...
398
399
400
  /*********************************************************************
   *                     CPUFREQ NOTIFIER INTERFACE                    *
   *********************************************************************/
6dad2a296   Borislav Petkov   cpufreq: Unify sy...
401

74aca95da   Viresh Kumar   cpufreq: Re-arran...
402
403
  #define CPUFREQ_TRANSITION_NOTIFIER	(0)
  #define CPUFREQ_POLICY_NOTIFIER		(1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404

74aca95da   Viresh Kumar   cpufreq: Re-arran...
405
406
407
  /* Transition notifiers */
  #define CPUFREQ_PRECHANGE		(0)
  #define CPUFREQ_POSTCHANGE		(1)
6dad2a296   Borislav Petkov   cpufreq: Unify sy...
408

74aca95da   Viresh Kumar   cpufreq: Re-arran...
409
410
  /* Policy Notifiers  */
  #define CPUFREQ_ADJUST			(0)
6bfb7c743   Viresh Kumar   cpufreq: remove r...
411
  #define CPUFREQ_NOTIFY			(1)
6dad2a296   Borislav Petkov   cpufreq: Unify sy...
412

74aca95da   Viresh Kumar   cpufreq: Re-arran...
413
414
415
  #ifdef CONFIG_CPU_FREQ
  int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
  int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
6dad2a296   Borislav Petkov   cpufreq: Unify sy...
416

12478cf0c   Srivatsa S. Bhat   cpufreq: Make sur...
417
418
419
420
  void cpufreq_freq_transition_begin(struct cpufreq_policy *policy,
  		struct cpufreq_freqs *freqs);
  void cpufreq_freq_transition_end(struct cpufreq_policy *policy,
  		struct cpufreq_freqs *freqs, int transition_failed);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
421

74aca95da   Viresh Kumar   cpufreq: Re-arran...
422
423
424
  #else /* CONFIG_CPU_FREQ */
  static inline int cpufreq_register_notifier(struct notifier_block *nb,
  						unsigned int list)
2eca40a8c   Randy Dunlap   cpufreq: add cpuf...
425
426
427
  {
  	return 0;
  }
74aca95da   Viresh Kumar   cpufreq: Re-arran...
428
429
  static inline int cpufreq_unregister_notifier(struct notifier_block *nb,
  						unsigned int list)
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
430
431
432
  {
  	return 0;
  }
74aca95da   Viresh Kumar   cpufreq: Re-arran...
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  #endif /* !CONFIG_CPU_FREQ */
  
  /**
   * cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch
   * safe)
   * @old:   old value
   * @div:   divisor
   * @mult:  multiplier
   *
   *
   * new = old * mult / div
   */
  static inline unsigned long cpufreq_scale(unsigned long old, u_int div,
  		u_int mult)
3d7371088   Jesse Barnes   cpufreq: expose a...
447
  {
74aca95da   Viresh Kumar   cpufreq: Re-arran...
448
449
450
451
452
453
454
455
456
  #if BITS_PER_LONG == 32
  	u64 result = ((u64) old) * ((u64) mult);
  	do_div(result, div);
  	return (unsigned long) result;
  
  #elif BITS_PER_LONG == 64
  	unsigned long result = old * ((u64) mult);
  	result /= div;
  	return result;
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
457
  #endif
74aca95da   Viresh Kumar   cpufreq: Re-arran...
458
  }
95235ca2c   Venkatesh Pallipadi   [CPUFREQ] CPU fre...
459

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
460
  /*********************************************************************
74aca95da   Viresh Kumar   cpufreq: Re-arran...
461
   *                          CPUFREQ GOVERNORS                        *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
   *********************************************************************/
1c2562459   Thomas Renninger   [CPUFREQ] allow o...
463
  /*
74aca95da   Viresh Kumar   cpufreq: Re-arran...
464
465
466
467
468
469
   * If (cpufreq_driver->target) exists, the ->governor decides what frequency
   * within the limits is used. If (cpufreq_driver->setpolicy> exists, these
   * two generic policies are available:
   */
  #define CPUFREQ_POLICY_POWERSAVE	(1)
  #define CPUFREQ_POLICY_PERFORMANCE	(2)
379480d82   Rafael J. Wysocki   cpufreq: Move gov...
470
471
472
473
474
  /*
   * The polling frequency depends on the capability of the processor. Default
   * polling frequency is 1000 times the transition latency of the processor. The
   * ondemand governor will work on any processor with transition latency <= 10ms,
   * using appropriate sampling rate.
379480d82   Rafael J. Wysocki   cpufreq: Move gov...
475
   */
379480d82   Rafael J. Wysocki   cpufreq: Move gov...
476
  #define LATENCY_MULTIPLIER		(1000)
379480d82   Rafael J. Wysocki   cpufreq: Move gov...
477

74aca95da   Viresh Kumar   cpufreq: Re-arran...
478
479
  struct cpufreq_governor {
  	char	name[CPUFREQ_NAME_LEN];
e788892ba   Rafael J. Wysocki   cpufreq: governor...
480
481
482
483
484
  	int	(*init)(struct cpufreq_policy *policy);
  	void	(*exit)(struct cpufreq_policy *policy);
  	int	(*start)(struct cpufreq_policy *policy);
  	void	(*stop)(struct cpufreq_policy *policy);
  	void	(*limits)(struct cpufreq_policy *policy);
74aca95da   Viresh Kumar   cpufreq: Re-arran...
485
486
487
488
  	ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy,
  					 char *buf);
  	int	(*store_setspeed)	(struct cpufreq_policy *policy,
  					 unsigned int freq);
ed4676e25   Viresh Kumar   cpufreq: Replace ...
489
490
  	/* For governors which change frequency dynamically by themselves */
  	bool			dynamic_switching;
74aca95da   Viresh Kumar   cpufreq: Re-arran...
491
492
493
494
495
  	struct list_head	governor_list;
  	struct module		*owner;
  };
  
  /* Pass a target to the cpufreq driver */
b7898fda5   Rafael J. Wysocki   cpufreq: Support ...
496
497
  unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy,
  					unsigned int target_freq);
74aca95da   Viresh Kumar   cpufreq: Re-arran...
498
499
500
501
502
503
  int cpufreq_driver_target(struct cpufreq_policy *policy,
  				 unsigned int target_freq,
  				 unsigned int relation);
  int __cpufreq_driver_target(struct cpufreq_policy *policy,
  				   unsigned int target_freq,
  				   unsigned int relation);
e3c062360   Steve Muckle   cpufreq: add cpuf...
504
505
  unsigned int cpufreq_driver_resolve_freq(struct cpufreq_policy *policy,
  					 unsigned int target_freq);
aa7519af4   Viresh Kumar   cpufreq: Use tran...
506
  unsigned int cpufreq_policy_transition_delay_us(struct cpufreq_policy *policy);
74aca95da   Viresh Kumar   cpufreq: Re-arran...
507
508
  int cpufreq_register_governor(struct cpufreq_governor *governor);
  void cpufreq_unregister_governor(struct cpufreq_governor *governor);
de1df26b7   Rafael J. Wysocki   cpufreq: Clean up...
509
510
  struct cpufreq_governor *cpufreq_default_governor(void);
  struct cpufreq_governor *cpufreq_fallback_governor(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
511

bf2be2de8   Viresh Kumar   cpufreq: governor...
512
513
514
515
516
517
518
  static inline void cpufreq_policy_apply_limits(struct cpufreq_policy *policy)
  {
  	if (policy->max < policy->cur)
  		__cpufreq_driver_target(policy, policy->max, CPUFREQ_RELATION_H);
  	else if (policy->min > policy->cur)
  		__cpufreq_driver_target(policy, policy->min, CPUFREQ_RELATION_L);
  }
66893b6ac   Rafael J. Wysocki   cpufreq: Move gov...
519
520
521
522
523
524
525
  /* Governor attribute set */
  struct gov_attr_set {
  	struct kobject kobj;
  	struct list_head policy_list;
  	struct mutex update_lock;
  	int usage_count;
  };
0f4892eae   Viresh Kumar   cpufreq: Move gov...
526
527
528
529
530
531
532
533
534
535
536
  #define gov_attr_ro(_name)						\
  static struct governor_attr _name =					\
  __ATTR(_name, 0444, show_##_name, NULL)
  
  #define gov_attr_wo(_name)						\
  static struct governor_attr _name =					\
  __ATTR(_name, 0200, NULL, store_##_name)
  
  #define gov_attr_rw(_name)						\
  static struct governor_attr _name =					\
  __ATTR(_name, 0644, show_##_name, store_##_name)
66893b6ac   Rafael J. Wysocki   cpufreq: Move gov...
537
538
539
540
541
542
543
544
545
546
547
548
549
550
  /* sysfs ops for cpufreq governors */
  extern const struct sysfs_ops governor_sysfs_ops;
  
  void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node);
  void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node);
  unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node);
  
  /* Governor sysfs attribute */
  struct governor_attr {
  	struct attribute attr;
  	ssize_t (*show)(struct gov_attr_set *attr_set, char *buf);
  	ssize_t (*store)(struct gov_attr_set *attr_set, const char *buf,
  			 size_t count);
  };
674e75411   Viresh Kumar   sched: cpufreq: A...
551
552
  static inline bool cpufreq_can_do_remote_dvfs(struct cpufreq_policy *policy)
  {
99d14d0e1   Viresh Kumar   cpufreq: Process ...
553
554
555
556
557
  	/*
  	 * Allow remote callbacks if:
  	 * - dvfs_possible_from_any_cpu flag is set
  	 * - the local and remote CPUs share cpufreq policy
  	 */
d6344d4b5   Rafael J. Wysocki   cpufreq: Simplify...
558
559
  	return policy->dvfs_possible_from_any_cpu ||
  		cpumask_test_cpu(smp_processor_id(), policy->cpus);
674e75411   Viresh Kumar   sched: cpufreq: A...
560
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
562
563
  /*********************************************************************
   *                     FREQUENCY TABLE HELPERS                       *
   *********************************************************************/
7f4b04614   Viresh Kumar   cpufreq: create a...
564
  /* Special Values of .frequency field */
2b1987a9f   Brian W Hart   cpufreq: make tab...
565
566
  #define CPUFREQ_ENTRY_INVALID	~0u
  #define CPUFREQ_TABLE_END	~1u
7f4b04614   Viresh Kumar   cpufreq: create a...
567
568
  /* Special Values of .flags field */
  #define CPUFREQ_BOOST_FREQ	(1 << 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
570
  
  struct cpufreq_frequency_table {
7f4b04614   Viresh Kumar   cpufreq: create a...
571
  	unsigned int	flags;
507015880   Viresh Kumar   cpufreq: rename i...
572
  	unsigned int	driver_data; /* driver specific data, not used by core */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
574
575
  	unsigned int	frequency; /* kHz - doesn't need to be in ascending
  				    * order */
  };
a0dd7b796   Nishanth Menon   PM / OPP: Move cp...
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
  #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)
  int dev_pm_opp_init_cpufreq_table(struct device *dev,
  				  struct cpufreq_frequency_table **table);
  void dev_pm_opp_free_cpufreq_table(struct device *dev,
  				   struct cpufreq_frequency_table **table);
  #else
  static inline int dev_pm_opp_init_cpufreq_table(struct device *dev,
  						struct cpufreq_frequency_table
  						**table)
  {
  	return -EINVAL;
  }
  
  static inline void dev_pm_opp_free_cpufreq_table(struct device *dev,
  						 struct cpufreq_frequency_table
  						 **table)
  {
  }
  #endif
27e289dce   Stratos Karafotis   cpufreq: Introduc...
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
  /*
   * cpufreq_for_each_entry -	iterate over a cpufreq_frequency_table
   * @pos:	the cpufreq_frequency_table * to use as a loop cursor.
   * @table:	the cpufreq_frequency_table * to iterate over.
   */
  
  #define cpufreq_for_each_entry(pos, table)	\
  	for (pos = table; pos->frequency != CPUFREQ_TABLE_END; pos++)
  
  /*
   * cpufreq_for_each_valid_entry -     iterate over a cpufreq_frequency_table
   *	excluding CPUFREQ_ENTRY_INVALID frequencies.
   * @pos:        the cpufreq_frequency_table * to use as a loop cursor.
   * @table:      the cpufreq_frequency_table * to iterate over.
   */
34b087051   Rafael J. Wysocki   cpufreq: Simplify...
610
611
612
613
614
  #define cpufreq_for_each_valid_entry(pos, table)			\
  	for (pos = table; pos->frequency != CPUFREQ_TABLE_END; pos++)	\
  		if (pos->frequency == CPUFREQ_ENTRY_INVALID)		\
  			continue;					\
  		else
27e289dce   Stratos Karafotis   cpufreq: Introduc...
615

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
617
618
619
620
  int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
  				    struct cpufreq_frequency_table *table);
  
  int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
  				   struct cpufreq_frequency_table *table);
184345129   Viresh Kumar   cpufreq: define g...
621
  int cpufreq_generic_frequency_table_verify(struct cpufreq_policy *policy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
622

da0c6dc00   Viresh Kumar   cpufreq: Handle s...
623
624
625
  int cpufreq_table_index_unsorted(struct cpufreq_policy *policy,
  				 unsigned int target_freq,
  				 unsigned int relation);
d3916691c   Viresh Kumar   cpufreq: Make sur...
626
627
  int cpufreq_frequency_table_get_index(struct cpufreq_policy *policy,
  		unsigned int freq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
628

74aca95da   Viresh Kumar   cpufreq: Re-arran...
629
  ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
6f19efc0a   Lukasz Majewski   cpufreq: Add boos...
630
631
  #ifdef CONFIG_CPU_FREQ
  int cpufreq_boost_trigger_state(int state);
6f19efc0a   Lukasz Majewski   cpufreq: Add boos...
632
  int cpufreq_boost_enabled(void);
44139ed49   Viresh Kumar   cpufreq: Allow dr...
633
634
  int cpufreq_enable_boost_support(void);
  bool policy_has_boost_freq(struct cpufreq_policy *policy);
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
635
636
637
638
639
640
  
  /* Find lowest freq at or above target in a table in ascending order */
  static inline int cpufreq_table_find_index_al(struct cpufreq_policy *policy,
  					      unsigned int target_freq)
  {
  	struct cpufreq_frequency_table *table = policy->freq_table;
899bb6642   Aaro Koskinen   cpufreq: skip inv...
641
  	struct cpufreq_frequency_table *pos, *best = table - 1;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
642
  	unsigned int freq;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
643

899bb6642   Aaro Koskinen   cpufreq: skip inv...
644
645
  	cpufreq_for_each_valid_entry(pos, table) {
  		freq = pos->frequency;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
646
647
  
  		if (freq >= target_freq)
899bb6642   Aaro Koskinen   cpufreq: skip inv...
648
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
649

899bb6642   Aaro Koskinen   cpufreq: skip inv...
650
  		best = pos;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
651
  	}
899bb6642   Aaro Koskinen   cpufreq: skip inv...
652
  	return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
653
654
655
656
657
658
659
  }
  
  /* Find lowest freq at or above target in a table in descending order */
  static inline int cpufreq_table_find_index_dl(struct cpufreq_policy *policy,
  					      unsigned int target_freq)
  {
  	struct cpufreq_frequency_table *table = policy->freq_table;
899bb6642   Aaro Koskinen   cpufreq: skip inv...
660
  	struct cpufreq_frequency_table *pos, *best = table - 1;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
661
  	unsigned int freq;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
662

899bb6642   Aaro Koskinen   cpufreq: skip inv...
663
664
  	cpufreq_for_each_valid_entry(pos, table) {
  		freq = pos->frequency;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
665
666
  
  		if (freq == target_freq)
899bb6642   Aaro Koskinen   cpufreq: skip inv...
667
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
668
669
  
  		if (freq > target_freq) {
899bb6642   Aaro Koskinen   cpufreq: skip inv...
670
  			best = pos;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
671
672
673
674
  			continue;
  		}
  
  		/* No freq found above target_freq */
899bb6642   Aaro Koskinen   cpufreq: skip inv...
675
676
  		if (best == table - 1)
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
677

c6fe46a79   Sergey Senozhatsky   cpufreq: fix over...
678
  		return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
679
  	}
c6fe46a79   Sergey Senozhatsky   cpufreq: fix over...
680
  	return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
  }
  
  /* Works only on sorted freq-tables */
  static inline int cpufreq_table_find_index_l(struct cpufreq_policy *policy,
  					     unsigned int target_freq)
  {
  	target_freq = clamp_val(target_freq, policy->min, policy->max);
  
  	if (policy->freq_table_sorted == CPUFREQ_TABLE_SORTED_ASCENDING)
  		return cpufreq_table_find_index_al(policy, target_freq);
  	else
  		return cpufreq_table_find_index_dl(policy, target_freq);
  }
  
  /* Find highest freq at or below target in a table in ascending order */
  static inline int cpufreq_table_find_index_ah(struct cpufreq_policy *policy,
  					      unsigned int target_freq)
  {
  	struct cpufreq_frequency_table *table = policy->freq_table;
899bb6642   Aaro Koskinen   cpufreq: skip inv...
700
  	struct cpufreq_frequency_table *pos, *best = table - 1;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
701
  	unsigned int freq;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
702

899bb6642   Aaro Koskinen   cpufreq: skip inv...
703
704
  	cpufreq_for_each_valid_entry(pos, table) {
  		freq = pos->frequency;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
705
706
  
  		if (freq == target_freq)
899bb6642   Aaro Koskinen   cpufreq: skip inv...
707
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
708
709
  
  		if (freq < target_freq) {
899bb6642   Aaro Koskinen   cpufreq: skip inv...
710
  			best = pos;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
711
712
713
714
  			continue;
  		}
  
  		/* No freq found below target_freq */
899bb6642   Aaro Koskinen   cpufreq: skip inv...
715
716
  		if (best == table - 1)
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
717

899bb6642   Aaro Koskinen   cpufreq: skip inv...
718
  		return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
719
  	}
899bb6642   Aaro Koskinen   cpufreq: skip inv...
720
  	return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
721
722
723
724
725
726
727
  }
  
  /* Find highest freq at or below target in a table in descending order */
  static inline int cpufreq_table_find_index_dh(struct cpufreq_policy *policy,
  					      unsigned int target_freq)
  {
  	struct cpufreq_frequency_table *table = policy->freq_table;
899bb6642   Aaro Koskinen   cpufreq: skip inv...
728
  	struct cpufreq_frequency_table *pos, *best = table - 1;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
729
  	unsigned int freq;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
730

899bb6642   Aaro Koskinen   cpufreq: skip inv...
731
732
  	cpufreq_for_each_valid_entry(pos, table) {
  		freq = pos->frequency;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
733
734
  
  		if (freq <= target_freq)
899bb6642   Aaro Koskinen   cpufreq: skip inv...
735
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
736

899bb6642   Aaro Koskinen   cpufreq: skip inv...
737
  		best = pos;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
738
  	}
899bb6642   Aaro Koskinen   cpufreq: skip inv...
739
  	return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
  }
  
  /* Works only on sorted freq-tables */
  static inline int cpufreq_table_find_index_h(struct cpufreq_policy *policy,
  					     unsigned int target_freq)
  {
  	target_freq = clamp_val(target_freq, policy->min, policy->max);
  
  	if (policy->freq_table_sorted == CPUFREQ_TABLE_SORTED_ASCENDING)
  		return cpufreq_table_find_index_ah(policy, target_freq);
  	else
  		return cpufreq_table_find_index_dh(policy, target_freq);
  }
  
  /* Find closest freq to target in a table in ascending order */
  static inline int cpufreq_table_find_index_ac(struct cpufreq_policy *policy,
  					      unsigned int target_freq)
  {
  	struct cpufreq_frequency_table *table = policy->freq_table;
899bb6642   Aaro Koskinen   cpufreq: skip inv...
759
  	struct cpufreq_frequency_table *pos, *best = table - 1;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
760
  	unsigned int freq;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
761

899bb6642   Aaro Koskinen   cpufreq: skip inv...
762
763
  	cpufreq_for_each_valid_entry(pos, table) {
  		freq = pos->frequency;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
764
765
  
  		if (freq == target_freq)
899bb6642   Aaro Koskinen   cpufreq: skip inv...
766
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
767
768
  
  		if (freq < target_freq) {
899bb6642   Aaro Koskinen   cpufreq: skip inv...
769
  			best = pos;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
770
771
772
773
  			continue;
  		}
  
  		/* No freq found below target_freq */
899bb6642   Aaro Koskinen   cpufreq: skip inv...
774
775
  		if (best == table - 1)
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
776
777
  
  		/* Choose the closest freq */
899bb6642   Aaro Koskinen   cpufreq: skip inv...
778
779
  		if (target_freq - best->frequency > freq - target_freq)
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
780

899bb6642   Aaro Koskinen   cpufreq: skip inv...
781
  		return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
782
  	}
899bb6642   Aaro Koskinen   cpufreq: skip inv...
783
  	return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
784
785
786
787
788
789
790
  }
  
  /* Find closest freq to target in a table in descending order */
  static inline int cpufreq_table_find_index_dc(struct cpufreq_policy *policy,
  					      unsigned int target_freq)
  {
  	struct cpufreq_frequency_table *table = policy->freq_table;
899bb6642   Aaro Koskinen   cpufreq: skip inv...
791
  	struct cpufreq_frequency_table *pos, *best = table - 1;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
792
  	unsigned int freq;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
793

899bb6642   Aaro Koskinen   cpufreq: skip inv...
794
795
  	cpufreq_for_each_valid_entry(pos, table) {
  		freq = pos->frequency;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
796
797
  
  		if (freq == target_freq)
899bb6642   Aaro Koskinen   cpufreq: skip inv...
798
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
799
800
  
  		if (freq > target_freq) {
899bb6642   Aaro Koskinen   cpufreq: skip inv...
801
  			best = pos;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
802
803
804
805
  			continue;
  		}
  
  		/* No freq found above target_freq */
899bb6642   Aaro Koskinen   cpufreq: skip inv...
806
807
  		if (best == table - 1)
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
808
809
  
  		/* Choose the closest freq */
899bb6642   Aaro Koskinen   cpufreq: skip inv...
810
811
  		if (best->frequency - target_freq > target_freq - freq)
  			return pos - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
812

899bb6642   Aaro Koskinen   cpufreq: skip inv...
813
  		return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
814
  	}
899bb6642   Aaro Koskinen   cpufreq: skip inv...
815
  	return best - table;
da0c6dc00   Viresh Kumar   cpufreq: Handle s...
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
  }
  
  /* Works only on sorted freq-tables */
  static inline int cpufreq_table_find_index_c(struct cpufreq_policy *policy,
  					     unsigned int target_freq)
  {
  	target_freq = clamp_val(target_freq, policy->min, policy->max);
  
  	if (policy->freq_table_sorted == CPUFREQ_TABLE_SORTED_ASCENDING)
  		return cpufreq_table_find_index_ac(policy, target_freq);
  	else
  		return cpufreq_table_find_index_dc(policy, target_freq);
  }
  
  static inline int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
  						 unsigned int target_freq,
  						 unsigned int relation)
  {
  	if (unlikely(policy->freq_table_sorted == CPUFREQ_TABLE_UNSORTED))
  		return cpufreq_table_index_unsorted(policy, target_freq,
  						    relation);
  
  	switch (relation) {
  	case CPUFREQ_RELATION_L:
  		return cpufreq_table_find_index_l(policy, target_freq);
  	case CPUFREQ_RELATION_H:
  		return cpufreq_table_find_index_h(policy, target_freq);
  	case CPUFREQ_RELATION_C:
  		return cpufreq_table_find_index_c(policy, target_freq);
  	default:
  		pr_err("%s: Invalid relation: %d
  ", __func__, relation);
  		return -EINVAL;
  	}
  }
55d852931   Viresh Kumar   cpufreq: create c...
851
852
853
854
855
856
857
858
859
860
861
862
863
864
  
  static inline int cpufreq_table_count_valid_entries(const struct cpufreq_policy *policy)
  {
  	struct cpufreq_frequency_table *pos;
  	int count = 0;
  
  	if (unlikely(!policy->freq_table))
  		return 0;
  
  	cpufreq_for_each_valid_entry(pos, policy->freq_table)
  		count++;
  
  	return count;
  }
6f19efc0a   Lukasz Majewski   cpufreq: Add boos...
865
866
867
868
869
  #else
  static inline int cpufreq_boost_trigger_state(int state)
  {
  	return 0;
  }
6f19efc0a   Lukasz Majewski   cpufreq: Add boos...
870
871
872
873
  static inline int cpufreq_boost_enabled(void)
  {
  	return 0;
  }
44139ed49   Viresh Kumar   cpufreq: Allow dr...
874
875
876
877
878
879
880
881
882
883
  
  static inline int cpufreq_enable_boost_support(void)
  {
  	return -EINVAL;
  }
  
  static inline bool policy_has_boost_freq(struct cpufreq_policy *policy)
  {
  	return false;
  }
6f19efc0a   Lukasz Majewski   cpufreq: Add boos...
884
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
885

22af48be8   Rafael J. Wysocki   x86 / CPU: Always...
886
  extern void arch_freq_prepare_all(void);
f8475cef9   Len Brown   x86: use common a...
887
  extern unsigned int arch_freq_get_on_cpu(int cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
888
889
  /* the following are really really optional */
  extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
21c36d357   Bartlomiej Zolnierkiewicz   cpufreq-dt: make ...
890
  extern struct freq_attr cpufreq_freq_attr_scaling_boost_freqs;
184345129   Viresh Kumar   cpufreq: define g...
891
  extern struct freq_attr *cpufreq_generic_attr[];
27047a603   Viresh Kumar   cpufreq: Add new ...
892
893
  int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
  				      struct cpufreq_frequency_table *table);
f4fd37978   Lan Tianyu   acpi-cpufreq: Add...
894

652ed95d5   Viresh Kumar   cpufreq: introduc...
895
  unsigned int cpufreq_generic_get(unsigned int cpu);
70e9e7783   Viresh Kumar   cpufreq: create c...
896
897
898
  int cpufreq_generic_init(struct cpufreq_policy *policy,
  		struct cpufreq_frequency_table *table,
  		unsigned int transition_latency);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
899
  #endif /* _LINUX_CPUFREQ_H */