Merge tag 'lsk-android-14.02' into develop-3.10
[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 struct dvfs_node;
22 typedef int (*dvfs_set_rate_callback)(struct dvfs_node *clk_dvfs_node, unsigned long rate);
23 typedef int (*clk_set_rate_callback)(struct clk *clk, unsigned long rate);
24
25 /**
26  * struct vd_node:      To Store All Voltage Domains' info
27  * @name:               Voltage Domain's Name
28  * @regulator_name:     Voltage domain's regulator name
29  * @cur_volt:           Voltage Domain's Current Voltage
30  * @regulator:          Voltage Domain's regulator point
31  * @node:               Point of he Voltage Domain List Node
32  * @pd_list:            Head of Power Domain List Belongs to This Voltage Domain
33  * @req_volt_list:      The list of clocks requests
34  * @dvfs_mutex:         Lock
35  * @vd_dvfs_target:     Callback function       
36  */
37  #define VD_VOL_LIST_CNT (200)
38  #define VD_LIST_RELATION_L 0
39  #define VD_LIST_RELATION_H 1
40
41 struct vd_node {
42         const char              *name;
43         const char              *regulator_name;
44         int                     volt_time_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support
45         int                     mode_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support
46         int                     cur_volt;
47         int                     volt_set_flag;
48         int                     suspend_volt;
49         struct regulator        *regulator;
50         struct list_head        node;
51         struct list_head        pd_list;
52         struct mutex            mutex;
53         dvfs_set_rate_callback  vd_dvfs_target;
54         unsigned int            n_voltages;
55         int volt_list[VD_VOL_LIST_CNT];
56 };
57
58 /**
59  * struct pd_node:      To Store All Power Domains' info
60  * @name:               Power Domain's Name
61  * @cur_volt:           Power Domain's Current Voltage
62  * @pd_status:          Power Domain's status
63  * @vd:                 Voltage Domain the power domain belongs to
64  * @pd_clk:             Look power domain as a clock
65  * @node:               List node to Voltage Domain
66  * @clk_list:           Head of Power Domain's Clocks List
67  */
68 struct pd_node {
69         const char              *name;
70         int                     cur_volt;
71         unsigned char           pd_status;
72         struct vd_node          *vd;
73         struct list_head        node;
74         struct list_head        clk_list;
75 };
76
77 /**
78  * struct dvfs_node:    To Store All dvfs clocks' info
79  * @name:               Dvfs clock's Name
80  * @set_freq:           Dvfs clock's Current Frequency
81  * @set_volt:           Dvfs clock's Current Voltage
82  * @enable_dvfs:        Sign if DVFS clock enable
83  * @clk:                System clk's point
84  * @pd:                 Power Domains dvfs clock belongs to
85  * @vd:                 Voltage Domains dvfs clock belongs to
86  * @dvfs_nb:            Notify list
87  * @dvfs_table:         Frequency and voltage table for dvfs
88  * @clk_dvfs_target:    Callback function
89  */
90 struct dvfs_node {
91         struct device           dev;            //for opp
92         const char              *name;
93         int                     set_freq;       //KHZ
94         int                     set_volt;       //MV
95         int                     enable_count;
96         int                     freq_limit_en;  //sign if use limit frequency
97         unsigned int            min_rate;       //limit min frequency
98         unsigned int            max_rate;       //limit max frequency
99         unsigned int            last_set_rate;
100         struct clk              *clk;
101         struct pd_node          *pd;
102         struct vd_node          *vd;
103         struct list_head        node;
104         struct notifier_block   *dvfs_nb;
105         struct cpufreq_frequency_table  *dvfs_table;
106         struct cpufreq_frequency_table  *condition_freq_table;
107         clk_set_rate_callback   clk_dvfs_target;
108 };
109
110
111
112 #define DVFS_MHZ (1000*1000)
113 #define DVFS_KHZ (1000)
114
115 #define DVFS_V (1000*1000)
116 #define DVFS_MV (1000)
117 #if 0
118 #define DVFS_DBG(fmt, args...) printk(KERN_INFO "DVFS DBG:\t"fmt, ##args)
119 #else
120 #define DVFS_DBG(fmt, args...) {while(0);}
121 #endif
122
123 #define DVFS_ERR(fmt, args...) printk(KERN_ERR "DVFS ERR:\t"fmt, ##args)
124 #define DVFS_LOG(fmt, args...) printk(KERN_DEBUG "DVFS LOG:\t"fmt, ##args)
125 #define DVFS_WARNING(fmt, args...) printk(KERN_WARNING "DVFS WARNING:\t"fmt, ##args)
126
127 #define DVFS_SET_VOLT_FAILURE   1
128 #define DVFS_SET_VOLT_SUCCESS   0
129
130 #define dvfs_regulator_get(dev,id) regulator_get((dev),(id))
131 #define dvfs_regulator_put(regu) regulator_put((regu))
132 #define dvfs_regulator_set_voltage(regu,min_uV,max_uV) regulator_set_voltage((regu),(min_uV),(max_uV))
133 #define dvfs_regulator_get_voltage(regu) regulator_get_voltage((regu))
134 #define dvfs_regulator_set_voltage_time(regu, old_uV, new_uV) regulator_set_voltage_time((regu), (old_uV), (new_uV))
135 #define dvfs_regulator_set_mode(regu, mode) regulator_set_mode((regu), (mode))
136 #define dvfs_regulator_get_mode(regu) regulator_get_mode((regu))
137 #define dvfs_regulator_list_voltage(regu,selector) regulator_list_voltage((regu),(selector))
138 #define dvfs_regulator_count_voltages(regu) regulator_count_voltages((regu))
139
140 #define clk_dvfs_node_get(a,b) clk_get((a),(b))
141 #define clk_dvfs_node_get_rate_kz(a) (clk_get_rate((a))/1000)
142 #define clk_dvfs_node_set_rate(a,b) clk_set_rate((a),(b))
143
144 typedef void (*avs_init_fn)(void);
145 typedef u8 (*avs_get_val_fn)(void);
146 struct avs_ctr_st {
147         avs_init_fn             avs_init;
148         avs_get_val_fn          avs_get_val;
149 };
150
151 #ifdef CONFIG_DVFS
152 struct dvfs_node *clk_get_dvfs_node(char *clk_name);
153 void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node);
154 unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node);
155 int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
156 int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node);
157 void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node);
158 int dvfs_clk_prepare_enable(struct dvfs_node *clk_dvfs_node);
159 void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node);
160 int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table);
161 int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target);
162 int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate);
163 int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node);
164 int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node);
165 int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node);
166 struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node);
167 int rk_regist_vd(struct vd_node *vd);
168 int rk_regist_pd(struct pd_node *pd);
169 int rk_regist_clk(struct dvfs_node *clk_dvfs_node);
170 int of_dvfs_init(void);
171
172 #else
173
174 static inline struct dvfs_node *clk_get_dvfs_node(char *clk_name){ return NULL; };
175 static inline void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node){ return; };
176 static inline unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
177 static inline int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate){ return 0; };
178 static inline int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
179 static inline void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node){ };
180 static inline int dvfs_clk_prepare_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
181 static inline void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node){ };
182 static inline int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table){ return 0; };
183 static inline int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target){ return 0; };
184 static inline int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate){ return 0; };
185 static inline int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node){ return 0; };
186 static inline int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
187 static inline int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
188 static inline struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node){ return NULL; };
189 static inline int rk_regist_vd(struct vd_node *vd){ return 0; };
190 static inline int rk_regist_pd(struct pd_node *pd){ return 0; };
191 static inline int rk_regist_clk(struct dvfs_node *clk_dvfs_node){ return 0; };
192 static inline int of_dvfs_init(void){ return 0; };
193 #endif
194
195 #endif