pm_opp.h 10.5 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
struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
82
struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index);
83 84
void dev_pm_opp_put_opp_table(struct opp_table *opp_table);

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

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

89 90
bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);

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

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

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

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

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

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

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

116 117 118
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);

119 120 121 122
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);
123 124
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);
125 126
struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name);
void dev_pm_opp_put_clkname(struct opp_table *opp_table);
127
struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
128
void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table);
129 130
struct opp_table *dev_pm_opp_set_genpd_virt_dev(struct device *dev, struct device *virt_dev, int index);
void dev_pm_opp_put_genpd_virt_dev(struct opp_table *opp_table, struct device *virt_dev);
131
int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
132 133
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);
134 135
void dev_pm_opp_remove_table(struct device *dev);
void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
136
#else
137 138 139 140 141
static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
{
	return ERR_PTR(-ENOTSUPP);
}

142 143 144 145 146
static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
{
	return ERR_PTR(-ENOTSUPP);
}

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

149
static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
150 151 152 153
{
	return 0;
}

154
static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
155 156 157 158
{
	return 0;
}

159 160 161 162 163
static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
{
	return false;
}

164
static inline int dev_pm_opp_get_opp_count(struct device *dev)
165 166 167 168
{
	return 0;
}

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

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

179 180 181 182 183
static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
{
	return 0;
}

184
static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
185
{
186
	return 0;
187 188
}

189
static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
190 191
					unsigned long freq, bool available)
{
192
	return ERR_PTR(-ENOTSUPP);
193 194
}

195
static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
196 197
					unsigned long *freq)
{
198
	return ERR_PTR(-ENOTSUPP);
199 200
}

201
static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
202 203
					unsigned long *freq)
{
204
	return ERR_PTR(-ENOTSUPP);
205 206
}

207 208
static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}

209
static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
210 211
					unsigned long u_volt)
{
212
	return -ENOTSUPP;
213 214
}

215 216 217 218
static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
{
}

219
static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
220 221 222 223
{
	return 0;
}

224
static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
225 226 227
{
	return 0;
}
228

229
static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
230
{
231 232 233 234 235 236
	return -ENOTSUPP;
}

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

239 240 241
static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
							    const u32 *versions,
							    unsigned int count)
242
{
243
	return ERR_PTR(-ENOTSUPP);
244 245
}

246
static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
247

248
static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
249 250
			int (*set_opp)(struct dev_pm_set_opp_data *data))
{
251
	return ERR_PTR(-ENOTSUPP);
252 253
}

254
static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) {}
255

256
static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
257
{
258
	return ERR_PTR(-ENOTSUPP);
259 260
}

261
static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
262

263
static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
264
{
265
	return ERR_PTR(-ENOTSUPP);
266 267
}

268
static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
269

270 271 272 273 274 275 276
static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name)
{
	return ERR_PTR(-ENOTSUPP);
}

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

277 278 279 280 281 282
static inline struct opp_table *dev_pm_opp_set_genpd_virt_dev(struct device *dev, struct device *virt_dev, int index)
{
	return ERR_PTR(-ENOTSUPP);
}

static inline void dev_pm_opp_put_genpd_virt_dev(struct opp_table *opp_table, struct device *virt_dev) {}
283 284
static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
{
285
	return -ENOTSUPP;
286 287
}

288
static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
289
{
290
	return -ENOTSUPP;
291 292
}

293
static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
294 295 296 297
{
	return -EINVAL;
}

298 299 300 301 302 303 304 305
static inline void dev_pm_opp_remove_table(struct device *dev)
{
}

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

306
#endif		/* CONFIG_PM_OPP */
307

308
#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
309
int dev_pm_opp_of_add_table(struct device *dev);
310
int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
311
void dev_pm_opp_of_remove_table(struct device *dev);
312 313 314
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);
315
struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
316
struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
317
unsigned int of_get_required_opp_performance_state(struct device_node *np, int index);
318
#else
319
static inline int dev_pm_opp_of_add_table(struct device *dev)
320
{
321
	return -ENOTSUPP;
322
}
323

324 325 326 327 328
static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
{
	return -ENOTSUPP;
}

329
static inline void dev_pm_opp_of_remove_table(struct device *dev)
330 331
{
}
332

333
static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
334
{
335
	return -ENOTSUPP;
336 337
}

338
static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
339 340 341
{
}

342
static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
343
{
344
	return -ENOTSUPP;
345
}
346 347 348 349 350

static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
{
	return NULL;
}
351

352 353 354 355
static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
{
	return NULL;
}
356 357 358 359
static inline unsigned int of_get_required_opp_performance_state(struct device_node *np, int index)
{
	return 0;
}
360 361
#endif

362
#endif		/* __LINUX_OPP_H__ */