xref: /linux/include/linux/devfreq.h (revision f2ee442115c9b6219083c019939a9cc0c9abb2f8)
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 <myungjoo.ham@samsung.com>
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 
24 /**
25  * struct devfreq_dev_status - Data given from devfreq user device to
26  *			     governors. Represents the performance
27  *			     statistics.
28  * @total_time		The total time represented by this instance of
29  *			devfreq_dev_status
30  * @busy_time		The time that the device was working among the
31  *			total_time.
32  * @current_frequency	The operating frequency.
33  * @private_data	An entry not specified by the devfreq framework.
34  *			A device and a specific governor may have their
35  *			own protocol with private_data. However, because
36  *			this is governor-specific, a governor using this
37  *			will be only compatible with devices aware of it.
38  */
39 struct devfreq_dev_status {
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  * struct devfreq_dev_profile - Devfreq's user device profile
49  * @initial_freq	The operating frequency when devfreq_add_device() is
50  *			called.
51  * @polling_ms		The polling interval in ms. 0 disables polling.
52  * @target		The device should set its operating frequency at
53  *			freq or lowest-upper-than-freq value. If freq is
54  *			higher than any operable frequency, set maximum.
55  *			Before returning, target function should set
56  *			freq at the current frequency.
57  * @get_dev_status	The device should provide the current performance
58  *			status to devfreq, which is used by governors.
59  * @exit		An optional callback that is called when devfreq
60  *			is removing the devfreq object due to error or
61  *			from devfreq_remove_device() call. If the user
62  *			has registered devfreq->nb at a notifier-head,
63  *			this is the time to unregister it.
64  */
65 struct devfreq_dev_profile {
66 	unsigned long initial_freq;
67 	unsigned int polling_ms;
68 
69 	int (*target)(struct device *dev, unsigned long *freq);
70 	int (*get_dev_status)(struct device *dev,
71 			      struct devfreq_dev_status *stat);
72 	void (*exit)(struct device *dev);
73 };
74 
75 /**
76  * struct devfreq_governor - Devfreq policy governor
77  * @name		Governor's name
78  * @get_target_freq	Returns desired operating frequency for the device.
79  *			Basically, get_target_freq will run
80  *			devfreq_dev_profile.get_dev_status() to get the
81  *			status of the device (load = busy_time / total_time).
82  *			If no_central_polling is set, this callback is called
83  *			only with update_devfreq() notified by OPP.
84  * @init		Called when the devfreq is being attached to a device
85  * @exit		Called when the devfreq is being removed from a
86  *			device. Governor should stop any internal routines
87  *			before return because related data may be
88  *			freed after exit().
89  * @no_central_polling	Do not use devfreq's central polling mechanism.
90  *			When this is set, devfreq will not call
91  *			get_target_freq with devfreq_monitor(). However,
92  *			devfreq will call get_target_freq with
93  *			devfreq_update() notified by OPP framework.
94  *
95  * Note that the callbacks are called with devfreq->lock locked by devfreq.
96  */
97 struct devfreq_governor {
98 	const char name[DEVFREQ_NAME_LEN];
99 	int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
100 	int (*init)(struct devfreq *this);
101 	void (*exit)(struct devfreq *this);
102 	const bool no_central_polling;
103 };
104 
105 /**
106  * struct devfreq - Device devfreq structure
107  * @node	list node - contains the devices with devfreq that have been
108  *		registered.
109  * @lock	a mutex to protect accessing devfreq.
110  * @dev		device registered by devfreq class. dev.parent is the device
111  *		using devfreq.
112  * @profile	device-specific devfreq profile
113  * @governor	method how to choose frequency based on the usage.
114  * @nb		notifier block used to notify devfreq object that it should
115  *		reevaluate operable frequencies. Devfreq users may use
116  *		devfreq.nb to the corresponding register notifier call chain.
117  * @polling_jiffies	interval in jiffies.
118  * @previous_freq	previously configured frequency value.
119  * @next_polling	the number of remaining jiffies to poll with
120  *			"devfreq_monitor" executions to reevaluate
121  *			frequency/voltage of the device. Set by
122  *			profile's polling_ms interval.
123  * @data	Private data of the governor. The devfreq framework does not
124  *		touch this.
125  * @being_removed	a flag to mark that this object is being removed in
126  *			order to prevent trying to remove the object multiple times.
127  *
128  * This structure stores the devfreq information for a give device.
129  *
130  * Note that when a governor accesses entries in struct devfreq in its
131  * functions except for the context of callbacks defined in struct
132  * devfreq_governor, the governor should protect its access with the
133  * struct mutex lock in struct devfreq. A governor may use this mutex
134  * to protect its own private data in void *data as well.
135  */
136 struct devfreq {
137 	struct list_head node;
138 
139 	struct mutex lock;
140 	struct device dev;
141 	struct devfreq_dev_profile *profile;
142 	const struct devfreq_governor *governor;
143 	struct notifier_block nb;
144 
145 	unsigned long polling_jiffies;
146 	unsigned long previous_freq;
147 	unsigned int next_polling;
148 
149 	void *data; /* private data for governors */
150 
151 	bool being_removed;
152 };
153 
154 #if defined(CONFIG_PM_DEVFREQ)
155 extern struct devfreq *devfreq_add_device(struct device *dev,
156 				  struct devfreq_dev_profile *profile,
157 				  const struct devfreq_governor *governor,
158 				  void *data);
159 extern int devfreq_remove_device(struct devfreq *devfreq);
160 
161 /* Helper functions for devfreq user device driver with OPP. */
162 extern struct opp *devfreq_recommended_opp(struct device *dev,
163 					   unsigned long *freq);
164 extern int devfreq_register_opp_notifier(struct device *dev,
165 					 struct devfreq *devfreq);
166 extern int devfreq_unregister_opp_notifier(struct device *dev,
167 					   struct devfreq *devfreq);
168 
169 #ifdef CONFIG_DEVFREQ_GOV_POWERSAVE
170 extern const struct devfreq_governor devfreq_powersave;
171 #endif
172 #ifdef CONFIG_DEVFREQ_GOV_PERFORMANCE
173 extern const struct devfreq_governor devfreq_performance;
174 #endif
175 #ifdef CONFIG_DEVFREQ_GOV_USERSPACE
176 extern const struct devfreq_governor devfreq_userspace;
177 #endif
178 #ifdef CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND
179 extern const struct devfreq_governor devfreq_simple_ondemand;
180 /**
181  * struct devfreq_simple_ondemand_data - void *data fed to struct devfreq
182  *	and devfreq_add_device
183  * @ upthreshold	If the load is over this value, the frequency jumps.
184  *			Specify 0 to use the default. Valid value = 0 to 100.
185  * @ downdifferential	If the load is under upthreshold - downdifferential,
186  *			the governor may consider slowing the frequency down.
187  *			Specify 0 to use the default. Valid value = 0 to 100.
188  *			downdifferential < upthreshold must hold.
189  *
190  * If the fed devfreq_simple_ondemand_data pointer is NULL to the governor,
191  * the governor uses the default values.
192  */
193 struct devfreq_simple_ondemand_data {
194 	unsigned int upthreshold;
195 	unsigned int downdifferential;
196 };
197 #endif
198 
199 #else /* !CONFIG_PM_DEVFREQ */
200 static struct devfreq *devfreq_add_device(struct device *dev,
201 					  struct devfreq_dev_profile *profile,
202 					  struct devfreq_governor *governor,
203 					  void *data);
204 {
205 	return NULL;
206 }
207 
208 static int devfreq_remove_device(struct devfreq *devfreq);
209 {
210 	return 0;
211 }
212 
213 static struct opp *devfreq_recommended_opp(struct device *dev,
214 					   unsigned long *freq)
215 {
216 	return -EINVAL;
217 }
218 
219 static int devfreq_register_opp_notifier(struct device *dev,
220 					 struct devfreq *devfreq)
221 {
222 	return -EINVAL;
223 }
224 
225 static int devfreq_unregister_opp_notifier(struct device *dev,
226 					   struct devfreq *devfreq)
227 {
228 	return -EINVAL;
229 }
230 
231 #define devfreq_powersave	NULL
232 #define devfreq_performance	NULL
233 #define devfreq_userspace	NULL
234 #define devfreq_simple_ondemand	NULL
235 
236 #endif /* CONFIG_PM_DEVFREQ */
237 
238 #endif /* __LINUX_DEVFREQ_H__ */
239