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 20 struct dev_pm_opp; 21 struct device; 22 23 enum dev_pm_opp_event { 24 OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE, 25 }; 26 27 #if defined(CONFIG_PM_OPP) 28 29 unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); 30 31 unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); 32 33 bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp); 34 35 int dev_pm_opp_get_opp_count(struct device *dev); 36 unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev); 37 unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev); 38 unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev); 39 struct dev_pm_opp *dev_pm_opp_get_suspend_opp(struct device *dev); 40 41 struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, 42 unsigned long freq, 43 bool available); 44 45 struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, 46 unsigned long *freq); 47 48 struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, 49 unsigned long *freq); 50 51 int dev_pm_opp_add(struct device *dev, unsigned long freq, 52 unsigned long u_volt); 53 void dev_pm_opp_remove(struct device *dev, unsigned long freq); 54 55 int dev_pm_opp_enable(struct device *dev, unsigned long freq); 56 57 int dev_pm_opp_disable(struct device *dev, unsigned long freq); 58 59 struct srcu_notifier_head *dev_pm_opp_get_notifier(struct device *dev); 60 int dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, 61 unsigned int count); 62 void dev_pm_opp_put_supported_hw(struct device *dev); 63 int dev_pm_opp_set_prop_name(struct device *dev, const char *name); 64 void dev_pm_opp_put_prop_name(struct device *dev); 65 int dev_pm_opp_set_regulator(struct device *dev, const char *name); 66 void dev_pm_opp_put_regulator(struct device *dev); 67 int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq); 68 #else 69 static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp) 70 { 71 return 0; 72 } 73 74 static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) 75 { 76 return 0; 77 } 78 79 static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp) 80 { 81 return false; 82 } 83 84 static inline int dev_pm_opp_get_opp_count(struct device *dev) 85 { 86 return 0; 87 } 88 89 static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) 90 { 91 return 0; 92 } 93 94 static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev) 95 { 96 return 0; 97 } 98 99 static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev) 100 { 101 return 0; 102 } 103 104 static inline struct dev_pm_opp *dev_pm_opp_get_suspend_opp(struct device *dev) 105 { 106 return NULL; 107 } 108 109 static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, 110 unsigned long freq, bool available) 111 { 112 return ERR_PTR(-EINVAL); 113 } 114 115 static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, 116 unsigned long *freq) 117 { 118 return ERR_PTR(-EINVAL); 119 } 120 121 static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev, 122 unsigned long *freq) 123 { 124 return ERR_PTR(-EINVAL); 125 } 126 127 static inline int dev_pm_opp_add(struct device *dev, unsigned long freq, 128 unsigned long u_volt) 129 { 130 return -EINVAL; 131 } 132 133 static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq) 134 { 135 } 136 137 static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq) 138 { 139 return 0; 140 } 141 142 static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq) 143 { 144 return 0; 145 } 146 147 static inline struct srcu_notifier_head *dev_pm_opp_get_notifier( 148 struct device *dev) 149 { 150 return ERR_PTR(-EINVAL); 151 } 152 153 static inline int dev_pm_opp_set_supported_hw(struct device *dev, 154 const u32 *versions, 155 unsigned int count) 156 { 157 return -EINVAL; 158 } 159 160 static inline void dev_pm_opp_put_supported_hw(struct device *dev) {} 161 162 static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name) 163 { 164 return -EINVAL; 165 } 166 167 static inline void dev_pm_opp_put_prop_name(struct device *dev) {} 168 169 static inline int dev_pm_opp_set_regulator(struct device *dev, const char *name) 170 { 171 return -EINVAL; 172 } 173 174 static inline void dev_pm_opp_put_regulator(struct device *dev) {} 175 176 static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) 177 { 178 return -EINVAL; 179 } 180 181 #endif /* CONFIG_PM_OPP */ 182 183 #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF) 184 int dev_pm_opp_of_add_table(struct device *dev); 185 void dev_pm_opp_of_remove_table(struct device *dev); 186 int dev_pm_opp_of_cpumask_add_table(cpumask_var_t cpumask); 187 void dev_pm_opp_of_cpumask_remove_table(cpumask_var_t cpumask); 188 int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, cpumask_var_t cpumask); 189 int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, cpumask_var_t cpumask); 190 #else 191 static inline int dev_pm_opp_of_add_table(struct device *dev) 192 { 193 return -EINVAL; 194 } 195 196 static inline void dev_pm_opp_of_remove_table(struct device *dev) 197 { 198 } 199 200 static inline int dev_pm_opp_of_cpumask_add_table(cpumask_var_t cpumask) 201 { 202 return -ENOSYS; 203 } 204 205 static inline void dev_pm_opp_of_cpumask_remove_table(cpumask_var_t cpumask) 206 { 207 } 208 209 static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, cpumask_var_t cpumask) 210 { 211 return -ENOSYS; 212 } 213 214 static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, cpumask_var_t cpumask) 215 { 216 return -ENOSYS; 217 } 218 #endif 219 220 #endif /* __LINUX_OPP_H__ */ 221