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