at v4.10 8.2 kB view raw
1/* 2 * Generic OPP Interface 3 * 4 * Copyright (C) 2009-2010 Texas Instruments Incorporated. 5 * Nishanth Menon 6 * Romit Dasgupta 7 * Kevin Hilman 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14#ifndef __LINUX_OPP_H__ 15#define __LINUX_OPP_H__ 16 17#include <linux/err.h> 18#include <linux/notifier.h> 19 20struct clk; 21struct regulator; 22struct dev_pm_opp; 23struct device; 24struct opp_table; 25 26enum dev_pm_opp_event { 27 OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, 28}; 29 30/** 31 * struct dev_pm_opp_supply - Power supply voltage/current values 32 * @u_volt: Target voltage in microvolts corresponding to this OPP 33 * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP 34 * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP 35 * @u_amp: Maximum current drawn by the device in microamperes 36 * 37 * This structure stores the voltage/current values for a single power supply. 38 */ 39struct dev_pm_opp_supply { 40 unsigned long u_volt; 41 unsigned long u_volt_min; 42 unsigned long u_volt_max; 43 unsigned long u_amp; 44}; 45 46/** 47 * struct dev_pm_opp_info - OPP freq/voltage/current values 48 * @rate: Target clk rate in hz 49 * @supplies: Array of voltage/current values for all power supplies 50 * 51 * This structure stores the freq/voltage/current values for a single OPP. 52 */ 53struct dev_pm_opp_info { 54 unsigned long rate; 55 struct dev_pm_opp_supply *supplies; 56}; 57 58/** 59 * struct dev_pm_set_opp_data - Set OPP data 60 * @old_opp: Old OPP info 61 * @new_opp: New OPP info 62 * @regulators: Array of regulator pointers 63 * @regulator_count: Number of regulators 64 * @clk: Pointer to clk 65 * @dev: Pointer to the struct device 66 * 67 * This structure contains all information required for setting an OPP. 68 */ 69struct dev_pm_set_opp_data { 70 struct dev_pm_opp_info old_opp; 71 struct dev_pm_opp_info new_opp; 72 73 struct regulator **regulators; 74 unsigned int regulator_count; 75 struct clk *clk; 76 struct device *dev; 77}; 78 79#if defined(CONFIG_PM_OPP) 80 81unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); 82 83unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); 84 85bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp); 86 87int dev_pm_opp_get_opp_count(struct device *dev); 88unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev); 89unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev); 90unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev); 91struct dev_pm_opp *dev_pm_opp_get_suspend_opp(struct device *dev); 92 93struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, 94 unsigned long freq, 95 bool available); 96 97struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, 98 unsigned long *freq); 99 100struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, 101 unsigned long *freq); 102 103int dev_pm_opp_add(struct device *dev, unsigned long freq, 104 unsigned long u_volt); 105void dev_pm_opp_remove(struct device *dev, unsigned long freq); 106 107int dev_pm_opp_enable(struct device *dev, unsigned long freq); 108 109int dev_pm_opp_disable(struct device *dev, unsigned long freq); 110 111struct srcu_notifier_head *dev_pm_opp_get_notifier(struct device *dev); 112int dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, 113 unsigned int count); 114void dev_pm_opp_put_supported_hw(struct device *dev); 115int dev_pm_opp_set_prop_name(struct device *dev, const char *name); 116void dev_pm_opp_put_prop_name(struct device *dev); 117struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count); 118void dev_pm_opp_put_regulators(struct opp_table *opp_table); 119int dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data)); 120void dev_pm_opp_register_put_opp_helper(struct device *dev); 121int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq); 122int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask); 123int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask); 124void dev_pm_opp_remove_table(struct device *dev); 125void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask); 126#else 127static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp) 128{ 129 return 0; 130} 131 132static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) 133{ 134 return 0; 135} 136 137static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp) 138{ 139 return false; 140} 141 142static inline int dev_pm_opp_get_opp_count(struct device *dev) 143{ 144 return 0; 145} 146 147static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) 148{ 149 return 0; 150} 151 152static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev) 153{ 154 return 0; 155} 156 157static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev) 158{ 159 return 0; 160} 161 162static inline struct dev_pm_opp *dev_pm_opp_get_suspend_opp(struct device *dev) 163{ 164 return NULL; 165} 166 167static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, 168 unsigned long freq, bool available) 169{ 170 return ERR_PTR(-ENOTSUPP); 171} 172 173static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, 174 unsigned long *freq) 175{ 176 return ERR_PTR(-ENOTSUPP); 177} 178 179static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, 180 unsigned long *freq) 181{ 182 return ERR_PTR(-ENOTSUPP); 183} 184 185static inline int dev_pm_opp_add(struct device *dev, unsigned long freq, 186 unsigned long u_volt) 187{ 188 return -ENOTSUPP; 189} 190 191static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq) 192{ 193} 194 195static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq) 196{ 197 return 0; 198} 199 200static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq) 201{ 202 return 0; 203} 204 205static inline struct srcu_notifier_head *dev_pm_opp_get_notifier( 206 struct device *dev) 207{ 208 return ERR_PTR(-ENOTSUPP); 209} 210 211static inline int dev_pm_opp_set_supported_hw(struct device *dev, 212 const u32 *versions, 213 unsigned int count) 214{ 215 return -ENOTSUPP; 216} 217 218static inline void dev_pm_opp_put_supported_hw(struct device *dev) {} 219 220static inline int dev_pm_opp_register_set_opp_helper(struct device *dev, 221 int (*set_opp)(struct dev_pm_set_opp_data *data)) 222{ 223 return -ENOTSUPP; 224} 225 226static inline void dev_pm_opp_register_put_opp_helper(struct device *dev) {} 227 228static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name) 229{ 230 return -ENOTSUPP; 231} 232 233static inline void dev_pm_opp_put_prop_name(struct device *dev) {} 234 235static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count) 236{ 237 return ERR_PTR(-ENOTSUPP); 238} 239 240static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {} 241 242static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) 243{ 244 return -ENOTSUPP; 245} 246 247static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask) 248{ 249 return -ENOTSUPP; 250} 251 252static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask) 253{ 254 return -EINVAL; 255} 256 257static inline void dev_pm_opp_remove_table(struct device *dev) 258{ 259} 260 261static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask) 262{ 263} 264 265#endif /* CONFIG_PM_OPP */ 266 267#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF) 268int dev_pm_opp_of_add_table(struct device *dev); 269void dev_pm_opp_of_remove_table(struct device *dev); 270int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask); 271void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask); 272int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask); 273#else 274static inline int dev_pm_opp_of_add_table(struct device *dev) 275{ 276 return -ENOTSUPP; 277} 278 279static inline void dev_pm_opp_of_remove_table(struct device *dev) 280{ 281} 282 283static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask) 284{ 285 return -ENOTSUPP; 286} 287 288static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask) 289{ 290} 291 292static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask) 293{ 294 return -ENOTSUPP; 295} 296#endif 297 298#endif /* __LINUX_OPP_H__ */