Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
devfreq.h
Go to the documentation of this file.
1 /*
2  * devfreq: Generic Dynamic Voltage and Frequency Scaling (DVFS) Framework
3  * for Non-CPU Devices.
4  *
5  * Copyright (C) 2011 Samsung Electronics
6  * MyungJoo Ham <[email protected]>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #ifndef __LINUX_DEVFREQ_H__
14 #define __LINUX_DEVFREQ_H__
15 
16 #include <linux/device.h>
17 #include <linux/notifier.h>
18 #include <linux/opp.h>
19 
20 #define DEVFREQ_NAME_LEN 16
21 
22 struct devfreq;
23 
40  /* both since the last measure */
41  unsigned long total_time;
42  unsigned long busy_time;
43  unsigned long current_frequency;
44  void *private_data;
45 };
46 
47 /*
48  * The resulting frequency should be at most this. (this bound is the
49  * least upper bound; thus, the resulting freq should be lower or same)
50  * If the flag is not set, the resulting frequency should be at most the
51  * bound (greatest lower bound)
52  */
53 #define DEVFREQ_FLAG_LEAST_UPPER_BOUND 0x1
54 
76  unsigned long initial_freq;
77  unsigned int polling_ms;
78 
79  int (*target)(struct device *dev, unsigned long *freq, u32 flags);
81  struct devfreq_dev_status *stat);
82  void (*exit)(struct device *dev);
83 };
84 
108  const char name[DEVFREQ_NAME_LEN];
109  int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
110  int (*init)(struct devfreq *this);
111  void (*exit)(struct devfreq *this);
112  const bool no_central_polling;
113 };
114 
148 struct devfreq {
149  struct list_head node;
150 
151  struct mutex lock;
152  struct device dev;
154  const struct devfreq_governor *governor;
156 
157  unsigned long polling_jiffies;
158  unsigned long previous_freq;
159  unsigned int next_polling;
160 
161  void *data; /* private data for governors */
162 
164 
165  unsigned long min_freq;
166  unsigned long max_freq;
167 };
168 
169 #if defined(CONFIG_PM_DEVFREQ)
170 extern struct devfreq *devfreq_add_device(struct device *dev,
172  const struct devfreq_governor *governor,
173  void *data);
174 extern int devfreq_remove_device(struct devfreq *devfreq);
175 
176 /* Helper functions for devfreq user device driver with OPP. */
177 extern struct opp *devfreq_recommended_opp(struct device *dev,
178  unsigned long *freq, u32 flags);
179 extern int devfreq_register_opp_notifier(struct device *dev,
180  struct devfreq *devfreq);
181 extern int devfreq_unregister_opp_notifier(struct device *dev,
182  struct devfreq *devfreq);
183 
184 #ifdef CONFIG_DEVFREQ_GOV_POWERSAVE
185 extern const struct devfreq_governor devfreq_powersave;
186 #endif
187 #ifdef CONFIG_DEVFREQ_GOV_PERFORMANCE
188 extern const struct devfreq_governor devfreq_performance;
189 #endif
190 #ifdef CONFIG_DEVFREQ_GOV_USERSPACE
191 extern const struct devfreq_governor devfreq_userspace;
192 #endif
193 #ifdef CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND
194 extern const struct devfreq_governor devfreq_simple_ondemand;
208 struct devfreq_simple_ondemand_data {
209  unsigned int upthreshold;
210  unsigned int downdifferential;
211 };
212 #endif
213 
214 #else /* !CONFIG_PM_DEVFREQ */
215 static struct devfreq *devfreq_add_device(struct device *dev,
217  struct devfreq_governor *governor,
218  void *data)
219 {
220  return NULL;
221 }
222 
223 static int devfreq_remove_device(struct devfreq *devfreq)
224 {
225  return 0;
226 }
227 
228 static struct opp *devfreq_recommended_opp(struct device *dev,
229  unsigned long *freq, u32 flags)
230 {
231  return -EINVAL;
232 }
233 
234 static int devfreq_register_opp_notifier(struct device *dev,
235  struct devfreq *devfreq)
236 {
237  return -EINVAL;
238 }
239 
240 static int devfreq_unregister_opp_notifier(struct device *dev,
241  struct devfreq *devfreq)
242 {
243  return -EINVAL;
244 }
245 
246 #define devfreq_powersave NULL
247 #define devfreq_performance NULL
248 #define devfreq_userspace NULL
249 #define devfreq_simple_ondemand NULL
250 
251 #endif /* CONFIG_PM_DEVFREQ */
252 
253 #endif /* __LINUX_DEVFREQ_H__ */