Merge tag 'v3.10.92'
[firefly-linux-kernel-4.4.55.git] / include / linux / rockchip / dvfs.h
1 /* arch/arm/mach-rk30/rk30_dvfs.h
2  *
3  * Copyright (C) 2012 ROCKCHIP, Inc.
4  *
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.
8  *
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.
13  *
14  */
15 #ifndef _RK30_DVFS_H_
16 #define _RK30_DVFS_H_
17
18 #include <linux/device.h>
19 #include <linux/clk-provider.h>
20
21 #define ARM_DVFS_CH     0
22 #define GPU_DVFS_CH     1
23 #define LOG_DVFS_CH     2
24
25 struct dvfs_node;
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);
28
29 /**
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
38  * @dvfs_mutex:         Lock
39  * @vd_dvfs_target:     Callback function       
40  */
41  #define VD_VOL_LIST_CNT (200)
42  #define VD_LIST_RELATION_L 0
43  #define VD_LIST_RELATION_H 1
44
45 struct vd_node {
46         const char              *name;
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;
50         int                     cur_volt;
51         int                     volt_set_flag;
52         int                     suspend_volt;
53         struct regulator        *regulator;
54         struct list_head        node;
55         struct list_head        pd_list;
56         struct mutex            mutex;
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;
61 };
62
63 /**
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
72  */
73 struct pd_node {
74         const char              *name;
75         int                     cur_volt;
76         unsigned char           pd_status;
77         struct vd_node          *vd;
78         struct list_head        node;
79         struct list_head        clk_list;
80         unsigned int            regu_mode;
81 };
82
83 struct pvtm_info {
84         const char *compatible;
85         struct cpufreq_frequency_table *pvtm_table;
86         int channel;
87         int process_version;
88         int scan_rate_hz;
89         int sample_time_us;
90         int volt_step_uv;
91         int delta_pvtm_by_volt;
92         int delta_pvtm_by_temp;
93         int volt_margin_uv;
94         int min_volt_uv;
95         int max_volt_uv;
96         int cluster;
97 };
98
99 struct lkg_adjust_volt_table {
100         int     lkg;
101         int     dlt_volt;
102 };
103
104 struct lkg_info {
105         int     def_table_lkg;
106         int     min_adjust_freq;
107         struct  lkg_adjust_volt_table *table;
108 };
109
110 /**
111  * struct dvfs_node:    To Store All dvfs clocks' info
112  * @name:               Dvfs clock's Name
113  * @set_freq:           Dvfs clock's Current Frequency
114  * @set_volt:           Dvfs clock's Current Voltage
115  * @enable_dvfs:        Sign if DVFS clock enable
116  * @clk:                System clk's point
117  * @pd:                 Power Domains dvfs clock belongs to
118  * @vd:                 Voltage Domains dvfs clock belongs to
119  * @dvfs_nb:            Notify list
120  * @dvfs_table:         Frequency and voltage table for dvfs
121  * @clk_dvfs_target:    Callback function
122  */
123 struct dvfs_node {
124         struct device           dev;            //for opp
125         const char              *name;
126         int                     set_freq;       //KHZ
127         int                     set_volt;       //MV
128         int                     enable_count;
129         int                     freq_limit_en;  //sign if use limit frequency
130         int                     support_pvtm;
131         unsigned int            min_rate;       //limit min frequency
132         unsigned int            max_rate;       //limit max frequency
133         unsigned long           last_set_rate;
134         unsigned int            channel;
135         unsigned int            temp_channel;
136         unsigned long           temp_limit_rate;
137         unsigned int        target_temp;
138         unsigned int        temp_limit_enable;
139         unsigned int        min_temp_limit;
140         int                 old_temp;
141         struct clk              *clk;
142         struct pd_node          *pd;
143         struct vd_node          *vd;
144         struct list_head        node;
145         struct notifier_block   *dvfs_nb;
146         struct cpufreq_frequency_table  *dvfs_table;
147         struct cpufreq_frequency_table  *pvtm_table;
148         struct cpufreq_frequency_table  *per_temp_limit_table;
149         struct cpufreq_frequency_table  *nor_temp_limit_table;
150         struct cpufreq_frequency_table  *virt_temp_limit_table[4];
151         clk_set_rate_callback   clk_dvfs_target;
152         struct cpufreq_frequency_table  *regu_mode_table;
153         int                     regu_mode_en;
154         unsigned int            regu_mode;
155         struct pvtm_info        *pvtm_info;
156         int                 lkg_adjust_volt_en;
157         struct lkg_info         lkg_info;
158         unsigned int            cluster;
159         unsigned int        max_limit_freq;
160         unsigned int        pvtm_min_temp;
161 };
162
163
164
165 #define DVFS_MHZ (1000*1000)
166 #define DVFS_KHZ (1000)
167
168 #define DVFS_V (1000*1000)
169 #define DVFS_MV (1000)
170 #if 0
171 #define DVFS_DBG(fmt, args...) printk(KERN_INFO "DVFS DBG:\t"fmt, ##args)
172 #else
173 #define DVFS_DBG(fmt, args...) {while(0);}
174 #endif
175
176 #define DVFS_ERR(fmt, args...) printk(KERN_ERR "DVFS ERR:\t"fmt, ##args)
177 #define DVFS_LOG(fmt, args...) printk(KERN_DEBUG "DVFS LOG:\t"fmt, ##args)
178 #define DVFS_WARNING(fmt, args...) printk(KERN_WARNING "DVFS WARNING:\t"fmt, ##args)
179
180 #define DVFS_SET_VOLT_FAILURE   1
181 #define DVFS_SET_VOLT_SUCCESS   0
182
183 #define dvfs_regulator_get(dev,id) regulator_get((dev),(id))
184 #define dvfs_regulator_put(regu) regulator_put((regu))
185 #define dvfs_regulator_set_voltage(regu,min_uV,max_uV) regulator_set_voltage((regu),(min_uV),(max_uV))
186 #define dvfs_regulator_get_voltage(regu) regulator_get_voltage((regu))
187 #define dvfs_regulator_set_voltage_time(regu, old_uV, new_uV) regulator_set_voltage_time((regu), (old_uV), (new_uV))
188 #define dvfs_regulator_set_mode(regu, mode) regulator_set_mode((regu), (mode))
189 #define dvfs_regulator_get_mode(regu) regulator_get_mode((regu))
190 #define dvfs_regulator_list_voltage(regu,selector) regulator_list_voltage((regu),(selector))
191 #define dvfs_regulator_count_voltages(regu) regulator_count_voltages((regu))
192
193 #define clk_dvfs_node_get(a,b) clk_get((a),(b))
194 #define clk_dvfs_node_get_rate_kz(a) (clk_get_rate((a))/1000)
195 #define clk_dvfs_node_set_rate(a,b) clk_set_rate((a),(b))
196
197 typedef void (*avs_init_fn)(void);
198 typedef u8 (*avs_get_val_fn)(void);
199 struct avs_ctr_st {
200         avs_init_fn             avs_init;
201         avs_get_val_fn          avs_get_val;
202 };
203
204 #ifdef CONFIG_DVFS
205 struct dvfs_node *clk_get_dvfs_node(char *clk_name);
206 void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node);
207 unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node);
208 unsigned long dvfs_clk_get_last_set_rate(struct dvfs_node *clk_dvfs_node);
209 unsigned long dvfs_clk_round_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
210 int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
211 int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node);
212 void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node);
213 int dvfs_clk_prepare_enable(struct dvfs_node *clk_dvfs_node);
214 void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node);
215 int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table);
216 int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target);
217 int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate);
218 int dvfs_clk_get_limit(struct dvfs_node *clk_dvfs_node, unsigned int *min_rate, unsigned int *max_rate) ;
219 int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node);
220 int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node);
221 int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node);
222 void dvfs_disable_temp_limit(void);
223 struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node);
224 int rk_regist_vd(struct vd_node *vd);
225 int rk_regist_pd(struct pd_node *pd);
226 int rk_regist_clk(struct dvfs_node *clk_dvfs_node);
227 struct regulator *dvfs_get_regulator(char *regulator_name);
228 int of_dvfs_init(void);
229
230 #else
231
232 static inline struct dvfs_node *clk_get_dvfs_node(char *clk_name){ return NULL; };
233 static inline void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node){ return; };
234 static inline unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
235 static inline unsigned long dvfs_clk_get_last_set_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
236 static inline unsigned long dvfs_clk_round_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate) { return 0; };
237 static inline int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate){ return 0; };
238 static inline int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
239 static inline void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node){ };
240 static inline int dvfs_clk_prepare_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
241 static inline void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node){ };
242 static inline int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table){ return 0; };
243 static inline int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target){ return 0; };
244 static inline int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate){ return 0; };
245 static inline int dvfs_clk_get_limit(struct dvfs_node *clk_dvfs_node, unsigned int *min_rate, unsigned int *max_rate) { return 0; };
246 static inline int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node){ return 0; };
247 static inline int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
248 static inline int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
249 static inline void dvfs_disable_temp_limit(void) {};
250 static inline struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node){ return NULL; };
251 static inline int rk_regist_vd(struct vd_node *vd){ return 0; };
252 static inline int rk_regist_pd(struct pd_node *pd){ return 0; };
253 static inline int rk_regist_clk(struct dvfs_node *clk_dvfs_node){ return 0; };
254 static inline struct regulator *dvfs_get_regulator(char *regulator_name){ return NULL; };
255 static inline int of_dvfs_init(void){ return 0; };
256 #endif
257
258 #endif