1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun #ifndef __SOC_ROCKCHIP_OPP_SELECT_H
7*4882a593Smuzhiyun #define __SOC_ROCKCHIP_OPP_SELECT_H
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #define VOLT_RM_TABLE_END ~1
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun /*
12*4882a593Smuzhiyun * [0]: set intermediate rate
13*4882a593Smuzhiyun * [1]: scaling up rate or scaling down rate
14*4882a593Smuzhiyun * [1]: add length for pvtpll
15*4882a593Smuzhiyun * [2:5]: length
16*4882a593Smuzhiyun * [2]: use low length for pvtpll
17*4882a593Smuzhiyun * [3:5]: reserved
18*4882a593Smuzhiyun */
19*4882a593Smuzhiyun #define OPP_RATE_MASK 0x3f
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /* Set intermediate rate */
22*4882a593Smuzhiyun #define OPP_INTERMEDIATE_RATE BIT(0)
23*4882a593Smuzhiyun #define OPP_SCALING_UP_RATE BIT(1)
24*4882a593Smuzhiyun #define OPP_SCALING_UP_INTER (OPP_INTERMEDIATE_RATE | OPP_SCALING_UP_RATE)
25*4882a593Smuzhiyun #define OPP_SCALING_DOWN_INTER OPP_INTERMEDIATE_RATE
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /* Add length for pvtpll */
28*4882a593Smuzhiyun #define OPP_ADD_LENGTH BIT(1)
29*4882a593Smuzhiyun #define OPP_LENGTH_MASK 0xf
30*4882a593Smuzhiyun #define OPP_LENGTH_SHIFT 2
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* Use low length for pvtpll */
33*4882a593Smuzhiyun #define OPP_LENGTH_LOW BIT(2)
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun struct rockchip_opp_info;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun struct volt_rm_table {
38*4882a593Smuzhiyun int volt;
39*4882a593Smuzhiyun int rm;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun struct rockchip_opp_data {
43*4882a593Smuzhiyun int (*get_soc_info)(struct device *dev, struct device_node *np,
44*4882a593Smuzhiyun int *bin, int *process);
45*4882a593Smuzhiyun int (*set_soc_info)(struct device *dev, struct device_node *np,
46*4882a593Smuzhiyun int bin, int process, int volt_sel);
47*4882a593Smuzhiyun int (*set_read_margin)(struct device *dev,
48*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
49*4882a593Smuzhiyun u32 rm);
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun struct pvtpll_opp_table {
53*4882a593Smuzhiyun unsigned long rate;
54*4882a593Smuzhiyun unsigned long u_volt;
55*4882a593Smuzhiyun unsigned long u_volt_min;
56*4882a593Smuzhiyun unsigned long u_volt_max;
57*4882a593Smuzhiyun unsigned long u_volt_mem;
58*4882a593Smuzhiyun unsigned long u_volt_mem_min;
59*4882a593Smuzhiyun unsigned long u_volt_mem_max;
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun struct rockchip_opp_info {
63*4882a593Smuzhiyun struct device *dev;
64*4882a593Smuzhiyun struct pvtpll_opp_table *opp_table;
65*4882a593Smuzhiyun const struct rockchip_opp_data *data;
66*4882a593Smuzhiyun struct volt_rm_table *volt_rm_tbl;
67*4882a593Smuzhiyun struct regmap *grf;
68*4882a593Smuzhiyun struct regmap *dsu_grf;
69*4882a593Smuzhiyun struct clk_bulk_data *clks;
70*4882a593Smuzhiyun struct clk *scmi_clk;
71*4882a593Smuzhiyun /* The threshold frequency for set intermediate rate */
72*4882a593Smuzhiyun unsigned long intermediate_threshold_freq;
73*4882a593Smuzhiyun unsigned int pvtpll_avg_offset;
74*4882a593Smuzhiyun unsigned int pvtpll_min_rate;
75*4882a593Smuzhiyun unsigned int pvtpll_volt_step;
76*4882a593Smuzhiyun int num_clks;
77*4882a593Smuzhiyun /* The read margin for low voltage */
78*4882a593Smuzhiyun u32 low_rm;
79*4882a593Smuzhiyun u32 current_rm;
80*4882a593Smuzhiyun u32 target_rm;
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_ROCKCHIP_OPP)
84*4882a593Smuzhiyun int rockchip_of_get_leakage(struct device *dev, char *lkg_name, int *leakage);
85*4882a593Smuzhiyun void rockchip_of_get_lkg_sel(struct device *dev, struct device_node *np,
86*4882a593Smuzhiyun char *lkg_name, int process,
87*4882a593Smuzhiyun int *volt_sel, int *scale_sel);
88*4882a593Smuzhiyun void rockchip_pvtpll_calibrate_opp(struct rockchip_opp_info *info);
89*4882a593Smuzhiyun void rockchip_pvtpll_add_length(struct rockchip_opp_info *info);
90*4882a593Smuzhiyun void rockchip_of_get_pvtm_sel(struct device *dev, struct device_node *np,
91*4882a593Smuzhiyun char *reg_name, int bin, int process,
92*4882a593Smuzhiyun int *volt_sel, int *scale_sel);
93*4882a593Smuzhiyun void rockchip_of_get_bin_sel(struct device *dev, struct device_node *np,
94*4882a593Smuzhiyun int bin, int *scale_sel);
95*4882a593Smuzhiyun void rockchip_of_get_bin_volt_sel(struct device *dev, struct device_node *np,
96*4882a593Smuzhiyun int bin, int *bin_volt_sel);
97*4882a593Smuzhiyun int rockchip_nvmem_cell_read_u8(struct device_node *np, const char *cell_id,
98*4882a593Smuzhiyun u8 *val);
99*4882a593Smuzhiyun int rockchip_nvmem_cell_read_u16(struct device_node *np, const char *cell_id,
100*4882a593Smuzhiyun u16 *val);
101*4882a593Smuzhiyun int rockchip_get_volt_rm_table(struct device *dev, struct device_node *np,
102*4882a593Smuzhiyun char *porp_name, struct volt_rm_table **table);
103*4882a593Smuzhiyun void rockchip_get_opp_data(const struct of_device_id *matches,
104*4882a593Smuzhiyun struct rockchip_opp_info *info);
105*4882a593Smuzhiyun int rockchip_get_soc_info(struct device *dev, struct device_node *np, int *bin,
106*4882a593Smuzhiyun int *process);
107*4882a593Smuzhiyun void rockchip_get_scale_volt_sel(struct device *dev, char *lkg_name,
108*4882a593Smuzhiyun char *reg_name, int bin, int process,
109*4882a593Smuzhiyun int *scale, int *volt_sel);
110*4882a593Smuzhiyun struct opp_table *rockchip_set_opp_prop_name(struct device *dev, int process,
111*4882a593Smuzhiyun int volt_sel);
112*4882a593Smuzhiyun struct opp_table *rockchip_set_opp_supported_hw(struct device *dev,
113*4882a593Smuzhiyun struct device_node *np,
114*4882a593Smuzhiyun int bin, int volt_sel);
115*4882a593Smuzhiyun int rockchip_adjust_power_scale(struct device *dev, int scale);
116*4882a593Smuzhiyun int rockchip_get_read_margin(struct device *dev,
117*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
118*4882a593Smuzhiyun unsigned long volt, u32 *target_rm);
119*4882a593Smuzhiyun int rockchip_set_read_margin(struct device *dev,
120*4882a593Smuzhiyun struct rockchip_opp_info *opp_info, u32 rm,
121*4882a593Smuzhiyun bool is_set_rm);
122*4882a593Smuzhiyun int rockchip_init_read_margin(struct device *dev,
123*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
124*4882a593Smuzhiyun char *reg_name);
125*4882a593Smuzhiyun int rockchip_set_intermediate_rate(struct device *dev,
126*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
127*4882a593Smuzhiyun struct clk *clk, unsigned long old_freq,
128*4882a593Smuzhiyun unsigned long new_freq, bool is_scaling_up,
129*4882a593Smuzhiyun bool is_set_clk);
130*4882a593Smuzhiyun int rockchip_init_opp_table(struct device *dev,
131*4882a593Smuzhiyun struct rockchip_opp_info *info,
132*4882a593Smuzhiyun char *lkg_name, char *reg_name);
133*4882a593Smuzhiyun #else
rockchip_of_get_leakage(struct device * dev,char * lkg_name,int * leakage)134*4882a593Smuzhiyun static inline int rockchip_of_get_leakage(struct device *dev, char *lkg_name,
135*4882a593Smuzhiyun int *leakage)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun return -EOPNOTSUPP;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
rockchip_of_get_lkg_sel(struct device * dev,struct device_node * np,char * lkg_name,int process,int * volt_sel,int * scale_sel)140*4882a593Smuzhiyun static inline void rockchip_of_get_lkg_sel(struct device *dev,
141*4882a593Smuzhiyun struct device_node *np,
142*4882a593Smuzhiyun char *lkg_name, int process,
143*4882a593Smuzhiyun int *volt_sel, int *scale_sel)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
rockchip_pvtpll_calibrate_opp(struct rockchip_opp_info * info)147*4882a593Smuzhiyun static inline void rockchip_pvtpll_calibrate_opp(struct rockchip_opp_info *info)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
rockchip_pvtpll_add_length(struct rockchip_opp_info * info)151*4882a593Smuzhiyun static inline void rockchip_pvtpll_add_length(struct rockchip_opp_info *info)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
rockchip_of_get_pvtm_sel(struct device * dev,struct device_node * np,char * reg_name,int bin,int process,int * volt_sel,int * scale_sel)155*4882a593Smuzhiyun static inline void rockchip_of_get_pvtm_sel(struct device *dev,
156*4882a593Smuzhiyun struct device_node *np,
157*4882a593Smuzhiyun char *reg_name, int bin, int process,
158*4882a593Smuzhiyun int *volt_sel, int *scale_sel)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
rockchip_of_get_bin_sel(struct device * dev,struct device_node * np,int bin,int * scale_sel)162*4882a593Smuzhiyun static inline void rockchip_of_get_bin_sel(struct device *dev,
163*4882a593Smuzhiyun struct device_node *np, int bin,
164*4882a593Smuzhiyun int *scale_sel)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
rockchip_of_get_bin_volt_sel(struct device * dev,struct device_node * np,int bin,int * bin_volt_sel)168*4882a593Smuzhiyun static inline void rockchip_of_get_bin_volt_sel(struct device *dev,
169*4882a593Smuzhiyun struct device_node *np,
170*4882a593Smuzhiyun int bin, int *bin_volt_sel)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun
rockchip_nvmem_cell_read_u8(struct device_node * np,const char * cell_id,u8 * val)174*4882a593Smuzhiyun static inline int rockchip_nvmem_cell_read_u8(struct device_node *np,
175*4882a593Smuzhiyun const char *cell_id, u8 *val)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun return -EOPNOTSUPP;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun
rockchip_nvmem_cell_read_u16(struct device_node * np,const char * cell_id,u16 * val)180*4882a593Smuzhiyun static inline int rockchip_nvmem_cell_read_u16(struct device_node *np,
181*4882a593Smuzhiyun const char *cell_id, u16 *val)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun return -EOPNOTSUPP;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
rockchip_get_volt_rm_table(struct device * dev,struct device_node * np,char * porp_name,struct volt_rm_table ** table)186*4882a593Smuzhiyun static inline int rockchip_get_volt_rm_table(struct device *dev,
187*4882a593Smuzhiyun struct device_node *np,
188*4882a593Smuzhiyun char *porp_name,
189*4882a593Smuzhiyun struct volt_rm_table **table)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun return -EOPNOTSUPP;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
rockchip_get_opp_data(const struct of_device_id * matches,struct rockchip_opp_info * info)195*4882a593Smuzhiyun static inline void rockchip_get_opp_data(const struct of_device_id *matches,
196*4882a593Smuzhiyun struct rockchip_opp_info *info)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun }
rockchip_get_soc_info(struct device * dev,struct device_node * np,int * bin,int * process)199*4882a593Smuzhiyun static inline int rockchip_get_soc_info(struct device *dev,
200*4882a593Smuzhiyun struct device_node *np, int *bin,
201*4882a593Smuzhiyun int *process)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun return -EOPNOTSUPP;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
rockchip_get_scale_volt_sel(struct device * dev,char * lkg_name,char * reg_name,int bin,int process,int * scale,int * volt_sel)206*4882a593Smuzhiyun static inline void rockchip_get_scale_volt_sel(struct device *dev,
207*4882a593Smuzhiyun char *lkg_name, char *reg_name,
208*4882a593Smuzhiyun int bin, int process, int *scale,
209*4882a593Smuzhiyun int *volt_sel)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
rockchip_set_opp_prop_name(struct device * dev,int process,int volt_sel)213*4882a593Smuzhiyun static inline struct opp_table *rockchip_set_opp_prop_name(struct device *dev,
214*4882a593Smuzhiyun int process,
215*4882a593Smuzhiyun int volt_sel)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun return ERR_PTR(-EOPNOTSUPP);
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
rockchip_set_opp_supported_hw(struct device * dev,struct device_node * np,int bin,int volt_sel)220*4882a593Smuzhiyun static inline struct opp_table *rockchip_set_opp_supported_hw(struct device *dev,
221*4882a593Smuzhiyun struct device_node *np,
222*4882a593Smuzhiyun int bin, int volt_sel)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun return ERR_PTR(-EOPNOTSUPP);
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun
rockchip_adjust_power_scale(struct device * dev,int scale)227*4882a593Smuzhiyun static inline int rockchip_adjust_power_scale(struct device *dev, int scale)
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun return -EOPNOTSUPP;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun
rockchip_get_read_margin(struct device * dev,struct rockchip_opp_info * opp_info,unsigned long volt,u32 * target_rm)232*4882a593Smuzhiyun static inline int rockchip_get_read_margin(struct device *dev,
233*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
234*4882a593Smuzhiyun unsigned long volt, u32 *target_rm)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun return -EOPNOTSUPP;
237*4882a593Smuzhiyun }
rockchip_set_read_margin(struct device * dev,struct rockchip_opp_info * opp_info,u32 rm,bool is_set_rm)238*4882a593Smuzhiyun static inline int rockchip_set_read_margin(struct device *dev,
239*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
240*4882a593Smuzhiyun u32 rm, bool is_set_rm)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun return -EOPNOTSUPP;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
rockchip_init_read_margin(struct device * dev,struct rockchip_opp_info * opp_info,char * reg_name)245*4882a593Smuzhiyun static inline int rockchip_init_read_margin(struct device *dev,
246*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
247*4882a593Smuzhiyun char *reg_name)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun return -EOPNOTSUPP;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun static inline int
rockchip_set_intermediate_rate(struct device * dev,struct rockchip_opp_info * opp_info,struct clk * clk,unsigned long old_freq,unsigned long new_freq,bool is_scaling_up,bool is_set_clk)253*4882a593Smuzhiyun rockchip_set_intermediate_rate(struct device *dev,
254*4882a593Smuzhiyun struct rockchip_opp_info *opp_info,
255*4882a593Smuzhiyun struct clk *clk, unsigned long old_freq,
256*4882a593Smuzhiyun unsigned long new_freq, bool is_scaling_up,
257*4882a593Smuzhiyun bool is_set_clk)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun return -EOPNOTSUPP;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
rockchip_init_opp_table(struct device * dev,struct rockchip_opp_info * info,char * lkg_name,char * reg_name)262*4882a593Smuzhiyun static inline int rockchip_init_opp_table(struct device *dev,
263*4882a593Smuzhiyun struct rockchip_opp_info *info,
264*4882a593Smuzhiyun char *lkg_name, char *reg_name)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun return -EOPNOTSUPP;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun #endif /* CONFIG_ROCKCHIP_OPP */
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun #endif
272