blob: f19be36c3345c933b518055132f83772aedb4f44 [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2018 MediaTek Inc.
4 */
5#include <linux/arm-smccc.h>
6#include <linux/clk.h>
7#include <linux/io.h>
8#include <linux/iopoll.h>
9#include <linux/module.h>
10#include <linux/notifier.h>
11#include <linux/of_device.h>
12#include <linux/platform_device.h>
13#include <linux/soc/mediatek/mtk_dvfsrc.h>
14#include <linux/soc/mediatek/mtk_sip_svc.h>
15#include "mtk-scpsys.h"
16
17/* Private */
18#define DVFSRC_OPP_BW_QUERY
19#define DVFSRC_FORCE_OPP_SUPPORT
20#define DVFSRC_PROPERTY_ENABLE
21/* End */
22
23#define DVFSRC_IDLE 0x00
24#define DVFSRC_GET_TARGET_LEVEL(x) (((x) >> 0) & 0x0000ffff)
25#define DVFSRC_GET_CURRENT_LEVEL(x) (((x) >> 16) & 0x0000ffff)
26#define kbps_to_mbps(x) (div_u64(x, 1000))
27
28#define MT8183_DVFSRC_OPP_LP4 0
29#define MT8183_DVFSRC_OPP_LP4X 1
30#define MT8183_DVFSRC_OPP_LP3 2
31
32#define POLL_TIMEOUT 1000
33#define STARTUP_TIME 1
34
35#define MTK_SIP_DVFSRC_INIT 0x00
36
37#define DVFSRC_OPP_DESC(_opp_table) \
38{ \
39 .opps = _opp_table, \
40 .num_opp = ARRAY_SIZE(_opp_table), \
41}
42
43struct dvfsrc_opp {
44 u32 vcore_opp;
45 u32 dram_opp;
46};
47
48struct dvfsrc_domain {
49 u32 id;
50 u32 state;
51};
52
53struct dvfsrc_opp_desc {
54 const struct dvfsrc_opp *opps;
55 u32 num_opp;
56};
57
58struct mtk_dvfsrc;
59struct dvfsrc_soc_data {
60 const int *regs;
61 u32 num_domains;
62 struct dvfsrc_domain *domains;
63 u32 num_opp_desc;
64 const struct dvfsrc_opp_desc *opps_desc;
65 void (*dvfsrc_hw_init)(struct mtk_dvfsrc *dvfsrc);
66 int (*get_target_level)(struct mtk_dvfsrc *dvfsrc);
67 int (*get_current_level)(struct mtk_dvfsrc *dvfsrc);
68 u32 (*get_vcore_level)(struct mtk_dvfsrc *dvfsrc);
69 u32 (*get_vcp_level)(struct mtk_dvfsrc *dvfsrc);
70 u32 (*get_dram_level)(struct mtk_dvfsrc *dvfsrc);
71 void (*set_dram_bw)(struct mtk_dvfsrc *dvfsrc, u64 bw);
72 void (*set_dram_peak_bw)(struct mtk_dvfsrc *dvfsrc, u64 bw);
73 void (*set_dram_hrtbw)(struct mtk_dvfsrc *dvfsrc, u64 bw);
74 void (*set_dram_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
75 void (*set_opp_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
76 void (*set_vcore_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
77 void (*set_vscp_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
78 int (*wait_for_opp_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
79 int (*wait_for_vcore_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
80 int (*wait_for_dram_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
81#ifdef DVFSRC_FORCE_OPP_SUPPORT
82 void (*set_force_opp_level)(struct mtk_dvfsrc *dvfsrc, u32 level);
83#endif
84};
85
86struct mtk_dvfsrc {
87 struct device *dev;
88 struct platform_device *dvfsrc_start;
89 struct platform_device *devfreq;
90 struct platform_device *regulator;
91 struct platform_device *icc;
92 const struct dvfsrc_soc_data *dvd;
93 int dram_type;
94 const struct dvfsrc_opp_desc *curr_opps;
95 void __iomem *regs;
96 struct mutex req_lock;
97 struct mutex pstate_lock;
98 struct notifier_block scpsys_notifier;
99 bool dvfsrc_enable;
100#ifdef DVFSRC_FORCE_OPP_SUPPORT
101 bool opp_forced;
102 spinlock_t force_lock;
103#endif
104};
105
106static struct mtk_dvfsrc *dvfsrc_data;
107
108#ifdef DVFSRC_OPP_BW_QUERY
109u32 dram_type;
110static inline struct device_node *dvfsrc_parse_required_opp_bw(
111 struct device_node *np, int index)
112{
113 struct device_node *required_np;
114
115 required_np = of_parse_phandle(np, "required-opps", index);
116 if (unlikely(!required_np)) {
117 pr_notice("%s: Unable to parse required-opps: %pOF, index: %d\n",
118 __func__, np, index);
119 }
120 return required_np;
121}
122u32 dvfsrc_get_required_opp_peak_bw(struct device_node *np, int index)
123{
124 struct device_node *required_np;
125 u32 peak_bw = 0;
126
127 required_np = dvfsrc_parse_required_opp_bw(np, index);
128 if (!required_np)
129 return 0;
130
131 of_property_read_u32_index(required_np, "opp-peak-KBps", dram_type,
132 &peak_bw);
133
134 of_node_put(required_np);
135 return peak_bw;
136}
137EXPORT_SYMBOL(dvfsrc_get_required_opp_peak_bw);
138#endif
139
140static u32 dvfsrc_read(struct mtk_dvfsrc *dvfs, u32 offset)
141{
142 return readl(dvfs->regs + dvfs->dvd->regs[offset]);
143}
144
145static void dvfsrc_write(struct mtk_dvfsrc *dvfs, u32 offset, u32 val)
146{
147 writel(val, dvfs->regs + dvfs->dvd->regs[offset]);
148}
149
150#define dvfsrc_rmw(dvfs, offset, val, mask, shift) \
151 dvfsrc_write(dvfs, offset, \
152 (dvfsrc_read(dvfs, offset) & ~(mask << shift)) | (val << shift))
153
154enum dvfsrc_regs {
155 DVFSRC_BASIC_CONTROL,
156 DVFSRC_SW_REQ,
157 DVFSRC_SW_REQ2,
158 DVFSRC_LEVEL,
159 DVFSRC_TARGET_LEVEL,
160 DVFSRC_SW_BW,
161 DVFSRC_SW_PEAK_BW,
162 DVFSRC_SW_HRT_BW,
163 DVFSRC_VCORE_REQUEST,
164 DVFSRC_LAST,
165
166 /* MT6873 ip series regs */
167 DVFSRC_INT_EN,
168 DVFSRC_VCORE_USER_REQ,
169 DVFSRC_BW_USER_REQ,
170 DVFSRC_TIMEOUT_NEXTREQ,
171 DVFSRC_LEVEL_LABEL_0_1,
172 DVFSRC_LEVEL_LABEL_2_3,
173 DVFSRC_LEVEL_LABEL_4_5,
174 DVFSRC_LEVEL_LABEL_6_7,
175 DVFSRC_LEVEL_LABEL_8_9,
176 DVFSRC_LEVEL_LABEL_10_11,
177 DVFSRC_LEVEL_LABEL_12_13,
178 DVFSRC_LEVEL_LABEL_14_15,
179 DVFSRC_QOS_EN,
180 DVFSRC_HRT_BW_BASE,
181 DVFSRC_EMI_MON_DEBOUNCE_TIME,
182 DVFSRC_MD_LATENCY_IMPROVE,
183 DVFSRC_BASIC_CONTROL_3,
184 DVFSRC_DEBOUNCE_TIME,
185 DVFSRC_LEVEL_MASK,
186 DVFSRC_95MD_SCEN_BW0,
187 DVFSRC_95MD_SCEN_BW1,
188 DVFSRC_95MD_SCEN_BW2,
189 DVFSRC_95MD_SCEN_BW3,
190 DVFSRC_95MD_SCEN_BW0_T,
191 DVFSRC_95MD_SCEN_BW1_T,
192 DVFSRC_95MD_SCEN_BW2_T,
193 DVFSRC_95MD_SCEN_BW3_T,
194 DVFSRC_95MD_SCEN_BW4,
195 DVFSRC_RSRV_4,
196 DVFSRC_RSRV_5,
197 DVFSRC_DDR_REQUEST,
198 DVFSRC_DDR_REQUEST3,
199 DVFSRC_DDR_REQUEST5,
200 DVFSRC_DDR_REQUEST6,
201 DVFSRC_DDR_REQUEST7,
202 DVFSRC_DDR_QOS0,
203 DVFSRC_DDR_QOS1,
204 DVFSRC_DDR_QOS2,
205 DVFSRC_DDR_QOS3,
206 DVFSRC_DDR_QOS4,
207 DVFSRC_HRT_REQ_UNIT,
208 DVSFRC_HRT_REQ_MD_URG,
209 DVFSRC_HRT_REQ_MD_BW_0,
210 DVFSRC_HRT_REQ_MD_BW_1,
211 DVFSRC_HRT_REQ_MD_BW_2,
212 DVFSRC_HRT_REQ_MD_BW_3,
213 DVFSRC_HRT_REQ_MD_BW_4,
214 DVFSRC_HRT_REQ_MD_BW_5,
215 DVFSRC_HRT_REQ_MD_BW_6,
216 DVFSRC_HRT_REQ_MD_BW_7,
217 DVFSRC_HRT1_REQ_MD_BW_0,
218 DVFSRC_HRT1_REQ_MD_BW_1,
219 DVFSRC_HRT1_REQ_MD_BW_2,
220 DVFSRC_HRT1_REQ_MD_BW_3,
221 DVFSRC_HRT1_REQ_MD_BW_4,
222 DVFSRC_HRT1_REQ_MD_BW_5,
223 DVFSRC_HRT1_REQ_MD_BW_6,
224 DVFSRC_HRT1_REQ_MD_BW_7,
225 DVFSRC_HRT_REQ_MD_BW_8,
226 DVFSRC_HRT_REQ_MD_BW_9,
227 DVFSRC_HRT_REQ_MD_BW_10,
228 DVFSRC_HRT1_REQ_MD_BW_8,
229 DVFSRC_HRT1_REQ_MD_BW_9,
230 DVFSRC_HRT1_REQ_MD_BW_10,
231 DVFSRC_HRT_REQUEST,
232 DVFSRC_HRT_HIGH_2,
233 DVFSRC_HRT_HIGH_1,
234 DVFSRC_HRT_HIGH,
235 DVFSRC_HRT_LOW_2,
236 DVFSRC_HRT_LOW_1,
237 DVFSRC_HRT_LOW,
238 DVFSRC_DDR_ADD_REQUEST,
239 DVFSRC_DDR_QOS5,
240 DVFSRC_DDR_QOS6,
241 DVFSRC_HRT_HIGH_3,
242 DVFSRC_HRT_LOW_3,
243 DVFSRC_LEVEL_LABEL_16_17,
244 DVFSRC_LEVEL_LABEL_18_19,
245 DVFSRC_LEVEL_LABEL_20_21,
246 DVFSRC_LEVEL_LABEL_22_23,
247 DVFSRC_LEVEL_LABEL_24_25,
248 DVFSRC_LEVEL_LABEL_26_27,
249 DVFSRC_LEVEL_LABEL_28_29,
250 DVFSRC_LEVEL_LABEL_30_31,
251 DVFSRC_CURRENT_FORCE,
252 DVFSRC_TARGET_FORCE,
253};
254
255static const int mt8183_regs[] = {
256 [DVFSRC_SW_REQ] = 0x4,
257 [DVFSRC_SW_REQ2] = 0x8,
258 [DVFSRC_LEVEL] = 0xDC,
259 [DVFSRC_SW_BW] = 0x160,
260 [DVFSRC_LAST] = 0x308,
261};
262
263static const int mt6873_regs[] = {
264 [DVFSRC_BASIC_CONTROL] = 0x0,
265 [DVFSRC_SW_REQ] = 0xC,
266 [DVFSRC_LEVEL] = 0xD44,
267 [DVFSRC_SW_PEAK_BW] = 0x278,
268 [DVFSRC_SW_BW] = 0x26C,
269 [DVFSRC_SW_HRT_BW] = 0x290,
270 [DVFSRC_TARGET_LEVEL] = 0xD48,
271 [DVFSRC_VCORE_REQUEST] = 0x6C,
272
273 [DVFSRC_INT_EN] = 0xC8,
274 [DVFSRC_VCORE_USER_REQ] = 0xE4,
275 [DVFSRC_BW_USER_REQ] = 0xE8,
276 [DVFSRC_TIMEOUT_NEXTREQ] = 0xF8,
277 [DVFSRC_LEVEL_LABEL_0_1] = 0x100,
278 [DVFSRC_LEVEL_LABEL_2_3] = 0x104,
279 [DVFSRC_LEVEL_LABEL_4_5] = 0x108,
280 [DVFSRC_LEVEL_LABEL_6_7] = 0x10C,
281 [DVFSRC_LEVEL_LABEL_8_9] = 0x110,
282 [DVFSRC_LEVEL_LABEL_10_11] = 0x114,
283 [DVFSRC_LEVEL_LABEL_12_13] = 0x118,
284 [DVFSRC_LEVEL_LABEL_14_15] = 0x11C,
285 [DVFSRC_QOS_EN] = 0x280,
286 [DVFSRC_HRT_BW_BASE] = 0x294,
287 [DVFSRC_EMI_MON_DEBOUNCE_TIME] = 0x308,
288 [DVFSRC_MD_LATENCY_IMPROVE] = 0x30C,
289 [DVFSRC_BASIC_CONTROL_3] = 0x310,
290 [DVFSRC_DEBOUNCE_TIME] = 0x314,
291 [DVFSRC_LEVEL_MASK] = 0x318,
292 [DVFSRC_95MD_SCEN_BW0] = 0x524,
293 [DVFSRC_95MD_SCEN_BW1] = 0x528,
294 [DVFSRC_95MD_SCEN_BW2] = 0x52C,
295 [DVFSRC_95MD_SCEN_BW3] = 0x530,
296 [DVFSRC_95MD_SCEN_BW0_T] = 0x534,
297 [DVFSRC_95MD_SCEN_BW1_T] = 0x538,
298 [DVFSRC_95MD_SCEN_BW2_T] = 0x53C,
299 [DVFSRC_95MD_SCEN_BW3_T] = 0x540,
300 [DVFSRC_95MD_SCEN_BW4] = 0x544,
301 [DVFSRC_RSRV_4] = 0x610,
302 [DVFSRC_RSRV_5] = 0x614,
303 [DVFSRC_DDR_REQUEST] = 0xA00,
304 [DVFSRC_DDR_REQUEST3] = 0xA08,
305 [DVFSRC_DDR_REQUEST5] = 0xA10,
306 [DVFSRC_DDR_REQUEST6] = 0xA14,
307 [DVFSRC_DDR_REQUEST7] = 0xA18,
308 [DVFSRC_DDR_QOS0] = 0xA34,
309 [DVFSRC_DDR_QOS1] = 0xA38,
310 [DVFSRC_DDR_QOS2] = 0xA3C,
311 [DVFSRC_DDR_QOS3] = 0xA40,
312 [DVFSRC_DDR_QOS4] = 0xA44,
313 [DVFSRC_HRT_REQ_UNIT] = 0xA60,
314 [DVSFRC_HRT_REQ_MD_URG] = 0xA64,
315 [DVFSRC_HRT_REQ_MD_BW_0] = 0xA68,
316 [DVFSRC_HRT_REQ_MD_BW_1] = 0xA6C,
317 [DVFSRC_HRT_REQ_MD_BW_2] = 0xA70,
318 [DVFSRC_HRT_REQ_MD_BW_3] = 0xA74,
319 [DVFSRC_HRT_REQ_MD_BW_4] = 0xA78,
320 [DVFSRC_HRT_REQ_MD_BW_5] = 0xA7C,
321 [DVFSRC_HRT_REQ_MD_BW_6] = 0xA80,
322 [DVFSRC_HRT_REQ_MD_BW_7] = 0xA84,
323 [DVFSRC_HRT1_REQ_MD_BW_0] = 0xA88,
324 [DVFSRC_HRT1_REQ_MD_BW_1] = 0xA8C,
325 [DVFSRC_HRT1_REQ_MD_BW_2] = 0xA90,
326 [DVFSRC_HRT1_REQ_MD_BW_3] = 0xA94,
327 [DVFSRC_HRT1_REQ_MD_BW_4] = 0xA98,
328 [DVFSRC_HRT1_REQ_MD_BW_5] = 0xA9C,
329 [DVFSRC_HRT1_REQ_MD_BW_6] = 0xAA0,
330 [DVFSRC_HRT1_REQ_MD_BW_7] = 0xAA4,
331 [DVFSRC_HRT_REQ_MD_BW_8] = 0xAA8,
332 [DVFSRC_HRT_REQ_MD_BW_9] = 0xAAC,
333 [DVFSRC_HRT_REQ_MD_BW_10] = 0xAB0,
334 [DVFSRC_HRT1_REQ_MD_BW_8] = 0xAB4,
335 [DVFSRC_HRT1_REQ_MD_BW_9] = 0xAB8,
336 [DVFSRC_HRT1_REQ_MD_BW_10] = 0xABC,
337 [DVFSRC_HRT_REQUEST] = 0xAC4,
338 [DVFSRC_HRT_HIGH_2] = 0xAC8,
339 [DVFSRC_HRT_HIGH_1] = 0xACC,
340 [DVFSRC_HRT_HIGH] = 0xAD0,
341 [DVFSRC_HRT_LOW_2] = 0xAD4,
342 [DVFSRC_HRT_LOW_1] = 0xAD8,
343 [DVFSRC_HRT_LOW] = 0xADC,
344 [DVFSRC_DDR_ADD_REQUEST] = 0xAE0,
345 [DVFSRC_DDR_QOS5] = 0xD18,
346 [DVFSRC_DDR_QOS6] = 0xD1C,
347 [DVFSRC_HRT_HIGH_3] = 0xD38,
348 [DVFSRC_HRT_LOW_3] = 0xD3C,
349 [DVFSRC_LEVEL_LABEL_16_17] = 0xD4C,
350 [DVFSRC_LEVEL_LABEL_18_19] = 0xD50,
351 [DVFSRC_LEVEL_LABEL_20_21] = 0xD54,
352 [DVFSRC_LEVEL_LABEL_22_23] = 0xD58,
353 [DVFSRC_LEVEL_LABEL_24_25] = 0xD5C,
354 [DVFSRC_LEVEL_LABEL_26_27] = 0xD60,
355 [DVFSRC_LEVEL_LABEL_28_29] = 0xD64,
356 [DVFSRC_LEVEL_LABEL_30_31] = 0xD68,
357 [DVFSRC_CURRENT_FORCE] = 0xD6C,
358 [DVFSRC_TARGET_FORCE] = 0xD70,
359};
360
361static const struct dvfsrc_opp *get_current_opp(struct mtk_dvfsrc *dvfsrc)
362{
363 int level;
364
365 level = dvfsrc->dvd->get_current_level(dvfsrc);
366 return &dvfsrc->curr_opps->opps[level];
367}
368
369static int dvfsrc_is_idle(struct mtk_dvfsrc *dvfsrc)
370{
371 if (!dvfsrc->dvd->get_target_level)
372 return true;
373
374 return dvfsrc->dvd->get_target_level(dvfsrc);
375}
376
377static int dvfsrc_wait_for_idle(struct mtk_dvfsrc *dvfsrc)
378{
379 int state;
380
381 return readx_poll_timeout_atomic(dvfsrc_is_idle, dvfsrc,
382 state, state == DVFSRC_IDLE,
383 STARTUP_TIME, POLL_TIMEOUT);
384}
385
386static int dvfsrc_wait_for_vcore_level(struct mtk_dvfsrc *dvfsrc, u32 level)
387{
388 const struct dvfsrc_opp *curr;
389
390 return readx_poll_timeout_atomic(get_current_opp, dvfsrc, curr,
391 curr->vcore_opp >= level, STARTUP_TIME,
392 POLL_TIMEOUT);
393}
394
395static int dvfsrc_wait_for_dram_level(struct mtk_dvfsrc *dvfsrc, u32 level)
396{
397 const struct dvfsrc_opp *curr;
398
399 return readx_poll_timeout_atomic(get_current_opp, dvfsrc, curr,
400 curr->dram_opp >= level, STARTUP_TIME,
401 POLL_TIMEOUT);
402}
403
404static int mt8183_wait_for_opp_level(struct mtk_dvfsrc *dvfsrc, u32 level)
405{
406 const struct dvfsrc_opp *target, *curr;
407 int ret;
408
409 target = &dvfsrc->curr_opps->opps[level];
410 ret = readx_poll_timeout(get_current_opp, dvfsrc, curr,
411 curr->dram_opp >= target->dram_opp &&
412 curr->vcore_opp >= target->vcore_opp,
413 STARTUP_TIME, POLL_TIMEOUT);
414 if (ret < 0) {
415 dev_warn(dvfsrc->dev,
416 "timeout, target: %u, dram: %d, vcore: %d\n", level,
417 curr->dram_opp, curr->vcore_opp);
418 return ret;
419 }
420
421 return 0;
422}
423
424static int mt8183_get_target_level(struct mtk_dvfsrc *dvfsrc)
425{
426 return DVFSRC_GET_TARGET_LEVEL(dvfsrc_read(dvfsrc, DVFSRC_LEVEL));
427}
428
429static int mt8183_get_current_level(struct mtk_dvfsrc *dvfsrc)
430{
431 int level;
432
433 /* HW level 0 is begin from 0x10000 */
434 level = DVFSRC_GET_CURRENT_LEVEL(dvfsrc_read(dvfsrc, DVFSRC_LEVEL));
435 /* Array index start from 0 */
436 return ffs(level) - 1;
437}
438
439static u32 mt8183_get_vcore_level(struct mtk_dvfsrc *dvfsrc)
440{
441 return (dvfsrc_read(dvfsrc, DVFSRC_SW_REQ2) >> 2) & 0x3;
442}
443
444static void mt8183_set_dram_bw(struct mtk_dvfsrc *dvfsrc, u64 bw)
445{
446 dvfsrc_write(dvfsrc, DVFSRC_SW_BW, div_u64(kbps_to_mbps(bw), 100));
447}
448
449static void mt8183_set_opp_level(struct mtk_dvfsrc *dvfsrc, u32 level)
450{
451 int vcore_opp, dram_opp;
452 const struct dvfsrc_opp *opp;
453
454 /* translate pstate to dvfsrc level, and set it to DVFSRC HW */
455 opp = &dvfsrc->curr_opps->opps[level];
456 vcore_opp = opp->vcore_opp;
457 dram_opp = opp->dram_opp;
458
459 dev_dbg(dvfsrc->dev, "vcore_opp: %d, dram_opp: %d\n",
460 vcore_opp, dram_opp);
461 dvfsrc_write(dvfsrc, DVFSRC_SW_REQ, dram_opp | vcore_opp << 2);
462}
463
464static void mt8183_set_vcore_level(struct mtk_dvfsrc *dvfsrc, u32 level)
465{
466 dvfsrc_write(dvfsrc, DVFSRC_SW_REQ2, level << 2);
467}
468
469static int mt6873_get_target_level(struct mtk_dvfsrc *dvfsrc)
470{
471 return dvfsrc_read(dvfsrc, DVFSRC_TARGET_LEVEL);
472}
473
474static int mt6873_get_current_level(struct mtk_dvfsrc *dvfsrc)
475{
476 u32 curr_level;
477
478 /* HW level 0 is begin from 0x1, and max opp is 0x1*/
479 curr_level = ffs(dvfsrc_read(dvfsrc, DVFSRC_LEVEL));
480 if (curr_level > dvfsrc->curr_opps->num_opp)
481 curr_level = 0;
482 else
483 curr_level = dvfsrc->curr_opps->num_opp - curr_level;
484
485 return curr_level;
486}
487
488static int mt6873_wait_for_opp_level(struct mtk_dvfsrc *dvfsrc, u32 level)
489{
490 const struct dvfsrc_opp *target, *curr;
491
492 target = &dvfsrc->curr_opps->opps[level];
493 return readx_poll_timeout_atomic(get_current_opp, dvfsrc, curr,
494 curr->dram_opp >= target->dram_opp,
495 STARTUP_TIME, POLL_TIMEOUT);
496}
497
498static u32 mt6873_get_vcore_level(struct mtk_dvfsrc *dvfsrc)
499{
500 return (dvfsrc_read(dvfsrc, DVFSRC_SW_REQ) >> 4) & 0x7;
501}
502
503static u32 mt6873_get_dram_level(struct mtk_dvfsrc *dvfsrc)
504{
505 return (dvfsrc_read(dvfsrc, DVFSRC_SW_REQ) >> 12) & 0x7;
506}
507
508static u32 mt6873_get_vcp_level(struct mtk_dvfsrc *dvfsrc)
509{
510 return (dvfsrc_read(dvfsrc, DVFSRC_VCORE_REQUEST) >> 12) & 0x7;
511}
512
513static void mt6873_set_dram_bw(struct mtk_dvfsrc *dvfsrc, u64 bw)
514{
515 bw = div_u64(kbps_to_mbps(bw), 100);
516 bw = min_t(u64, bw, 0xFF);
517 dvfsrc_write(dvfsrc, DVFSRC_SW_BW, bw);
518}
519
520static void mt6873_set_dram_peak_bw(struct mtk_dvfsrc *dvfsrc, u64 bw)
521{
522 bw = div_u64(kbps_to_mbps(bw), 100);
523 bw = min_t(u64, bw, 0xFF);
524 dvfsrc_write(dvfsrc, DVFSRC_SW_PEAK_BW, bw);
525}
526
527static void mt6873_set_dram_hrtbw(struct mtk_dvfsrc *dvfsrc, u64 bw)
528{
529 bw = div_u64((kbps_to_mbps(bw) + 29), 30);
530 bw = min_t(u64, bw, 0x3FF);
531 dvfsrc_write(dvfsrc, DVFSRC_SW_HRT_BW, bw);
532}
533
534static void mt6873_set_dram_level(struct mtk_dvfsrc *dvfsrc, u32 level)
535{
536 mutex_lock(&dvfsrc->req_lock);
537 dvfsrc_rmw(dvfsrc, DVFSRC_SW_REQ, level, 0x7, 12);
538 mutex_unlock(&dvfsrc->req_lock);
539}
540
541static void mt6873_set_vcore_level(struct mtk_dvfsrc *dvfsrc, u32 level)
542{
543 mutex_lock(&dvfsrc->req_lock);
544 dvfsrc_rmw(dvfsrc, DVFSRC_SW_REQ, level, 0x7, 4);
545 mutex_unlock(&dvfsrc->req_lock);
546}
547
548static void mt6873_set_vscp_level(struct mtk_dvfsrc *dvfsrc, u32 level)
549{
550 dvfsrc_rmw(dvfsrc, DVFSRC_VCORE_REQUEST, level, 0x7, 12);
551}
552
553static void mt6873_set_opp_level(struct mtk_dvfsrc *dvfsrc, u32 level)
554{
555 const struct dvfsrc_opp *opp;
556
557 opp = &dvfsrc->curr_opps->opps[level];
558 mt6873_set_dram_level(dvfsrc, opp->dram_opp);
559}
560
561#ifdef DVFSRC_FORCE_OPP_SUPPORT
562static void mt6873_set_force_opp_level(struct mtk_dvfsrc *dvfsrc, u32 level)
563{
564 unsigned long flags;
565 int val;
566 int ret = 0;
567
568 spin_lock_irqsave(&dvfsrc->force_lock, flags);
569 dvfsrc->opp_forced = true;
570 if (level > dvfsrc->curr_opps->num_opp - 1) {
571 dvfsrc_rmw(dvfsrc, DVFSRC_BASIC_CONTROL, 0, 0x1, 15);
572 dvfsrc_write(dvfsrc, DVFSRC_TARGET_FORCE, 0);
573 dvfsrc->opp_forced = false;
574 goto out;
575 }
576 dvfsrc_write(dvfsrc, DVFSRC_TARGET_FORCE, 1 << level);
577 dvfsrc_rmw(dvfsrc, DVFSRC_BASIC_CONTROL, 1, 0x1, 15);
578 ret = readl_poll_timeout_atomic(
579 dvfsrc->regs + dvfsrc->dvd->regs[DVFSRC_LEVEL],
580 val, val == (1 << level), STARTUP_TIME, POLL_TIMEOUT);
581 dvfsrc_write(dvfsrc, DVFSRC_TARGET_FORCE, 0);
582out:
583 spin_unlock_irqrestore(&dvfsrc->force_lock, flags);
584 if (ret < 0) {
585 dev_info(dvfsrc->dev,
586 "[%s] wait idle, level: %d, last: %d -> %x\n",
587 __func__, level,
588 dvfsrc->dvd->get_current_level(dvfsrc),
589 dvfsrc->dvd->get_target_level(dvfsrc));
590 }
591}
592#endif
593
594void mtk_dvfsrc_send_request(const struct device *dev, u32 cmd, u64 data)
595{
596 int ret = 0;
597 struct mtk_dvfsrc *dvfsrc = dev_get_drvdata(dev);
598
599 dev_dbg(dvfsrc->dev, "cmd: %d, data: %llu\n", cmd, data);
600
601 switch (cmd) {
602 case MTK_DVFSRC_CMD_BW_REQUEST:
603 dvfsrc->dvd->set_dram_bw(dvfsrc, data);
604 goto out;
605 case MTK_DVFSRC_CMD_PEAK_BW_REQUEST:
606 if (dvfsrc->dvd->set_dram_peak_bw)
607 dvfsrc->dvd->set_dram_peak_bw(dvfsrc, data);
608 goto out;
609 case MTK_DVFSRC_CMD_OPP_REQUEST:
610 dvfsrc->dvd->set_opp_level(dvfsrc, data);
611 break;
612 case MTK_DVFSRC_CMD_VCORE_REQUEST:
613 dvfsrc->dvd->set_vcore_level(dvfsrc, data);
614 break;
615 case MTK_DVFSRC_CMD_HRTBW_REQUEST:
616 if (dvfsrc->dvd->set_dram_hrtbw)
617 dvfsrc->dvd->set_dram_hrtbw(dvfsrc, data);
618 else
619 goto out;
620 break;
621 case MTK_DVFSRC_CMD_DRAM_REQUEST:
622 dvfsrc->dvd->set_dram_level(dvfsrc, data);
623 break;
624 case MTK_DVFSRC_CMD_VSCP_REQUEST:
625 dvfsrc->dvd->set_vscp_level(dvfsrc, data);
626 break;
627#ifdef DVFSRC_FORCE_OPP_SUPPORT
628 case MTK_DVFSRC_CMD_FORCE_OPP_REQUEST:
629 if (dvfsrc->dvd->set_force_opp_level)
630 dvfsrc->dvd->set_force_opp_level(dvfsrc, data);
631 goto out;
632#endif
633 default:
634 dev_err(dvfsrc->dev, "unknown command: %d\n", cmd);
635 goto out;
636 }
637
638 if (!dvfsrc->dvfsrc_enable)
639 return;
640
641#ifdef DVFSRC_FORCE_OPP_SUPPORT
642 if (dvfsrc->opp_forced)
643 return;
644#endif
645 /* DVFSRC need to wait at least 2T(~196ns) to handle request
646 * after recieving command
647 */
648 udelay(STARTUP_TIME);
649 dvfsrc_wait_for_idle(dvfsrc);
650 /* The previous change may be requested by previous request.
651 * So we delay 1us , then start checking opp is reached enough.
652 */
653 udelay(STARTUP_TIME);
654
655 switch (cmd) {
656 case MTK_DVFSRC_CMD_OPP_REQUEST:
657 if (dvfsrc->dvd->wait_for_opp_level)
658 ret = dvfsrc->dvd->wait_for_opp_level(dvfsrc, data);
659 break;
660 case MTK_DVFSRC_CMD_VCORE_REQUEST:
661 case MTK_DVFSRC_CMD_VSCP_REQUEST:
662 ret = dvfsrc->dvd->wait_for_vcore_level(dvfsrc, data);
663 break;
664 case MTK_DVFSRC_CMD_DRAM_REQUEST:
665 ret = dvfsrc->dvd->wait_for_dram_level(dvfsrc, data);
666 break;
667 }
668out:
669 if (ret < 0) {
670 dev_warn(dvfsrc->dev,
671 "%d: idle timeout, data: %llu, last: %d -> %d\n",
672 cmd, data,
673 dvfsrc->dvd->get_current_level(dvfsrc),
674 dvfsrc->dvd->get_target_level(dvfsrc));
675 }
676}
677EXPORT_SYMBOL(mtk_dvfsrc_send_request);
678
679int mtk_dvfsrc_query_info(const struct device *dev, u32 cmd, int *data)
680{
681 struct mtk_dvfsrc *dvfsrc = dev_get_drvdata(dev);
682
683 switch (cmd) {
684 case MTK_DVFSRC_CMD_VCORE_LEVEL_QUERY:
685 *data = dvfsrc->dvd->get_vcore_level(dvfsrc);
686 break;
687 case MTK_DVFSRC_CMD_VSCP_LEVEL_QUERY:
688 *data = dvfsrc->dvd->get_vcp_level(dvfsrc);
689 break;
690 case MTK_DVFSRC_CMD_DRAM_LEVEL_QUERY:
691 *data = dvfsrc->dvd->get_dram_level(dvfsrc);
692 break;
693 case MTK_DVFSRC_CMD_CURR_LEVEL_QUERY:
694 *data = dvfsrc->dvd->get_current_level(dvfsrc);
695 break;
696 default:
697 return -EINVAL;
698 }
699
700 return 0;
701}
702EXPORT_SYMBOL(mtk_dvfsrc_query_info);
703
704void mtk_dvfsrc_force_opp(int opp)
705{
706#ifdef DVFSRC_FORCE_OPP_SUPPORT
707 if (dvfsrc_data)
708 mtk_dvfsrc_send_request(dvfsrc_data->dev,
709 MTK_DVFSRC_CMD_FORCE_OPP_REQUEST,
710 opp);
711#endif
712}
713EXPORT_SYMBOL(mtk_dvfsrc_force_opp);
714
715static int dvfsrc_set_performance(struct notifier_block *b,
716 unsigned long pstate, void *v)
717{
718 bool match = false;
719 int i;
720 struct mtk_dvfsrc *dvfsrc;
721 struct scp_event_data *sc = v;
722 struct dvfsrc_domain *d;
723 u32 highest;
724
725 if (sc->event_type != MTK_SCPSYS_PSTATE)
726 return 0;
727
728 dvfsrc = container_of(b, struct mtk_dvfsrc, scpsys_notifier);
729
730 /* feature not support */
731 if (!dvfsrc->dvd->num_domains)
732 return 0;
733
734 d = dvfsrc->dvd->domains;
735
736 if (pstate > dvfsrc->curr_opps->num_opp) {
737 dev_err(dvfsrc->dev, "pstate out of range = %ld\n", pstate);
738 return 0;
739 }
740
741 mutex_lock(&dvfsrc->pstate_lock);
742
743 for (i = 0, highest = 0; i < dvfsrc->dvd->num_domains; i++, d++) {
744 if (sc->domain_id == d->id) {
745 d->state = pstate;
746 match = true;
747 }
748 highest = max(highest, d->state);
749 }
750
751 if (!match)
752 goto out;
753
754 /* pstat start from level 1, array index start from 0 */
755 mtk_dvfsrc_send_request(dvfsrc->dev, MTK_DVFSRC_CMD_OPP_REQUEST,
756 highest - 1);
757
758out:
759 mutex_unlock(&dvfsrc->pstate_lock);
760 return 0;
761}
762
763static void pstate_notifier_register(struct mtk_dvfsrc *dvfsrc)
764{
765 dvfsrc->scpsys_notifier.notifier_call = dvfsrc_set_performance;
766 register_scpsys_notifier(&dvfsrc->scpsys_notifier);
767}
768
769static int mtk_dvfsrc_probe(struct platform_device *pdev)
770{
771 struct arm_smccc_res ares;
772 struct resource *res;
773 struct mtk_dvfsrc *dvfsrc;
774 int ret;
775 u32 is_bringup = 0;
776 u32 dvfsrc_flag = 0;
777 u32 dvfsrc_vmode = 0;
778#ifdef DVFSRC_PROPERTY_ENABLE
779 struct device_node *np = pdev->dev.of_node;
780#endif
781
782 dvfsrc = devm_kzalloc(&pdev->dev, sizeof(*dvfsrc), GFP_KERNEL);
783 if (!dvfsrc)
784 return -ENOMEM;
785
786 dvfsrc->dvd = of_device_get_match_data(&pdev->dev);
787 dvfsrc->dev = &pdev->dev;
788
789 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
790 dvfsrc->regs = devm_ioremap_resource(&pdev->dev, res);
791 if (IS_ERR(dvfsrc->regs))
792 return PTR_ERR(dvfsrc->regs);
793
794 mutex_init(&dvfsrc->req_lock);
795 mutex_init(&dvfsrc->pstate_lock);
796#ifdef DVFSRC_FORCE_OPP_SUPPORT
797 spin_lock_init(&dvfsrc->force_lock);
798#endif
799
800#ifdef DVFSRC_PROPERTY_ENABLE
801 of_property_read_u32(np, "dvfsrc,bringup", &is_bringup);
802 of_property_read_u32(np, "dvfsrc_flag", &dvfsrc_flag);
803 of_property_read_u32(np, "dvfsrc_vmode", &dvfsrc_vmode);
804#endif
805 if (!is_bringup) {
806 arm_smccc_smc(MTK_SIP_VCOREFS_CONTROL, MTK_SIP_DVFSRC_INIT,
807 dvfsrc_flag, dvfsrc_vmode, 0, 0, 0, 0, &ares);
808 if (!ares.a0) {
809 dvfsrc->dram_type = ares.a1;
810#ifdef DVFSRC_OPP_BW_QUERY
811 dram_type = dvfsrc->dram_type;
812#endif
813 dvfsrc->dvd->dvfsrc_hw_init(dvfsrc);
814 dvfsrc->dvfsrc_enable = true;
815 } else
816 dev_info(dvfsrc->dev, "dvfs mode is disabled\n");
817 } else
818 dev_info(dvfsrc->dev, "dvfs mode is bringup mode\n");
819 dvfsrc->curr_opps = &dvfsrc->dvd->opps_desc[dvfsrc->dram_type];
820 platform_set_drvdata(pdev, dvfsrc);
821 if (dvfsrc->dvd->num_domains)
822 pstate_notifier_register(dvfsrc);
823
824 dvfsrc->regulator = platform_device_register_data(dvfsrc->dev,
825 "mtk-dvfsrc-regulator", -1, NULL, 0);
826 if (IS_ERR(dvfsrc->regulator)) {
827 dev_err(dvfsrc->dev, "Failed create regulator device\n");
828 ret = PTR_ERR(dvfsrc->regulator);
829 goto err;
830 }
831
832 dvfsrc->icc = platform_device_register_data(dvfsrc->dev,
833 "mediatek-emi-icc", -1, NULL, 0);
834 if (IS_ERR(dvfsrc->icc)) {
835 dev_err(dvfsrc->dev, "Failed create icc device\n");
836 ret = PTR_ERR(dvfsrc->icc);
837 goto unregister_regulator;
838 }
839
840 dvfsrc->devfreq = platform_device_register_data(dvfsrc->dev,
841 "mtk-dvfsrc-devfreq", -1, NULL, 0);
842 if (IS_ERR(dvfsrc->devfreq)) {
843 dev_err(dvfsrc->dev, "Failed create devfreq device\n");
844 ret = PTR_ERR(dvfsrc->devfreq);
845 goto unregister_icc;
846 }
847
848 dvfsrc->dvfsrc_start = platform_device_register_data(dvfsrc->dev,
849 "mtk-dvfsrc-start", -1, NULL, 0);
850 if (IS_ERR(dvfsrc->dvfsrc_start)) {
851 dev_err(dvfsrc->dev, "Failed create dvfsrc-start device\n");
852 ret = PTR_ERR(dvfsrc->dvfsrc_start);
853 goto unregister_devfreq;
854 }
855
856 ret = devm_of_platform_populate(dvfsrc->dev);
857 if (ret < 0)
858 goto unregister_start;
859
860 dvfsrc_data = dvfsrc;
861 return 0;
862
863unregister_start:
864 platform_device_unregister(dvfsrc->dvfsrc_start);
865unregister_devfreq:
866 platform_device_unregister(dvfsrc->devfreq);
867unregister_icc:
868 platform_device_unregister(dvfsrc->icc);
869unregister_regulator:
870 platform_device_unregister(dvfsrc->regulator);
871err:
872 return ret;
873}
874
875static const struct dvfsrc_opp dvfsrc_opp_mt8183_lp4[] = {
876 {0, 0}, {0, 1}, {0, 2}, {1, 2},
877};
878
879static const struct dvfsrc_opp dvfsrc_opp_mt8183_lp3[] = {
880 {0, 0}, {0, 1}, {1, 1}, {1, 2},
881};
882
883static const struct dvfsrc_opp_desc dvfsrc_opp_mt8183_desc[] = {
884 DVFSRC_OPP_DESC(dvfsrc_opp_mt8183_lp4),
885 DVFSRC_OPP_DESC(dvfsrc_opp_mt8183_lp3),
886 DVFSRC_OPP_DESC(dvfsrc_opp_mt8183_lp3),
887};
888
889
890static const struct dvfsrc_soc_data mt8183_data = {
891 .opps_desc = dvfsrc_opp_mt8183_desc,
892 .num_opp_desc = ARRAY_SIZE(dvfsrc_opp_mt8183_desc),
893 .regs = mt8183_regs,
894 .get_target_level = mt8183_get_target_level,
895 .get_current_level = mt8183_get_current_level,
896 .get_vcore_level = mt8183_get_vcore_level,
897 .set_dram_bw = mt8183_set_dram_bw,
898 .set_opp_level = mt8183_set_opp_level,
899 .set_vcore_level = mt8183_set_vcore_level,
900 .wait_for_opp_level = mt8183_wait_for_opp_level,
901 .wait_for_vcore_level = dvfsrc_wait_for_vcore_level,
902};
903
904static void dvfsrc_init_mt6873(struct mtk_dvfsrc *dvfsrc)
905{
906 /* Setup opp table */
907 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_0_1, 0x50436053);
908 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_2_3, 0x40335042);
909 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_4_5, 0x40314032);
910 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_6_7, 0x30223023);
911 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_8_9, 0x20133021);
912 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_10_11, 0x20112012);
913 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_12_13, 0x10032010);
914 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_14_15, 0x10011002);
915 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_16_17, 0x00131000);
916 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_18_19, 0x00110012);
917 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_20_21, 0x00000010);
918 /* Setup hw emi qos policy */
919 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST, 0x00004321);
920 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST3, 0x00000065);
921 /* Setup up HRT QOS policy */
922 dvfsrc_write(dvfsrc, DVFSRC_HRT_BW_BASE, 0x00000004);
923 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_UNIT, 0x0000001E);
924 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH_3, 0x18A618A6);
925 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH_2, 0x18A61183);
926 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH_1, 0x0D690B80);
927 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH, 0x070804B0);
928 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW_3, 0x18A518A5);
929 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW_2, 0x18A51182);
930 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW_1, 0x0D680B7F);
931 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW, 0x070704AF);
932 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQUEST, 0x66654321);
933 /* Setup up SRT QOS policy */
934 dvfsrc_write(dvfsrc, DVFSRC_QOS_EN, 0x0011007C);
935 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS0, 0x00000019);
936 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS1, 0x00000026);
937 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS2, 0x00000033);
938 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS3, 0x0000003B);
939 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS4, 0x0000004C);
940 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS5, 0x00000066);
941 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS6, 0x00000066);
942 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST5, 0x54321000);
943 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST7, 0x66000000);
944 /* Setup up MD request policy */
945 dvfsrc_write(dvfsrc, DVFSRC_BASIC_CONTROL_3, 0x00000006);
946 dvfsrc_write(dvfsrc, DVFSRC_DEBOUNCE_TIME, 0x00001965);
947 dvfsrc_write(dvfsrc, DVFSRC_MD_LATENCY_IMPROVE, 0x00000040);
948 dvfsrc_write(dvfsrc, DVFSRC_DDR_ADD_REQUEST, 0x66543210);
949 dvfsrc_write(dvfsrc, DVFSRC_EMI_MON_DEBOUNCE_TIME, 0x4C2D0000);
950 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_MASK, 0x000EE000);
951 dvfsrc_write(dvfsrc, DVSFRC_HRT_REQ_MD_URG, 0x000D20D2);
952 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_0, 0x00200802);
953 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_1, 0x00200802);
954 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_2, 0x00200800);
955 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_3, 0x00400802);
956 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_4, 0x00601404);
957 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_5, 0x00D02C09);
958 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_6, 0x00000012);
959 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_7, 0x00000024);
960 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_8, 0x00000000);
961 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_9, 0x00000000);
962 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_10, 0x00034800);
963 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_0, 0x04B12C4B);
964 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_1, 0x04B12C4B);
965 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_2, 0x04B12C00);
966 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_3, 0x04B12C4B);
967 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_4, 0x04B12C4B);
968 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_5, 0x04B12C4B);
969 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_6, 0x0000004B);
970 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_7, 0x0000005C);
971 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_8, 0x00000000);
972 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_9, 0x00000000);
973 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_10, 0x00034800);
974 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW0_T, 0x40444440);
975 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW1_T, 0x44444444);
976 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW2_T, 0x00400444);
977 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW3_T, 0x60000000);
978 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW0, 0x20222220);
979 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW1, 0x22222222);
980 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW2, 0x00200222);
981 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW3, 0x60000000);
982 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW4, 0x00000006);
983 /* Setup up hifi request policy */
984 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST6, 0x66543210);
985 /* Setup up hw request vcore policy */
986 dvfsrc_write(dvfsrc, DVFSRC_VCORE_USER_REQ, 0x00010A29);
987 /* Setup misc*/
988 dvfsrc_write(dvfsrc, DVFSRC_TIMEOUT_NEXTREQ, 0x00000015);
989 dvfsrc_write(dvfsrc, DVFSRC_RSRV_5, 0x00000001);
990 dvfsrc_write(dvfsrc, DVFSRC_INT_EN, 0x00000002);
991 /* Init opp and trigger dvfsrc to run*/
992 dvfsrc_write(dvfsrc, DVFSRC_CURRENT_FORCE, 0x00000001);
993 dvfsrc_write(dvfsrc, DVFSRC_BASIC_CONTROL, 0x6698444B);
994 dvfsrc_write(dvfsrc, DVFSRC_BASIC_CONTROL, 0x6698054B);
995 dvfsrc_write(dvfsrc, DVFSRC_CURRENT_FORCE, 0x00000000);
996}
997
998static const struct dvfsrc_opp dvfsrc_opp_mt6873_lp4[] = {
999 {0, 0}, {1, 0}, {2, 0}, {3, 0},
1000 {0, 1}, {1, 1}, {2, 1}, {3, 1},
1001 {0, 2}, {1, 2}, {2, 2}, {3, 2},
1002 {1, 3}, {2, 3}, {3, 3}, {1, 4},
1003 {2, 4}, {3, 4}, {2, 5}, {3, 5},
1004 {3, 6},
1005};
1006
1007static const struct dvfsrc_opp_desc dvfsrc_opp_mt6873_desc[] = {
1008 DVFSRC_OPP_DESC(dvfsrc_opp_mt6873_lp4),
1009};
1010
1011static const struct dvfsrc_soc_data mt6873_data = {
1012 .opps_desc = dvfsrc_opp_mt6873_desc,
1013 .num_opp_desc = ARRAY_SIZE(dvfsrc_opp_mt6873_desc),
1014 .regs = mt6873_regs,
1015 .dvfsrc_hw_init = dvfsrc_init_mt6873,
1016 .get_target_level = mt6873_get_target_level,
1017 .get_current_level = mt6873_get_current_level,
1018 .get_vcore_level = mt6873_get_vcore_level,
1019 .get_vcp_level = mt6873_get_vcp_level,
1020 .get_dram_level = mt6873_get_dram_level,
1021 .set_dram_bw = mt6873_set_dram_bw,
1022 .set_dram_peak_bw = mt6873_set_dram_peak_bw,
1023 .set_opp_level = mt6873_set_opp_level,
1024 .set_dram_level = mt6873_set_dram_level,
1025 .set_dram_hrtbw = mt6873_set_dram_hrtbw,
1026 .set_vcore_level = mt6873_set_vcore_level,
1027 .set_vscp_level = mt6873_set_vscp_level,
1028 .wait_for_opp_level = mt6873_wait_for_opp_level,
1029 .wait_for_vcore_level = dvfsrc_wait_for_vcore_level,
1030 .wait_for_dram_level = dvfsrc_wait_for_dram_level,
1031#ifdef DVFSRC_FORCE_OPP_SUPPORT
1032 .set_force_opp_level = mt6873_set_force_opp_level,
1033#endif
1034};
1035
1036static void dvfsrc_init_mt6880(struct mtk_dvfsrc *dvfsrc)
1037{
1038 struct device_node *of_node = dvfsrc->dev->of_node;
1039
1040 /* Setup opp table */
1041 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_0_1, 0x50436053);
1042 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_2_3, 0x40335042);
1043 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_4_5, 0x40314032);
1044 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_6_7, 0x30223023);
1045 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_8_9, 0x20133021);
1046 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_10_11, 0x20112012);
1047 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_12_13, 0x10032010);
1048 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_14_15, 0x10011002);
1049 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_16_17, 0x00131000);
1050 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_18_19, 0x00110012);
1051 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_LABEL_20_21, 0x00000010);
1052 /* Setup hw emi qos policy */
1053 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST, 0x00004321);
1054 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST3, 0x00000065);
1055 /* Setup up HRT QOS policy */
1056 dvfsrc_write(dvfsrc, DVFSRC_HRT_BW_BASE, 0x00000004);
1057 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_UNIT, 0x0000001E);
1058 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH_3, 0x18A618A6);
1059 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH_2, 0x18A61183);
1060 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH_1, 0x0D690B80);
1061 dvfsrc_write(dvfsrc, DVFSRC_HRT_HIGH, 0x070804B0);
1062 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW_3, 0x18A518A5);
1063 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW_2, 0x18A51182);
1064 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW_1, 0x0D680B7F);
1065 dvfsrc_write(dvfsrc, DVFSRC_HRT_LOW, 0x070704AF);
1066 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQUEST, 0x66654321);
1067 /* Setup up SRT QOS policy */
1068 dvfsrc_write(dvfsrc, DVFSRC_QOS_EN, 0x0011007C);
1069 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS0, 0x00000019);
1070 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS1, 0x00000026);
1071 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS2, 0x00000033);
1072 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS3, 0x0000003B);
1073 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS4, 0x0000004C);
1074 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS5, 0x00000066);
1075 dvfsrc_write(dvfsrc, DVFSRC_DDR_QOS6, 0x00000066);
1076 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST5, 0x54321000);
1077 dvfsrc_write(dvfsrc, DVFSRC_DDR_REQUEST7, 0x66000000);
1078 /* Setup up MD request policy */
1079 dvfsrc_write(dvfsrc, DVFSRC_BASIC_CONTROL_3, 0x00000006);
1080 dvfsrc_write(dvfsrc, DVFSRC_DEBOUNCE_TIME, 0x00001965);
1081 dvfsrc_write(dvfsrc, DVFSRC_MD_LATENCY_IMPROVE, 0x00000040);
1082 dvfsrc_write(dvfsrc, DVFSRC_DDR_ADD_REQUEST, 0x66543210);
1083 dvfsrc_write(dvfsrc, DVFSRC_EMI_MON_DEBOUNCE_TIME, 0x4C2D0000);
1084 dvfsrc_write(dvfsrc, DVFSRC_LEVEL_MASK, 0x000EE000);
1085 /* TODO */
1086 dvfsrc_write(dvfsrc, DVSFRC_HRT_REQ_MD_URG, 0x000D20D2);
1087 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_0, 0x00200802);
1088 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_1, 0x00200802);
1089 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_2, 0x00200800);
1090 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_3, 0x00400802);
1091 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_4, 0x00601404);
1092 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_5, 0x00D02C09);
1093 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_6, 0x00000012);
1094 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_7, 0x00000024);
1095 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_8, 0x00000000);
1096 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_9, 0x00000000);
1097 dvfsrc_write(dvfsrc, DVFSRC_HRT_REQ_MD_BW_10, 0x00034800);
1098 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_0, 0x04B12C4B);
1099 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_1, 0x04B12C4B);
1100 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_2, 0x04B12C00);
1101 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_3, 0x04B12C4B);
1102 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_4, 0x04B12C4B);
1103 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_5, 0x04B12C4B);
1104 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_6, 0x0000004B);
1105 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_7, 0x0000005C);
1106 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_8, 0x00000000);
1107 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_9, 0x00000000);
1108 dvfsrc_write(dvfsrc, DVFSRC_HRT1_REQ_MD_BW_10, 0x00034800);
1109
1110 if (of_device_is_compatible(of_node, "mediatek,mt6890-dvfsrc")) {
1111 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW0_T, 0x44444440);
1112 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW1_T, 0x22244444);
1113 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW2_T, 0x00400444);
1114 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW3_T, 0x60000000);
1115 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW0, 0x22222220);
1116 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW1, 0x00022222);
1117 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW2, 0x00200222);
1118 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW3, 0x60000000);
1119 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW4, 0x00000006);
1120 } else {
1121 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW0_T, 0x22222220);
1122 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW1_T, 0x22222222);
1123 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW2_T, 0x00400422);
1124 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW3_T, 0x60000000);
1125 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW0, 0x22222220);
1126 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW1, 0x22222222);
1127 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW2, 0x00400422);
1128 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW3, 0x60000000);
1129 dvfsrc_write(dvfsrc, DVFSRC_95MD_SCEN_BW4, 0x00000006);
1130 }
1131 /* Setup up hw request vcore and ddr policy */
1132 dvfsrc_write(dvfsrc, DVFSRC_VCORE_USER_REQ, 0x00010A29);
1133 dvfsrc_write(dvfsrc, DVFSRC_BW_USER_REQ, 0x00010A29);
1134 /* Setup misc*/
1135 dvfsrc_write(dvfsrc, DVFSRC_TIMEOUT_NEXTREQ, 0x00000015);
1136 dvfsrc_write(dvfsrc, DVFSRC_RSRV_5, 0x00000001);
1137 dvfsrc_write(dvfsrc, DVFSRC_INT_EN, 0x00000002);
1138 /* Init opp and trigger dvfsrc to run*/
1139 dvfsrc_write(dvfsrc, DVFSRC_CURRENT_FORCE, 0x00000001);
1140 dvfsrc_write(dvfsrc, DVFSRC_BASIC_CONTROL, 0x4290444B);
1141 dvfsrc_write(dvfsrc, DVFSRC_BASIC_CONTROL, 0x4290054B);
1142 dvfsrc_write(dvfsrc, DVFSRC_CURRENT_FORCE, 0x00000000);
1143}
1144
1145
1146static const struct dvfsrc_opp dvfsrc_opp_mt6880_lp4[] = {
1147 {0, 0}, {1, 0}, {2, 0}, {3, 0},
1148 {0, 1}, {1, 1}, {2, 1}, {3, 1},
1149 {0, 2}, {1, 2}, {2, 2}, {3, 2},
1150 {1, 3}, {2, 3}, {3, 3}, {1, 4},
1151 {2, 4}, {3, 4}, {2, 5}, {3, 5},
1152 {3, 6},
1153};
1154
1155static const struct dvfsrc_opp_desc dvfsrc_opp_mt6880_desc[] = {
1156 DVFSRC_OPP_DESC(dvfsrc_opp_mt6880_lp4),
1157};
1158
1159static const struct dvfsrc_soc_data mt6880_data = {
1160 .opps_desc = dvfsrc_opp_mt6880_desc,
1161 .num_opp_desc = ARRAY_SIZE(dvfsrc_opp_mt6880_desc),
1162 .regs = mt6873_regs,
1163 .dvfsrc_hw_init = dvfsrc_init_mt6880,
1164 .get_target_level = mt6873_get_target_level,
1165 .get_current_level = mt6873_get_current_level,
1166 .get_vcore_level = mt6873_get_vcore_level,
1167 .get_vcp_level = mt6873_get_vcp_level,
1168 .get_dram_level = mt6873_get_dram_level,
1169 .set_dram_bw = mt6873_set_dram_bw,
1170 .set_dram_peak_bw = mt6873_set_dram_peak_bw,
1171 .set_opp_level = mt6873_set_opp_level,
1172 .set_dram_level = mt6873_set_dram_level,
1173 .set_dram_hrtbw = mt6873_set_dram_hrtbw,
1174 .set_vcore_level = mt6873_set_vcore_level,
1175 .set_vscp_level = mt6873_set_vscp_level,
1176 .wait_for_opp_level = mt6873_wait_for_opp_level,
1177 .wait_for_vcore_level = dvfsrc_wait_for_vcore_level,
1178 .wait_for_dram_level = dvfsrc_wait_for_dram_level,
1179#ifdef DVFSRC_FORCE_OPP_SUPPORT
1180 .set_force_opp_level = mt6873_set_force_opp_level,
1181#endif
1182};
1183
1184static int mtk_dvfsrc_remove(struct platform_device *pdev)
1185{
1186 struct mtk_dvfsrc *dvfsrc = platform_get_drvdata(pdev);
1187
1188 platform_device_unregister(dvfsrc->regulator);
1189 platform_device_unregister(dvfsrc->icc);
1190
1191 return 0;
1192}
1193
1194static const struct of_device_id mtk_dvfsrc_of_match[] = {
1195 {
1196 .compatible = "mediatek,mt8183-dvfsrc",
1197 .data = &mt8183_data,
1198 }, {
1199 .compatible = "mediatek,mt6873-dvfsrc",
1200 .data = &mt6873_data,
1201 }, {
1202 .compatible = "mediatek,mt6880-dvfsrc",
1203 .data = &mt6880_data,
1204 }, {
1205 .compatible = "mediatek,mt6890-dvfsrc",
1206 .data = &mt6880_data,
1207 }, {
1208 /* sentinel */
1209 },
1210};
1211
1212static struct platform_driver mtk_dvfsrc_driver = {
1213 .probe = mtk_dvfsrc_probe,
1214 .remove = mtk_dvfsrc_remove,
1215 .driver = {
1216 .name = "mtk-dvfsrc",
1217 .of_match_table = of_match_ptr(mtk_dvfsrc_of_match),
1218 },
1219};
1220
1221static int __init mtk_dvfsrc_init(void)
1222{
1223 return platform_driver_register(&mtk_dvfsrc_driver);
1224}
1225subsys_initcall(mtk_dvfsrc_init);
1226
1227static void __exit mtk_dvfsrc_exit(void)
1228{
1229 platform_driver_unregister(&mtk_dvfsrc_driver);
1230}
1231module_exit(mtk_dvfsrc_exit);
1232
1233MODULE_LICENSE("GPL v2");
1234MODULE_DESCRIPTION("MTK DVFSRC driver");