pm_opp.h 8.95 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Generic OPP Interface
 *
 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
 *	Nishanth Menon
 *	Romit Dasgupta
 *	Kevin Hilman
 *
 * 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_OPP_H__
#define __LINUX_OPP_H__

#include <linux/err.h>
18
#include <linux/notifier.h>
19

20 21
struct clk;
struct regulator;
22
struct dev_pm_opp;
23
struct device;
24
struct opp_table;
25

26
enum dev_pm_opp_event {
27
	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
28 29
};

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
/**
 * struct dev_pm_opp_supply - Power supply voltage/current values
 * @u_volt:	Target voltage in microvolts corresponding to this OPP
 * @u_volt_min:	Minimum voltage in microvolts corresponding to this OPP
 * @u_volt_max:	Maximum voltage in microvolts corresponding to this OPP
 * @u_amp:	Maximum current drawn by the device in microamperes
 *
 * This structure stores the voltage/current values for a single power supply.
 */
struct dev_pm_opp_supply {
	unsigned long u_volt;
	unsigned long u_volt_min;
	unsigned long u_volt_max;
	unsigned long u_amp;
};

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
/**
 * struct dev_pm_opp_info - OPP freq/voltage/current values
 * @rate:	Target clk rate in hz
 * @supplies:	Array of voltage/current values for all power supplies
 *
 * This structure stores the freq/voltage/current values for a single OPP.
 */
struct dev_pm_opp_info {
	unsigned long rate;
	struct dev_pm_opp_supply *supplies;
};

/**
 * struct dev_pm_set_opp_data - Set OPP data
 * @old_opp:	Old OPP info
 * @new_opp:	New OPP info
 * @regulators:	Array of regulator pointers
 * @regulator_count: Number of regulators
 * @clk:	Pointer to clk
 * @dev:	Pointer to the struct device
 *
 * This structure contains all information required for setting an OPP.
 */
struct dev_pm_set_opp_data {
	struct dev_pm_opp_info old_opp;
	struct dev_pm_opp_info new_opp;

	struct regulator **regulators;
	unsigned int regulator_count;
	struct clk *clk;
	struct device *dev;
};

79 80
#if defined(CONFIG_PM_OPP)

81 82 83
struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
void dev_pm_opp_put_opp_table(struct opp_table *opp_table);

84
unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
85

86
unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
87

88 89
bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);

90
int dev_pm_opp_get_opp_count(struct device *dev);
91
unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
92
unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
93
unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
94
unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
95

96 97 98
struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
					      unsigned long freq,
					      bool available);
99

100 101
struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
					      unsigned long *freq);
102

103 104
struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
					     unsigned long *freq);
105
void dev_pm_opp_put(struct dev_pm_opp *opp);
106

107 108
int dev_pm_opp_add(struct device *dev, unsigned long freq,
		   unsigned long u_volt);
109
void dev_pm_opp_remove(struct device *dev, unsigned long freq);
110

111
int dev_pm_opp_enable(struct device *dev, unsigned long freq);
112

113
int dev_pm_opp_disable(struct device *dev, unsigned long freq);
114

115 116 117
int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);

118 119 120 121
struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name);
void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
122 123
struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
void dev_pm_opp_put_regulators(struct opp_table *opp_table);
124 125
struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
void dev_pm_opp_register_put_opp_helper(struct opp_table *opp_table);
126
int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
127 128
int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
129 130
void dev_pm_opp_remove_table(struct device *dev);
void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
131
#else
132 133 134 135 136 137 138
static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
{
	return ERR_PTR(-ENOTSUPP);
}

static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}

139
static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
140 141 142 143
{
	return 0;
}

144
static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
145 146 147 148
{
	return 0;
}

149 150 151 152 153
static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
{
	return false;
}

154
static inline int dev_pm_opp_get_opp_count(struct device *dev)
155 156 157 158
{
	return 0;
}

159 160 161 162 163
static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
{
	return 0;
}

164 165 166 167 168
static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
{
	return 0;
}

169 170 171 172 173
static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
{
	return 0;
}

174
static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
175
{
176
	return 0;
177 178
}

179
static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
180 181
					unsigned long freq, bool available)
{
182
	return ERR_PTR(-ENOTSUPP);
183 184
}

185
static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
186 187
					unsigned long *freq)
{
188
	return ERR_PTR(-ENOTSUPP);
189 190
}

191
static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
192 193
					unsigned long *freq)
{
194
	return ERR_PTR(-ENOTSUPP);
195 196
}

197 198
static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}

199
static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
200 201
					unsigned long u_volt)
{
202
	return -ENOTSUPP;
203 204
}

205 206 207 208
static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
{
}

209
static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
210 211 212 213
{
	return 0;
}

214
static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
215 216 217
{
	return 0;
}
218

219
static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
220
{
221 222 223 224 225 226
	return -ENOTSUPP;
}

static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
{
	return -ENOTSUPP;
227
}
228

229 230 231
static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
							    const u32 *versions,
							    unsigned int count)
232
{
233
	return ERR_PTR(-ENOTSUPP);
234 235
}

236
static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
237

238
static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
239 240
			int (*set_opp)(struct dev_pm_set_opp_data *data))
{
241
	return ERR_PTR(-ENOTSUPP);
242 243
}

244
static inline void dev_pm_opp_register_put_opp_helper(struct opp_table *opp_table) {}
245

246
static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
247
{
248
	return ERR_PTR(-ENOTSUPP);
249 250
}

251
static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
252

253
static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
254
{
255
	return ERR_PTR(-ENOTSUPP);
256 257
}

258
static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
259

260 261
static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
{
262
	return -ENOTSUPP;
263 264
}

265
static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
266
{
267
	return -ENOTSUPP;
268 269
}

270
static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
271 272 273 274
{
	return -EINVAL;
}

275 276 277 278 279 280 281 282
static inline void dev_pm_opp_remove_table(struct device *dev)
{
}

static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
{
}

283
#endif		/* CONFIG_PM_OPP */
284

285
#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
286 287
int dev_pm_opp_of_add_table(struct device *dev);
void dev_pm_opp_of_remove_table(struct device *dev);
288 289 290
int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
291
struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
292
#else
293
static inline int dev_pm_opp_of_add_table(struct device *dev)
294
{
295
	return -ENOTSUPP;
296
}
297

298
static inline void dev_pm_opp_of_remove_table(struct device *dev)
299 300
{
}
301

302
static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
303
{
304
	return -ENOTSUPP;
305 306
}

307
static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
308 309 310
{
}

311
static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
312
{
313
	return -ENOTSUPP;
314
}
315 316 317 318 319

static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
{
	return NULL;
}
320 321
#endif

322
#endif		/* __LINUX_OPP_H__ */