1 /* arch/arm/mach-rk30/rk30_dvfs.h
3 * Copyright (C) 2012 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
18 #include <linux/device.h>
19 #include <linux/clk-provider.h>
26 typedef int (*dvfs_set_rate_callback)(struct dvfs_node *clk_dvfs_node, unsigned long rate);
27 typedef int (*clk_set_rate_callback)(struct clk *clk, unsigned long rate);
30 * struct vd_node: To Store All Voltage Domains' info
31 * @name: Voltage Domain's Name
32 * @regulator_name: Voltage domain's regulator name
33 * @cur_volt: Voltage Domain's Current Voltage
34 * @regulator: Voltage Domain's regulator point
35 * @node: Point of he Voltage Domain List Node
36 * @pd_list: Head of Power Domain List Belongs to This Voltage Domain
37 * @req_volt_list: The list of clocks requests
39 * @vd_dvfs_target: Callback function
41 #define VD_VOL_LIST_CNT (200)
42 #define VD_LIST_RELATION_L 0
43 #define VD_LIST_RELATION_H 1
47 const char *regulator_name;
48 int volt_time_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support
49 int mode_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support;
53 struct regulator *regulator;
54 struct list_head node;
55 struct list_head pd_list;
57 dvfs_set_rate_callback vd_dvfs_target;
58 unsigned int n_voltages;
59 int volt_list[VD_VOL_LIST_CNT];
60 unsigned int regu_mode;
64 * struct pd_node: To Store All Power Domains' info
65 * @name: Power Domain's Name
66 * @cur_volt: Power Domain's Current Voltage
67 * @pd_status: Power Domain's status
68 * @vd: Voltage Domain the power domain belongs to
69 * @pd_clk: Look power domain as a clock
70 * @node: List node to Voltage Domain
71 * @clk_list: Head of Power Domain's Clocks List
76 unsigned char pd_status;
78 struct list_head node;
79 struct list_head clk_list;
80 unsigned int regu_mode;
84 const char *compatible;
85 struct cpufreq_frequency_table *pvtm_table;
91 int delta_pvtm_by_volt;
92 int delta_pvtm_by_temp;
99 * struct dvfs_node: To Store All dvfs clocks' info
100 * @name: Dvfs clock's Name
101 * @set_freq: Dvfs clock's Current Frequency
102 * @set_volt: Dvfs clock's Current Voltage
103 * @enable_dvfs: Sign if DVFS clock enable
104 * @clk: System clk's point
105 * @pd: Power Domains dvfs clock belongs to
106 * @vd: Voltage Domains dvfs clock belongs to
107 * @dvfs_nb: Notify list
108 * @dvfs_table: Frequency and voltage table for dvfs
109 * @clk_dvfs_target: Callback function
112 struct device dev; //for opp
117 int freq_limit_en; //sign if use limit frequency
119 unsigned int min_rate; //limit min frequency
120 unsigned int max_rate; //limit max frequency
121 unsigned long last_set_rate;
122 unsigned int channel;
123 unsigned int temp_channel;
124 unsigned long temp_limit_rate;
128 struct list_head node;
129 struct notifier_block *dvfs_nb;
130 struct cpufreq_frequency_table *dvfs_table;
131 struct cpufreq_frequency_table *pvtm_table;
132 struct cpufreq_frequency_table *per_temp_limit_table;
133 struct cpufreq_frequency_table *nor_temp_limit_table;
134 struct cpufreq_frequency_table *virt_temp_limit_table[4];
135 clk_set_rate_callback clk_dvfs_target;
136 struct cpufreq_frequency_table *regu_mode_table;
138 unsigned int regu_mode;
139 struct pvtm_info *pvtm_info;
144 #define DVFS_MHZ (1000*1000)
145 #define DVFS_KHZ (1000)
147 #define DVFS_V (1000*1000)
148 #define DVFS_MV (1000)
150 #define DVFS_DBG(fmt, args...) printk(KERN_INFO "DVFS DBG:\t"fmt, ##args)
152 #define DVFS_DBG(fmt, args...) {while(0);}
155 #define DVFS_ERR(fmt, args...) printk(KERN_ERR "DVFS ERR:\t"fmt, ##args)
156 #define DVFS_LOG(fmt, args...) printk(KERN_DEBUG "DVFS LOG:\t"fmt, ##args)
157 #define DVFS_WARNING(fmt, args...) printk(KERN_WARNING "DVFS WARNING:\t"fmt, ##args)
159 #define DVFS_SET_VOLT_FAILURE 1
160 #define DVFS_SET_VOLT_SUCCESS 0
162 #define dvfs_regulator_get(dev,id) regulator_get((dev),(id))
163 #define dvfs_regulator_put(regu) regulator_put((regu))
164 #define dvfs_regulator_set_voltage(regu,min_uV,max_uV) regulator_set_voltage((regu),(min_uV),(max_uV))
165 #define dvfs_regulator_get_voltage(regu) regulator_get_voltage((regu))
166 #define dvfs_regulator_set_voltage_time(regu, old_uV, new_uV) regulator_set_voltage_time((regu), (old_uV), (new_uV))
167 #define dvfs_regulator_set_mode(regu, mode) regulator_set_mode((regu), (mode))
168 #define dvfs_regulator_get_mode(regu) regulator_get_mode((regu))
169 #define dvfs_regulator_list_voltage(regu,selector) regulator_list_voltage((regu),(selector))
170 #define dvfs_regulator_count_voltages(regu) regulator_count_voltages((regu))
172 #define clk_dvfs_node_get(a,b) clk_get((a),(b))
173 #define clk_dvfs_node_get_rate_kz(a) (clk_get_rate((a))/1000)
174 #define clk_dvfs_node_set_rate(a,b) clk_set_rate((a),(b))
176 typedef void (*avs_init_fn)(void);
177 typedef u8 (*avs_get_val_fn)(void);
179 avs_init_fn avs_init;
180 avs_get_val_fn avs_get_val;
184 struct dvfs_node *clk_get_dvfs_node(char *clk_name);
185 void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node);
186 unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node);
187 unsigned long dvfs_clk_get_last_set_rate(struct dvfs_node *clk_dvfs_node);
188 unsigned long dvfs_clk_round_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
189 int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
190 int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node);
191 void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node);
192 int dvfs_clk_prepare_enable(struct dvfs_node *clk_dvfs_node);
193 void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node);
194 int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table);
195 int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target);
196 int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate);
197 int dvfs_clk_get_limit(struct dvfs_node *clk_dvfs_node, unsigned int *min_rate, unsigned int *max_rate) ;
198 int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node);
199 int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node);
200 int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node);
201 void dvfs_disable_temp_limit(void);
202 struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node);
203 int rk_regist_vd(struct vd_node *vd);
204 int rk_regist_pd(struct pd_node *pd);
205 int rk_regist_clk(struct dvfs_node *clk_dvfs_node);
206 struct regulator *dvfs_get_regulator(char *regulator_name);
207 int of_dvfs_init(void);
211 static inline struct dvfs_node *clk_get_dvfs_node(char *clk_name){ return NULL; };
212 static inline void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node){ return; };
213 static inline unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
214 static inline unsigned long dvfs_clk_get_last_set_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
215 static inline unsigned long dvfs_clk_round_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate) { return 0; };
216 static inline int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate){ return 0; };
217 static inline int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
218 static inline void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node){ };
219 static inline int dvfs_clk_prepare_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
220 static inline void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node){ };
221 static inline int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table){ return 0; };
222 static inline int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target){ return 0; };
223 static inline int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate){ return 0; };
224 static inline int dvfs_clk_get_limit(struct dvfs_node *clk_dvfs_node, unsigned int *min_rate, unsigned int *max_rate) { return 0; };
225 static inline int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node){ return 0; };
226 static inline int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
227 static inline int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
228 static inline void dvfs_disable_temp_limit(void) {};
229 static inline struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node){ return NULL; };
230 static inline int rk_regist_vd(struct vd_node *vd){ return 0; };
231 static inline int rk_regist_pd(struct pd_node *pd){ return 0; };
232 static inline int rk_regist_clk(struct dvfs_node *clk_dvfs_node){ return 0; };
233 static inline struct regulator *dvfs_get_regulator(char *regulator_name){ return NULL; };
234 static inline int of_dvfs_init(void){ return 0; };