xref: /linux/drivers/soc/mediatek/mtk-svs.c (revision b8fc42dc065742bc68df6a61a2aff8cbe364fa17)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2022 MediaTek Inc.
4  * Copyright (C) 2022 Collabora Ltd.
5  *                    AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
6  */
7 
8 #include <linux/bitfield.h>
9 #include <linux/bits.h>
10 #include <linux/clk.h>
11 #include <linux/completion.h>
12 #include <linux/cpu.h>
13 #include <linux/cpuidle.h>
14 #include <linux/debugfs.h>
15 #include <linux/device.h>
16 #include <linux/init.h>
17 #include <linux/interrupt.h>
18 #include <linux/kernel.h>
19 #include <linux/kthread.h>
20 #include <linux/module.h>
21 #include <linux/mutex.h>
22 #include <linux/nvmem-consumer.h>
23 #include <linux/of_address.h>
24 #include <linux/of_irq.h>
25 #include <linux/of_platform.h>
26 #include <linux/platform_device.h>
27 #include <linux/pm_domain.h>
28 #include <linux/pm_opp.h>
29 #include <linux/pm_runtime.h>
30 #include <linux/regulator/consumer.h>
31 #include <linux/reset.h>
32 #include <linux/seq_file.h>
33 #include <linux/slab.h>
34 #include <linux/spinlock.h>
35 #include <linux/thermal.h>
36 
37 /* svs bank mode support */
38 #define SVSB_MODE_ALL_DISABLE		0
39 #define SVSB_MODE_INIT01		BIT(1)
40 #define SVSB_MODE_INIT02		BIT(2)
41 #define SVSB_MODE_MON			BIT(3)
42 
43 /* svs bank volt flags */
44 #define SVSB_INIT01_PD_REQ		BIT(0)
45 #define SVSB_INIT01_VOLT_IGNORE		BIT(1)
46 #define SVSB_INIT01_VOLT_INC_ONLY	BIT(2)
47 #define SVSB_MON_VOLT_IGNORE		BIT(16)
48 #define SVSB_REMOVE_DVTFIXED_VOLT	BIT(24)
49 
50 /* svs bank register fields and common configuration */
51 #define SVSB_PTPCONFIG_DETMAX		GENMASK(15, 0)
52 #define SVSB_DET_MAX			FIELD_PREP(SVSB_PTPCONFIG_DETMAX, 0xffff)
53 #define SVSB_DET_WINDOW			0xa28
54 
55 /* DESCHAR */
56 #define SVSB_DESCHAR_FLD_MDES		GENMASK(7, 0)
57 #define SVSB_DESCHAR_FLD_BDES		GENMASK(15, 8)
58 
59 /* TEMPCHAR */
60 #define SVSB_TEMPCHAR_FLD_DVT_FIXED	GENMASK(7, 0)
61 #define SVSB_TEMPCHAR_FLD_MTDES		GENMASK(15, 8)
62 #define SVSB_TEMPCHAR_FLD_VCO		GENMASK(23, 16)
63 
64 /* DETCHAR */
65 #define SVSB_DETCHAR_FLD_DCMDET		GENMASK(7, 0)
66 #define SVSB_DETCHAR_FLD_DCBDET		GENMASK(15, 8)
67 
68 /* SVSEN (PTPEN) */
69 #define SVSB_PTPEN_INIT01		BIT(0)
70 #define SVSB_PTPEN_MON			BIT(1)
71 #define SVSB_PTPEN_INIT02		(SVSB_PTPEN_INIT01 | BIT(2))
72 #define SVSB_PTPEN_OFF			0x0
73 
74 /* FREQPCTS */
75 #define SVSB_FREQPCTS_FLD_PCT0_4	GENMASK(7, 0)
76 #define SVSB_FREQPCTS_FLD_PCT1_5	GENMASK(15, 8)
77 #define SVSB_FREQPCTS_FLD_PCT2_6	GENMASK(23, 16)
78 #define SVSB_FREQPCTS_FLD_PCT3_7	GENMASK(31, 24)
79 
80 /* INTSTS */
81 #define SVSB_INTSTS_VAL_CLEAN		0x00ffffff
82 #define SVSB_INTSTS_F0_COMPLETE		BIT(0)
83 #define SVSB_INTSTS_FLD_MONVOP		GENMASK(23, 16)
84 #define SVSB_RUNCONFIG_DEFAULT		0x80000000
85 
86 /* LIMITVALS */
87 #define SVSB_LIMITVALS_FLD_DTLO		GENMASK(7, 0)
88 #define SVSB_LIMITVALS_FLD_DTHI		GENMASK(15, 8)
89 #define SVSB_LIMITVALS_FLD_VMIN		GENMASK(23, 16)
90 #define SVSB_LIMITVALS_FLD_VMAX		GENMASK(31, 24)
91 #define SVSB_VAL_DTHI			0x1
92 #define SVSB_VAL_DTLO			0xfe
93 
94 /* INTEN */
95 #define SVSB_INTEN_F0EN			BIT(0)
96 #define SVSB_INTEN_DACK0UPEN		BIT(8)
97 #define SVSB_INTEN_DC0EN		BIT(9)
98 #define SVSB_INTEN_DC1EN		BIT(10)
99 #define SVSB_INTEN_DACK0LOEN		BIT(11)
100 #define SVSB_INTEN_INITPROD_OVF_EN	BIT(12)
101 #define SVSB_INTEN_INITSUM_OVF_EN	BIT(14)
102 #define SVSB_INTEN_MONVOPEN		GENMASK(23, 16)
103 #define SVSB_INTEN_INIT0x		(SVSB_INTEN_F0EN | SVSB_INTEN_DACK0UPEN |	\
104 					 SVSB_INTEN_DC0EN | SVSB_INTEN_DC1EN |		\
105 					 SVSB_INTEN_DACK0LOEN |				\
106 					 SVSB_INTEN_INITPROD_OVF_EN |			\
107 					 SVSB_INTEN_INITSUM_OVF_EN)
108 
109 /* TSCALCS */
110 #define SVSB_TSCALCS_FLD_MTS		GENMASK(11, 0)
111 #define SVSB_TSCALCS_FLD_BTS		GENMASK(23, 12)
112 
113 /* INIT2VALS */
114 #define SVSB_INIT2VALS_FLD_DCVOFFSETIN	GENMASK(15, 0)
115 #define SVSB_INIT2VALS_FLD_AGEVOFFSETIN	GENMASK(31, 16)
116 
117 /* VOPS */
118 #define SVSB_VOPS_FLD_VOP0_4		GENMASK(7, 0)
119 #define SVSB_VOPS_FLD_VOP1_5		GENMASK(15, 8)
120 #define SVSB_VOPS_FLD_VOP2_6		GENMASK(23, 16)
121 #define SVSB_VOPS_FLD_VOP3_7		GENMASK(31, 24)
122 
123 /* SVS Thermal Coefficients */
124 #define SVSB_TS_COEFF_MT8195		250460
125 #define SVSB_TS_COEFF_MT8186		204650
126 
127 /* Algo helpers */
128 #define FUSE_DATA_NOT_VALID		U32_MAX
129 
130 /* svs bank related setting */
131 #define BITS8				8
132 #define MAX_OPP_ENTRIES			16
133 #define REG_BYTES			4
134 #define SVSB_DC_SIGNED_BIT		BIT(15)
135 #define SVSB_DET_CLK_EN			BIT(31)
136 #define SVSB_TEMP_LOWER_BOUND		0xb2
137 #define SVSB_TEMP_UPPER_BOUND		0x64
138 
139 static DEFINE_SPINLOCK(svs_lock);
140 
141 #ifdef CONFIG_DEBUG_FS
142 #define debug_fops_ro(name)						\
143 	static int svs_##name##_debug_open(struct inode *inode,		\
144 					   struct file *filp)		\
145 	{								\
146 		return single_open(filp, svs_##name##_debug_show,	\
147 				   inode->i_private);			\
148 	}								\
149 	static const struct file_operations svs_##name##_debug_fops = {	\
150 		.owner = THIS_MODULE,					\
151 		.open = svs_##name##_debug_open,			\
152 		.read = seq_read,					\
153 		.llseek = seq_lseek,					\
154 		.release = single_release,				\
155 	}
156 
157 #define debug_fops_rw(name)						\
158 	static int svs_##name##_debug_open(struct inode *inode,		\
159 					   struct file *filp)		\
160 	{								\
161 		return single_open(filp, svs_##name##_debug_show,	\
162 				   inode->i_private);			\
163 	}								\
164 	static const struct file_operations svs_##name##_debug_fops = {	\
165 		.owner = THIS_MODULE,					\
166 		.open = svs_##name##_debug_open,			\
167 		.read = seq_read,					\
168 		.write = svs_##name##_debug_write,			\
169 		.llseek = seq_lseek,					\
170 		.release = single_release,				\
171 	}
172 
173 #define svs_dentry_data(name)	{__stringify(name), &svs_##name##_debug_fops}
174 #endif
175 
176 /**
177  * enum svsb_sw_id - SVS Bank Software ID
178  * @SVSB_SWID_CPU_LITTLE: CPU little cluster Bank
179  * @SVSB_SWID_CPU_BIG:    CPU big cluster Bank
180  * @SVSB_SWID_CCI:        Cache Coherent Interconnect Bank
181  * @SVSB_SWID_GPU:        GPU Bank
182  * @SVSB_SWID_MAX:        Total number of Banks
183  */
184 enum svsb_sw_id {
185 	SVSB_SWID_CPU_LITTLE,
186 	SVSB_SWID_CPU_BIG,
187 	SVSB_SWID_CCI,
188 	SVSB_SWID_GPU,
189 	SVSB_SWID_MAX
190 };
191 
192 /**
193  * enum svsb_type - SVS Bank 2-line: Type and Role
194  * @SVSB_TYPE_NONE: One-line type Bank - Global role
195  * @SVSB_TYPE_LOW:  Two-line type Bank - Low bank role
196  * @SVSB_TYPE_HIGH: Two-line type Bank - High bank role
197  * @SVSB_TYPE_MAX:  Total number of bank types
198  */
199 enum svsb_type {
200 	SVSB_TYPE_NONE,
201 	SVSB_TYPE_LOW,
202 	SVSB_TYPE_HIGH,
203 	SVSB_TYPE_MAX
204 };
205 
206 /**
207  * enum svsb_phase - svs bank phase enumeration
208  * @SVSB_PHASE_ERROR: svs bank encounters unexpected condition
209  * @SVSB_PHASE_INIT01: svs bank basic init for data calibration
210  * @SVSB_PHASE_INIT02: svs bank can provide voltages to opp table
211  * @SVSB_PHASE_MON: svs bank can provide voltages with thermal effect
212  * @SVSB_PHASE_MAX: total number of svs bank phase (debug purpose)
213  *
214  * Each svs bank has its own independent phase and we enable each svs bank by
215  * running their phase orderly. However, when svs bank encounters unexpected
216  * condition, it will fire an irq (PHASE_ERROR) to inform svs software.
217  *
218  * svs bank general phase-enabled order:
219  * SVSB_PHASE_INIT01 -> SVSB_PHASE_INIT02 -> SVSB_PHASE_MON
220  */
221 enum svsb_phase {
222 	SVSB_PHASE_ERROR = 0,
223 	SVSB_PHASE_INIT01,
224 	SVSB_PHASE_INIT02,
225 	SVSB_PHASE_MON,
226 	SVSB_PHASE_MAX,
227 };
228 
229 enum svs_reg_index {
230 	DESCHAR = 0,
231 	TEMPCHAR,
232 	DETCHAR,
233 	AGECHAR,
234 	DCCONFIG,
235 	AGECONFIG,
236 	FREQPCT30,
237 	FREQPCT74,
238 	LIMITVALS,
239 	VBOOT,
240 	DETWINDOW,
241 	CONFIG,
242 	TSCALCS,
243 	RUNCONFIG,
244 	SVSEN,
245 	INIT2VALS,
246 	DCVALUES,
247 	AGEVALUES,
248 	VOP30,
249 	VOP74,
250 	TEMP,
251 	INTSTS,
252 	INTSTSRAW,
253 	INTEN,
254 	CHKINT,
255 	CHKSHIFT,
256 	STATUS,
257 	VDESIGN30,
258 	VDESIGN74,
259 	DVT30,
260 	DVT74,
261 	AGECOUNT,
262 	SMSTATE0,
263 	SMSTATE1,
264 	CTL0,
265 	DESDETSEC,
266 	TEMPAGESEC,
267 	CTRLSPARE0,
268 	CTRLSPARE1,
269 	CTRLSPARE2,
270 	CTRLSPARE3,
271 	CORESEL,
272 	THERMINTST,
273 	INTST,
274 	THSTAGE0ST,
275 	THSTAGE1ST,
276 	THSTAGE2ST,
277 	THAHBST0,
278 	THAHBST1,
279 	SPARE0,
280 	SPARE1,
281 	SPARE2,
282 	SPARE3,
283 	THSLPEVEB,
284 	SVS_REG_MAX,
285 };
286 
287 static const u32 svs_regs_v2[] = {
288 	[DESCHAR]		= 0x00,
289 	[TEMPCHAR]		= 0x04,
290 	[DETCHAR]		= 0x08,
291 	[AGECHAR]		= 0x0c,
292 	[DCCONFIG]		= 0x10,
293 	[AGECONFIG]		= 0x14,
294 	[FREQPCT30]		= 0x18,
295 	[FREQPCT74]		= 0x1c,
296 	[LIMITVALS]		= 0x20,
297 	[VBOOT]			= 0x24,
298 	[DETWINDOW]		= 0x28,
299 	[CONFIG]		= 0x2c,
300 	[TSCALCS]		= 0x30,
301 	[RUNCONFIG]		= 0x34,
302 	[SVSEN]			= 0x38,
303 	[INIT2VALS]		= 0x3c,
304 	[DCVALUES]		= 0x40,
305 	[AGEVALUES]		= 0x44,
306 	[VOP30]			= 0x48,
307 	[VOP74]			= 0x4c,
308 	[TEMP]			= 0x50,
309 	[INTSTS]		= 0x54,
310 	[INTSTSRAW]		= 0x58,
311 	[INTEN]			= 0x5c,
312 	[CHKINT]		= 0x60,
313 	[CHKSHIFT]		= 0x64,
314 	[STATUS]		= 0x68,
315 	[VDESIGN30]		= 0x6c,
316 	[VDESIGN74]		= 0x70,
317 	[DVT30]			= 0x74,
318 	[DVT74]			= 0x78,
319 	[AGECOUNT]		= 0x7c,
320 	[SMSTATE0]		= 0x80,
321 	[SMSTATE1]		= 0x84,
322 	[CTL0]			= 0x88,
323 	[DESDETSEC]		= 0xe0,
324 	[TEMPAGESEC]		= 0xe4,
325 	[CTRLSPARE0]		= 0xf0,
326 	[CTRLSPARE1]		= 0xf4,
327 	[CTRLSPARE2]		= 0xf8,
328 	[CTRLSPARE3]		= 0xfc,
329 	[CORESEL]		= 0x300,
330 	[THERMINTST]		= 0x304,
331 	[INTST]			= 0x308,
332 	[THSTAGE0ST]		= 0x30c,
333 	[THSTAGE1ST]		= 0x310,
334 	[THSTAGE2ST]		= 0x314,
335 	[THAHBST0]		= 0x318,
336 	[THAHBST1]		= 0x31c,
337 	[SPARE0]		= 0x320,
338 	[SPARE1]		= 0x324,
339 	[SPARE2]		= 0x328,
340 	[SPARE3]		= 0x32c,
341 	[THSLPEVEB]		= 0x330,
342 };
343 
344 static const char * const svs_swid_names[SVSB_SWID_MAX] = {
345 	"SVSB_CPU_LITTLE", "SVSB_CPU_BIG", "SVSB_CCI", "SVSB_GPU"
346 };
347 
348 static const char * const svs_type_names[SVSB_TYPE_MAX] = {
349 	"", "_LOW", "_HIGH"
350 };
351 
352 enum svs_fusemap_dev {
353 	BDEV_BDES,
354 	BDEV_MDES,
355 	BDEV_MTDES,
356 	BDEV_DCBDET,
357 	BDEV_DCMDET,
358 	BDEV_MAX
359 };
360 
361 enum svs_fusemap_glb {
362 	GLB_FT_PGM,
363 	GLB_VMIN,
364 	GLB_MAX
365 };
366 
367 struct svs_fusemap {
368 	s8 index;
369 	u8 ofst;
370 };
371 
372 /**
373  * struct svs_platform - svs platform control
374  * @base: svs platform register base
375  * @dev: svs platform device
376  * @main_clk: main clock for svs bank
377  * @banks: svs banks that svs platform supports
378  * @rst: svs platform reset control
379  * @efuse_max: total number of svs efuse
380  * @tefuse_max: total number of thermal efuse
381  * @regs: svs platform registers map
382  * @efuse: svs efuse data received from NVMEM framework
383  * @tefuse: thermal efuse data received from NVMEM framework
384  * @ts_coeff: thermal sensors coefficient
385  * @bank_max: total number of svs banks
386  */
387 struct svs_platform {
388 	void __iomem *base;
389 	struct device *dev;
390 	struct clk *main_clk;
391 	struct svs_bank *banks;
392 	struct reset_control *rst;
393 	size_t efuse_max;
394 	size_t tefuse_max;
395 	const u32 *regs;
396 	u32 *efuse;
397 	u32 *tefuse;
398 	u32 ts_coeff;
399 	u16 bank_max;
400 };
401 
402 struct svs_platform_data {
403 	char *name;
404 	struct svs_bank *banks;
405 	bool (*efuse_parsing)(struct svs_platform *svsp, const struct svs_platform_data *pdata);
406 	int (*probe)(struct svs_platform *svsp);
407 	const struct svs_fusemap *glb_fuse_map;
408 	const u32 *regs;
409 	u32 ts_coeff;
410 	u16 bank_max;
411 };
412 
413 /**
414  * struct svs_bank_pdata - SVS Bank immutable config parameters
415  * @dev_fuse_map: Bank fuse map data
416  * @buck_name: Regulator name
417  * @tzone_name: Thermal zone name
418  * @age_config: Bank age configuration
419  * @ctl0: TS-x selection
420  * @dc_config: Bank dc configuration
421  * @int_st: Bank interrupt identification
422  * @turn_freq_base: Reference frequency for 2-line turn point
423  * @tzone_htemp: Thermal zone high temperature threshold
424  * @tzone_ltemp: Thermal zone low temperature threshold
425  * @volt_step: Bank voltage step
426  * @volt_base: Bank voltage base
427  * @tzone_htemp_voffset: Thermal zone high temperature voltage offset
428  * @tzone_ltemp_voffset: Thermal zone low temperature voltage offset
429  * @chk_shift: Bank chicken shift
430  * @cpu_id: CPU core ID for SVS CPU bank use only
431  * @opp_count: Bank opp count
432  * @vboot: Voltage request for bank init01 only
433  * @vco: Bank VCO value
434  * @sw_id: Bank software identification
435  * @type: SVS Bank Type (1 or 2-line) and Role (high/low)
436  * @set_freq_pct: function pointer to set bank frequency percent table
437  * @get_volts: function pointer to get bank voltages
438  */
439 struct svs_bank_pdata {
440 	const struct svs_fusemap *dev_fuse_map;
441 	char *buck_name;
442 	char *tzone_name;
443 	u32 age_config;
444 	u32 ctl0;
445 	u32 dc_config;
446 	u32 int_st;
447 	u32 turn_freq_base;
448 	u32 tzone_htemp;
449 	u32 tzone_ltemp;
450 	u32 volt_step;
451 	u32 volt_base;
452 	u16 tzone_htemp_voffset;
453 	u16 tzone_ltemp_voffset;
454 	u8 chk_shift;
455 	u8 cpu_id;
456 	u8 opp_count;
457 	u8 vboot;
458 	u8 vco;
459 	u8 sw_id;
460 	u8 type;
461 
462 	/* Callbacks */
463 	void (*set_freq_pct)(struct svs_platform *svsp, struct svs_bank *svsb);
464 	void (*get_volts)(struct svs_platform *svsp, struct svs_bank *svsb);
465 };
466 
467 /**
468  * struct svs_bank - svs bank representation
469  * @pdata: SVS Bank immutable config parameters
470  * @dev: bank device
471  * @opp_dev: device for opp table/buck control
472  * @init_completion: the timeout completion for bank init
473  * @buck: regulator used by opp_dev
474  * @tzd: thermal zone device for getting temperature
475  * @lock: mutex lock to protect voltage update process
476  * @name: bank name
477  * @phase: bank current phase
478  * @volt_od: bank voltage overdrive
479  * @reg_data: bank register data in different phase for debug purpose
480  * @pm_runtime_enabled_count: bank pm runtime enabled count
481  * @mode_support: bank mode support
482  * @freq_base: reference frequency for bank init
483  * @opp_dfreq: default opp frequency table
484  * @opp_dvolt: default opp voltage table
485  * @freq_pct: frequency percent table for bank init
486  * @volt: bank voltage table
487  * @volt_flags: bank voltage flags
488  * @vmax: bank voltage maximum
489  * @vmin: bank voltage minimum
490  * @age_voffset_in: bank age voltage offset
491  * @dc_voffset_in: bank dc voltage offset
492  * @dvt_fixed: bank dvt fixed value
493  * @core_sel: bank selection
494  * @temp: bank temperature
495  * @bts: svs efuse data
496  * @mts: svs efuse data
497  * @bdes: svs efuse data
498  * @mdes: svs efuse data
499  * @mtdes: svs efuse data
500  * @dcbdet: svs efuse data
501  * @dcmdet: svs efuse data
502  * @turn_pt: 2-line turn point tells which opp_volt calculated by high/low bank
503  * @vbin_turn_pt: voltage bin turn point helps know which svsb_volt should be overridden
504  *
505  * Svs bank will generate suitable voltages by below general math equation
506  * and provide these voltages to opp voltage table.
507  *
508  * opp_volt[i] = (volt[i] * volt_step) + volt_base;
509  */
510 struct svs_bank {
511 	const struct svs_bank_pdata pdata;
512 	struct device *dev;
513 	struct device *opp_dev;
514 	struct completion init_completion;
515 	struct regulator *buck;
516 	struct thermal_zone_device *tzd;
517 	struct mutex lock;
518 	int pm_runtime_enabled_count;
519 	short int volt_od;
520 	char *name;
521 	enum svsb_phase phase;
522 	u32 reg_data[SVSB_PHASE_MAX][SVS_REG_MAX];
523 	u8 mode_support;
524 	u32 opp_dfreq[MAX_OPP_ENTRIES];
525 	u32 opp_dvolt[MAX_OPP_ENTRIES];
526 	u32 freq_pct[MAX_OPP_ENTRIES];
527 	u32 volt[MAX_OPP_ENTRIES];
528 	u32 volt_flags;
529 	u32 freq_base;
530 	u32 turn_pt;
531 	u32 vbin_turn_pt;
532 	u32 core_sel;
533 	u32 temp;
534 	u16 age_voffset_in;
535 	u16 dc_voffset_in;
536 	u8 dvt_fixed;
537 	u8 vmax;
538 	u8 vmin;
539 	u16 bts;
540 	u16 mts;
541 	u16 bdes;
542 	u16 mdes;
543 	u8 mtdes;
544 	u8 dcbdet;
545 	u8 dcmdet;
546 };
547 
548 static u32 percent(u32 numerator, u32 denominator)
549 {
550 	/* If not divide 1000, "numerator * 100" will have data overflow. */
551 	numerator /= 1000;
552 	denominator /= 1000;
553 
554 	return DIV_ROUND_UP(numerator * 100, denominator);
555 }
556 
557 static u32 svs_readl_relaxed(struct svs_platform *svsp, enum svs_reg_index rg_i)
558 {
559 	return readl_relaxed(svsp->base + svsp->regs[rg_i]);
560 }
561 
562 static void svs_writel_relaxed(struct svs_platform *svsp, u32 val,
563 			       enum svs_reg_index rg_i)
564 {
565 	writel_relaxed(val, svsp->base + svsp->regs[rg_i]);
566 }
567 
568 static void svs_switch_bank(struct svs_platform *svsp, struct svs_bank *svsb)
569 {
570 	svs_writel_relaxed(svsp, svsb->core_sel, CORESEL);
571 }
572 
573 static u32 svs_bank_volt_to_opp_volt(u32 svsb_volt, u32 svsb_volt_step,
574 				     u32 svsb_volt_base)
575 {
576 	return (svsb_volt * svsb_volt_step) + svsb_volt_base;
577 }
578 
579 static u32 svs_opp_volt_to_bank_volt(u32 opp_u_volt, u32 svsb_volt_step,
580 				     u32 svsb_volt_base)
581 {
582 	return (opp_u_volt - svsb_volt_base) / svsb_volt_step;
583 }
584 
585 static int svs_sync_bank_volts_from_opp(struct svs_bank *svsb)
586 {
587 	const struct svs_bank_pdata *bdata = &svsb->pdata;
588 	struct dev_pm_opp *opp;
589 	u32 i, opp_u_volt;
590 
591 	for (i = 0; i < bdata->opp_count; i++) {
592 		opp = dev_pm_opp_find_freq_exact(svsb->opp_dev,
593 						 svsb->opp_dfreq[i],
594 						 true);
595 		if (IS_ERR(opp)) {
596 			dev_err(svsb->dev, "cannot find freq = %u (%ld)\n",
597 				svsb->opp_dfreq[i], PTR_ERR(opp));
598 			return PTR_ERR(opp);
599 		}
600 
601 		opp_u_volt = dev_pm_opp_get_voltage(opp);
602 		svsb->volt[i] = svs_opp_volt_to_bank_volt(opp_u_volt,
603 							  bdata->volt_step,
604 							  bdata->volt_base);
605 		dev_pm_opp_put(opp);
606 	}
607 
608 	return 0;
609 }
610 
611 static int svs_adjust_pm_opp_volts(struct svs_bank *svsb)
612 {
613 	int ret = -EPERM, tzone_temp = 0;
614 	const struct svs_bank_pdata *bdata = &svsb->pdata;
615 	u32 i, svsb_volt, opp_volt, temp_voffset = 0, opp_start, opp_stop;
616 
617 	mutex_lock(&svsb->lock);
618 
619 	/*
620 	 * 2-line bank updates its corresponding opp volts.
621 	 * 1-line bank updates all opp volts.
622 	 */
623 	if (bdata->type == SVSB_TYPE_HIGH) {
624 		opp_start = 0;
625 		opp_stop = svsb->turn_pt;
626 	} else if (bdata->type == SVSB_TYPE_LOW) {
627 		opp_start = svsb->turn_pt;
628 		opp_stop = bdata->opp_count;
629 	} else {
630 		opp_start = 0;
631 		opp_stop = bdata->opp_count;
632 	}
633 
634 	/* Get thermal effect */
635 	if (!IS_ERR_OR_NULL(svsb->tzd)) {
636 		ret = thermal_zone_get_temp(svsb->tzd, &tzone_temp);
637 		if (ret || (svsb->temp > SVSB_TEMP_UPPER_BOUND &&
638 			    svsb->temp < SVSB_TEMP_LOWER_BOUND)) {
639 			dev_err(svsb->dev, "%s: %d (0x%x), run default volts\n",
640 				bdata->tzone_name, ret, svsb->temp);
641 			svsb->phase = SVSB_PHASE_ERROR;
642 		}
643 
644 		if (tzone_temp >= bdata->tzone_htemp)
645 			temp_voffset += bdata->tzone_htemp_voffset;
646 		else if (tzone_temp <= bdata->tzone_ltemp)
647 			temp_voffset += bdata->tzone_ltemp_voffset;
648 
649 		/* 2-line bank update all opp volts when running mon mode */
650 		if (svsb->phase == SVSB_PHASE_MON && (bdata->type == SVSB_TYPE_HIGH ||
651 						      bdata->type == SVSB_TYPE_LOW)) {
652 			opp_start = 0;
653 			opp_stop = bdata->opp_count;
654 		}
655 	}
656 
657 	/* vmin <= svsb_volt (opp_volt) <= default opp voltage */
658 	for (i = opp_start; i < opp_stop; i++) {
659 		switch (svsb->phase) {
660 		case SVSB_PHASE_ERROR:
661 			opp_volt = svsb->opp_dvolt[i];
662 			break;
663 		case SVSB_PHASE_INIT01:
664 			/* do nothing */
665 			goto unlock_mutex;
666 		case SVSB_PHASE_INIT02:
667 		case SVSB_PHASE_MON:
668 			svsb_volt = max(svsb->volt[i] + temp_voffset, svsb->vmin);
669 			opp_volt = svs_bank_volt_to_opp_volt(svsb_volt,
670 							     bdata->volt_step,
671 							     bdata->volt_base);
672 			break;
673 		default:
674 			dev_err(svsb->dev, "unknown phase: %u\n", svsb->phase);
675 			ret = -EINVAL;
676 			goto unlock_mutex;
677 		}
678 
679 		opp_volt = min(opp_volt, svsb->opp_dvolt[i]);
680 		ret = dev_pm_opp_adjust_voltage(svsb->opp_dev,
681 						svsb->opp_dfreq[i],
682 						opp_volt, opp_volt,
683 						svsb->opp_dvolt[i]);
684 		if (ret) {
685 			dev_err(svsb->dev, "set %uuV fail: %d\n",
686 				opp_volt, ret);
687 			goto unlock_mutex;
688 		}
689 	}
690 
691 unlock_mutex:
692 	mutex_unlock(&svsb->lock);
693 
694 	return ret;
695 }
696 
697 static void svs_bank_disable_and_restore_default_volts(struct svs_platform *svsp,
698 						       struct svs_bank *svsb)
699 {
700 	unsigned long flags;
701 
702 	if (svsb->mode_support == SVSB_MODE_ALL_DISABLE)
703 		return;
704 
705 	spin_lock_irqsave(&svs_lock, flags);
706 	svs_switch_bank(svsp, svsb);
707 	svs_writel_relaxed(svsp, SVSB_PTPEN_OFF, SVSEN);
708 	svs_writel_relaxed(svsp, SVSB_INTSTS_VAL_CLEAN, INTSTS);
709 	spin_unlock_irqrestore(&svs_lock, flags);
710 
711 	svsb->phase = SVSB_PHASE_ERROR;
712 	svs_adjust_pm_opp_volts(svsb);
713 }
714 
715 #ifdef CONFIG_DEBUG_FS
716 static int svs_dump_debug_show(struct seq_file *m, void *p)
717 {
718 	struct svs_platform *svsp = (struct svs_platform *)m->private;
719 	struct svs_bank *svsb;
720 	unsigned long svs_reg_addr;
721 	u32 idx, i, j, bank_id;
722 
723 	for (i = 0; i < svsp->efuse_max; i++)
724 		if (svsp->efuse && svsp->efuse[i])
725 			seq_printf(m, "M_HW_RES%d = 0x%08x\n",
726 				   i, svsp->efuse[i]);
727 
728 	for (i = 0; i < svsp->tefuse_max; i++)
729 		if (svsp->tefuse)
730 			seq_printf(m, "THERMAL_EFUSE%d = 0x%08x\n",
731 				   i, svsp->tefuse[i]);
732 
733 	for (bank_id = 0, idx = 0; idx < svsp->bank_max; idx++, bank_id++) {
734 		svsb = &svsp->banks[idx];
735 
736 		for (i = SVSB_PHASE_INIT01; i <= SVSB_PHASE_MON; i++) {
737 			seq_printf(m, "Bank_number = %u\n", bank_id);
738 
739 			if (i == SVSB_PHASE_INIT01 || i == SVSB_PHASE_INIT02)
740 				seq_printf(m, "mode = init%d\n", i);
741 			else if (i == SVSB_PHASE_MON)
742 				seq_puts(m, "mode = mon\n");
743 			else
744 				seq_puts(m, "mode = error\n");
745 
746 			for (j = DESCHAR; j < SVS_REG_MAX; j++) {
747 				svs_reg_addr = (unsigned long)(svsp->base +
748 							       svsp->regs[j]);
749 				seq_printf(m, "0x%08lx = 0x%08x\n",
750 					   svs_reg_addr, svsb->reg_data[i][j]);
751 			}
752 		}
753 	}
754 
755 	return 0;
756 }
757 
758 debug_fops_ro(dump);
759 
760 static int svs_enable_debug_show(struct seq_file *m, void *v)
761 {
762 	struct svs_bank *svsb = (struct svs_bank *)m->private;
763 
764 	switch (svsb->phase) {
765 	case SVSB_PHASE_ERROR:
766 		seq_puts(m, "disabled\n");
767 		break;
768 	case SVSB_PHASE_INIT01:
769 		seq_puts(m, "init1\n");
770 		break;
771 	case SVSB_PHASE_INIT02:
772 		seq_puts(m, "init2\n");
773 		break;
774 	case SVSB_PHASE_MON:
775 		seq_puts(m, "mon mode\n");
776 		break;
777 	default:
778 		seq_puts(m, "unknown\n");
779 		break;
780 	}
781 
782 	return 0;
783 }
784 
785 static ssize_t svs_enable_debug_write(struct file *filp,
786 				      const char __user *buffer,
787 				      size_t count, loff_t *pos)
788 {
789 	struct svs_bank *svsb = file_inode(filp)->i_private;
790 	struct svs_platform *svsp = dev_get_drvdata(svsb->dev);
791 	int enabled, ret;
792 	char *buf = NULL;
793 
794 	if (count >= PAGE_SIZE)
795 		return -EINVAL;
796 
797 	buf = (char *)memdup_user_nul(buffer, count);
798 	if (IS_ERR(buf))
799 		return PTR_ERR(buf);
800 
801 	ret = kstrtoint(buf, 10, &enabled);
802 	if (ret)
803 		return ret;
804 
805 	if (!enabled) {
806 		svs_bank_disable_and_restore_default_volts(svsp, svsb);
807 		svsb->mode_support = SVSB_MODE_ALL_DISABLE;
808 	}
809 
810 	kfree(buf);
811 
812 	return count;
813 }
814 
815 debug_fops_rw(enable);
816 
817 static int svs_status_debug_show(struct seq_file *m, void *v)
818 {
819 	struct svs_bank *svsb = (struct svs_bank *)m->private;
820 	struct dev_pm_opp *opp;
821 	int tzone_temp = 0, ret;
822 	u32 i;
823 
824 	ret = thermal_zone_get_temp(svsb->tzd, &tzone_temp);
825 	if (ret)
826 		seq_printf(m, "%s: temperature ignore, vbin_turn_pt = %u, turn_pt = %u\n",
827 			   svsb->name, svsb->vbin_turn_pt, svsb->turn_pt);
828 	else
829 		seq_printf(m, "%s: temperature = %d, vbin_turn_pt = %u, turn_pt = %u\n",
830 			   svsb->name, tzone_temp, svsb->vbin_turn_pt,
831 			   svsb->turn_pt);
832 
833 	for (i = 0; i < svsb->pdata.opp_count; i++) {
834 		opp = dev_pm_opp_find_freq_exact(svsb->opp_dev,
835 						 svsb->opp_dfreq[i], true);
836 		if (IS_ERR(opp)) {
837 			seq_printf(m, "%s: cannot find freq = %u (%ld)\n",
838 				   svsb->name, svsb->opp_dfreq[i],
839 				   PTR_ERR(opp));
840 			return PTR_ERR(opp);
841 		}
842 
843 		seq_printf(m, "opp_freq[%02u]: %u, opp_volt[%02u]: %lu, ",
844 			   i, svsb->opp_dfreq[i], i,
845 			   dev_pm_opp_get_voltage(opp));
846 		seq_printf(m, "svsb_volt[%02u]: 0x%x, freq_pct[%02u]: %u\n",
847 			   i, svsb->volt[i], i, svsb->freq_pct[i]);
848 		dev_pm_opp_put(opp);
849 	}
850 
851 	return 0;
852 }
853 
854 debug_fops_ro(status);
855 
856 static int svs_create_debug_cmds(struct svs_platform *svsp)
857 {
858 	struct svs_bank *svsb;
859 	struct dentry *svs_dir, *svsb_dir, *file_entry;
860 	const char *d = "/sys/kernel/debug/svs";
861 	u32 i, idx;
862 
863 	struct svs_dentry {
864 		const char *name;
865 		const struct file_operations *fops;
866 	};
867 
868 	struct svs_dentry svs_entries[] = {
869 		svs_dentry_data(dump),
870 	};
871 
872 	struct svs_dentry svsb_entries[] = {
873 		svs_dentry_data(enable),
874 		svs_dentry_data(status),
875 	};
876 
877 	svs_dir = debugfs_create_dir("svs", NULL);
878 	if (IS_ERR(svs_dir)) {
879 		dev_err(svsp->dev, "cannot create %s: %ld\n",
880 			d, PTR_ERR(svs_dir));
881 		return PTR_ERR(svs_dir);
882 	}
883 
884 	for (i = 0; i < ARRAY_SIZE(svs_entries); i++) {
885 		file_entry = debugfs_create_file(svs_entries[i].name, 0664,
886 						 svs_dir, svsp,
887 						 svs_entries[i].fops);
888 		if (IS_ERR(file_entry)) {
889 			dev_err(svsp->dev, "cannot create %s/%s: %ld\n",
890 				d, svs_entries[i].name, PTR_ERR(file_entry));
891 			return PTR_ERR(file_entry);
892 		}
893 	}
894 
895 	for (idx = 0; idx < svsp->bank_max; idx++) {
896 		svsb = &svsp->banks[idx];
897 
898 		if (svsb->mode_support == SVSB_MODE_ALL_DISABLE)
899 			continue;
900 
901 		svsb_dir = debugfs_create_dir(svsb->name, svs_dir);
902 		if (IS_ERR(svsb_dir)) {
903 			dev_err(svsp->dev, "cannot create %s/%s: %ld\n",
904 				d, svsb->name, PTR_ERR(svsb_dir));
905 			return PTR_ERR(svsb_dir);
906 		}
907 
908 		for (i = 0; i < ARRAY_SIZE(svsb_entries); i++) {
909 			file_entry = debugfs_create_file(svsb_entries[i].name,
910 							 0664, svsb_dir, svsb,
911 							 svsb_entries[i].fops);
912 			if (IS_ERR(file_entry)) {
913 				dev_err(svsp->dev, "no %s/%s/%s?: %ld\n",
914 					d, svsb->name, svsb_entries[i].name,
915 					PTR_ERR(file_entry));
916 				return PTR_ERR(file_entry);
917 			}
918 		}
919 	}
920 
921 	return 0;
922 }
923 #endif /* CONFIG_DEBUG_FS */
924 
925 static u32 interpolate(u32 f0, u32 f1, u32 v0, u32 v1, u32 fx)
926 {
927 	u32 vx;
928 
929 	if (v0 == v1 || f0 == f1)
930 		return v0;
931 
932 	/* *100 to have decimal fraction factor */
933 	vx = (v0 * 100) - ((((v0 - v1) * 100) / (f0 - f1)) * (f0 - fx));
934 
935 	return DIV_ROUND_UP(vx, 100);
936 }
937 
938 static void svs_get_bank_volts_v3(struct svs_platform *svsp, struct svs_bank *svsb)
939 {
940 	const struct svs_bank_pdata *bdata = &svsb->pdata;
941 	u32 i, j, *vop, vop74, vop30, turn_pt = svsb->turn_pt;
942 	u32 b_sft, shift_byte = 0, opp_start = 0, opp_stop = 0;
943 	u32 middle_index = (bdata->opp_count / 2);
944 
945 	if (svsb->phase == SVSB_PHASE_MON &&
946 	    svsb->volt_flags & SVSB_MON_VOLT_IGNORE)
947 		return;
948 
949 	vop74 = svs_readl_relaxed(svsp, VOP74);
950 	vop30 = svs_readl_relaxed(svsp, VOP30);
951 
952 	/* Target is to set svsb->volt[] by algorithm */
953 	if (turn_pt < middle_index) {
954 		if (bdata->type == SVSB_TYPE_HIGH) {
955 			/* volt[0] ~ volt[turn_pt - 1] */
956 			for (i = 0; i < turn_pt; i++) {
957 				b_sft = BITS8 * (shift_byte % REG_BYTES);
958 				vop = (shift_byte < REG_BYTES) ? &vop30 :
959 								 &vop74;
960 				svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
961 				shift_byte++;
962 			}
963 		} else if (bdata->type == SVSB_TYPE_LOW) {
964 			/* volt[turn_pt] + volt[j] ~ volt[opp_count - 1] */
965 			j = bdata->opp_count - 7;
966 			svsb->volt[turn_pt] = FIELD_GET(SVSB_VOPS_FLD_VOP0_4, vop30);
967 			shift_byte++;
968 			for (i = j; i < bdata->opp_count; i++) {
969 				b_sft = BITS8 * (shift_byte % REG_BYTES);
970 				vop = (shift_byte < REG_BYTES) ? &vop30 :
971 								 &vop74;
972 				svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
973 				shift_byte++;
974 			}
975 
976 			/* volt[turn_pt + 1] ~ volt[j - 1] by interpolate */
977 			for (i = turn_pt + 1; i < j; i++)
978 				svsb->volt[i] = interpolate(svsb->freq_pct[turn_pt],
979 							    svsb->freq_pct[j],
980 							    svsb->volt[turn_pt],
981 							    svsb->volt[j],
982 							    svsb->freq_pct[i]);
983 		}
984 	} else {
985 		if (bdata->type == SVSB_TYPE_HIGH) {
986 			/* volt[0] + volt[j] ~ volt[turn_pt - 1] */
987 			j = turn_pt - 7;
988 			svsb->volt[0] = FIELD_GET(SVSB_VOPS_FLD_VOP0_4, vop30);
989 			shift_byte++;
990 			for (i = j; i < turn_pt; i++) {
991 				b_sft = BITS8 * (shift_byte % REG_BYTES);
992 				vop = (shift_byte < REG_BYTES) ? &vop30 :
993 								 &vop74;
994 				svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
995 				shift_byte++;
996 			}
997 
998 			/* volt[1] ~ volt[j - 1] by interpolate */
999 			for (i = 1; i < j; i++)
1000 				svsb->volt[i] = interpolate(svsb->freq_pct[0],
1001 							    svsb->freq_pct[j],
1002 							    svsb->volt[0],
1003 							    svsb->volt[j],
1004 							    svsb->freq_pct[i]);
1005 		} else if (bdata->type == SVSB_TYPE_LOW) {
1006 			/* volt[turn_pt] ~ volt[opp_count - 1] */
1007 			for (i = turn_pt; i < bdata->opp_count; i++) {
1008 				b_sft = BITS8 * (shift_byte % REG_BYTES);
1009 				vop = (shift_byte < REG_BYTES) ? &vop30 :
1010 								 &vop74;
1011 				svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
1012 				shift_byte++;
1013 			}
1014 		}
1015 	}
1016 
1017 	if (bdata->type == SVSB_TYPE_HIGH) {
1018 		opp_start = 0;
1019 		opp_stop = svsb->turn_pt;
1020 	} else if (bdata->type == SVSB_TYPE_LOW) {
1021 		opp_start = svsb->turn_pt;
1022 		opp_stop = bdata->opp_count;
1023 	}
1024 
1025 	for (i = opp_start; i < opp_stop; i++)
1026 		if (svsb->volt_flags & SVSB_REMOVE_DVTFIXED_VOLT)
1027 			svsb->volt[i] -= svsb->dvt_fixed;
1028 
1029 	/* For voltage bin support */
1030 	if (svsb->opp_dfreq[0] > svsb->freq_base) {
1031 		svsb->volt[0] = svs_opp_volt_to_bank_volt(svsb->opp_dvolt[0],
1032 							  bdata->volt_step,
1033 							  bdata->volt_base);
1034 
1035 		/* Find voltage bin turn point */
1036 		for (i = 0; i < bdata->opp_count; i++) {
1037 			if (svsb->opp_dfreq[i] <= svsb->freq_base) {
1038 				svsb->vbin_turn_pt = i;
1039 				break;
1040 			}
1041 		}
1042 
1043 		/* Override svs bank voltages */
1044 		for (i = 1; i < svsb->vbin_turn_pt; i++)
1045 			svsb->volt[i] = interpolate(svsb->freq_pct[0],
1046 						    svsb->freq_pct[svsb->vbin_turn_pt],
1047 						    svsb->volt[0],
1048 						    svsb->volt[svsb->vbin_turn_pt],
1049 						    svsb->freq_pct[i]);
1050 	}
1051 }
1052 
1053 static void svs_set_bank_freq_pct_v3(struct svs_platform *svsp, struct svs_bank *svsb)
1054 {
1055 	const struct svs_bank_pdata *bdata = &svsb->pdata;
1056 	u32 i, j, *freq_pct, freq_pct74 = 0, freq_pct30 = 0;
1057 	u32 b_sft, shift_byte = 0, turn_pt;
1058 	u32 middle_index = (bdata->opp_count / 2);
1059 
1060 	for (i = 0; i < bdata->opp_count; i++) {
1061 		if (svsb->opp_dfreq[i] <= bdata->turn_freq_base) {
1062 			svsb->turn_pt = i;
1063 			break;
1064 		}
1065 	}
1066 
1067 	turn_pt = svsb->turn_pt;
1068 
1069 	/* Target is to fill out freq_pct74 / freq_pct30 by algorithm */
1070 	if (turn_pt < middle_index) {
1071 		if (bdata->type == SVSB_TYPE_HIGH) {
1072 			/*
1073 			 * If we don't handle this situation,
1074 			 * SVSB_TYPE_HIGH's FREQPCT74 / FREQPCT30 would keep "0"
1075 			 * and this leads SVSB_TYPE_LOW to work abnormally.
1076 			 */
1077 			if (turn_pt == 0)
1078 				freq_pct30 = svsb->freq_pct[0];
1079 
1080 			/* freq_pct[0] ~ freq_pct[turn_pt - 1] */
1081 			for (i = 0; i < turn_pt; i++) {
1082 				b_sft = BITS8 * (shift_byte % REG_BYTES);
1083 				freq_pct = (shift_byte < REG_BYTES) ?
1084 					   &freq_pct30 : &freq_pct74;
1085 				*freq_pct |= (svsb->freq_pct[i] << b_sft);
1086 				shift_byte++;
1087 			}
1088 		} else if (bdata->type == SVSB_TYPE_LOW) {
1089 			/*
1090 			 * freq_pct[turn_pt] +
1091 			 * freq_pct[opp_count - 7] ~ freq_pct[opp_count -1]
1092 			 */
1093 			freq_pct30 = svsb->freq_pct[turn_pt];
1094 			shift_byte++;
1095 			j = bdata->opp_count - 7;
1096 			for (i = j; i < bdata->opp_count; i++) {
1097 				b_sft = BITS8 * (shift_byte % REG_BYTES);
1098 				freq_pct = (shift_byte < REG_BYTES) ?
1099 					   &freq_pct30 : &freq_pct74;
1100 				*freq_pct |= (svsb->freq_pct[i] << b_sft);
1101 				shift_byte++;
1102 			}
1103 		}
1104 	} else {
1105 		if (bdata->type == SVSB_TYPE_HIGH) {
1106 			/*
1107 			 * freq_pct[0] +
1108 			 * freq_pct[turn_pt - 7] ~ freq_pct[turn_pt - 1]
1109 			 */
1110 			freq_pct30 = svsb->freq_pct[0];
1111 			shift_byte++;
1112 			j = turn_pt - 7;
1113 			for (i = j; i < turn_pt; i++) {
1114 				b_sft = BITS8 * (shift_byte % REG_BYTES);
1115 				freq_pct = (shift_byte < REG_BYTES) ?
1116 					   &freq_pct30 : &freq_pct74;
1117 				*freq_pct |= (svsb->freq_pct[i] << b_sft);
1118 				shift_byte++;
1119 			}
1120 		} else if (bdata->type == SVSB_TYPE_LOW) {
1121 			/* freq_pct[turn_pt] ~ freq_pct[opp_count - 1] */
1122 			for (i = turn_pt; i < bdata->opp_count; i++) {
1123 				b_sft = BITS8 * (shift_byte % REG_BYTES);
1124 				freq_pct = (shift_byte < REG_BYTES) ?
1125 					   &freq_pct30 : &freq_pct74;
1126 				*freq_pct |= (svsb->freq_pct[i] << b_sft);
1127 				shift_byte++;
1128 			}
1129 		}
1130 	}
1131 
1132 	svs_writel_relaxed(svsp, freq_pct74, FREQPCT74);
1133 	svs_writel_relaxed(svsp, freq_pct30, FREQPCT30);
1134 }
1135 
1136 static void svs_get_bank_volts_v2(struct svs_platform *svsp, struct svs_bank *svsb)
1137 {
1138 	const struct svs_bank_pdata *bdata = &svsb->pdata;
1139 	u32 temp, i;
1140 
1141 	temp = svs_readl_relaxed(svsp, VOP74);
1142 	svsb->volt[14] = FIELD_GET(SVSB_VOPS_FLD_VOP3_7, temp);
1143 	svsb->volt[12] = FIELD_GET(SVSB_VOPS_FLD_VOP2_6, temp);
1144 	svsb->volt[10] = FIELD_GET(SVSB_VOPS_FLD_VOP1_5, temp);
1145 	svsb->volt[8] = FIELD_GET(SVSB_VOPS_FLD_VOP0_4, temp);
1146 
1147 	temp = svs_readl_relaxed(svsp, VOP30);
1148 	svsb->volt[6] = FIELD_GET(SVSB_VOPS_FLD_VOP3_7, temp);
1149 	svsb->volt[4] = FIELD_GET(SVSB_VOPS_FLD_VOP2_6, temp);
1150 	svsb->volt[2] = FIELD_GET(SVSB_VOPS_FLD_VOP1_5, temp);
1151 	svsb->volt[0] = FIELD_GET(SVSB_VOPS_FLD_VOP0_4, temp);
1152 
1153 	for (i = 0; i <= 12; i += 2)
1154 		svsb->volt[i + 1] = interpolate(svsb->freq_pct[i],
1155 						svsb->freq_pct[i + 2],
1156 						svsb->volt[i],
1157 						svsb->volt[i + 2],
1158 						svsb->freq_pct[i + 1]);
1159 
1160 	svsb->volt[15] = interpolate(svsb->freq_pct[12],
1161 				     svsb->freq_pct[14],
1162 				     svsb->volt[12],
1163 				     svsb->volt[14],
1164 				     svsb->freq_pct[15]);
1165 
1166 	for (i = 0; i < bdata->opp_count; i++)
1167 		svsb->volt[i] += svsb->volt_od;
1168 
1169 	/* For voltage bin support */
1170 	if (svsb->opp_dfreq[0] > svsb->freq_base) {
1171 		svsb->volt[0] = svs_opp_volt_to_bank_volt(svsb->opp_dvolt[0],
1172 							  bdata->volt_step,
1173 							  bdata->volt_base);
1174 
1175 		/* Find voltage bin turn point */
1176 		for (i = 0; i < bdata->opp_count; i++) {
1177 			if (svsb->opp_dfreq[i] <= svsb->freq_base) {
1178 				svsb->vbin_turn_pt = i;
1179 				break;
1180 			}
1181 		}
1182 
1183 		/* Override svs bank voltages */
1184 		for (i = 1; i < svsb->vbin_turn_pt; i++)
1185 			svsb->volt[i] = interpolate(svsb->freq_pct[0],
1186 						    svsb->freq_pct[svsb->vbin_turn_pt],
1187 						    svsb->volt[0],
1188 						    svsb->volt[svsb->vbin_turn_pt],
1189 						    svsb->freq_pct[i]);
1190 	}
1191 }
1192 
1193 static void svs_set_bank_freq_pct_v2(struct svs_platform *svsp, struct svs_bank *svsb)
1194 {
1195 	u32 freqpct74_val, freqpct30_val;
1196 
1197 	freqpct74_val = FIELD_PREP(SVSB_FREQPCTS_FLD_PCT0_4, svsb->freq_pct[8]) |
1198 			FIELD_PREP(SVSB_FREQPCTS_FLD_PCT1_5, svsb->freq_pct[10]) |
1199 			FIELD_PREP(SVSB_FREQPCTS_FLD_PCT2_6, svsb->freq_pct[12]) |
1200 			FIELD_PREP(SVSB_FREQPCTS_FLD_PCT3_7, svsb->freq_pct[14]);
1201 
1202 	freqpct30_val = FIELD_PREP(SVSB_FREQPCTS_FLD_PCT0_4, svsb->freq_pct[0]) |
1203 			FIELD_PREP(SVSB_FREQPCTS_FLD_PCT1_5, svsb->freq_pct[2]) |
1204 			FIELD_PREP(SVSB_FREQPCTS_FLD_PCT2_6, svsb->freq_pct[4]) |
1205 			FIELD_PREP(SVSB_FREQPCTS_FLD_PCT3_7, svsb->freq_pct[6]);
1206 
1207 	svs_writel_relaxed(svsp, freqpct74_val, FREQPCT74);
1208 	svs_writel_relaxed(svsp, freqpct30_val, FREQPCT30);
1209 }
1210 
1211 static void svs_set_bank_phase(struct svs_platform *svsp,
1212 			       unsigned int bank_idx,
1213 			       enum svsb_phase target_phase)
1214 {
1215 	struct svs_bank *svsb = &svsp->banks[bank_idx];
1216 	const struct svs_bank_pdata *bdata = &svsb->pdata;
1217 	u32 des_char, temp_char, det_char, limit_vals, init2vals, ts_calcs;
1218 
1219 	svs_switch_bank(svsp, svsb);
1220 
1221 	des_char = FIELD_PREP(SVSB_DESCHAR_FLD_BDES, svsb->bdes) |
1222 		   FIELD_PREP(SVSB_DESCHAR_FLD_MDES, svsb->mdes);
1223 	svs_writel_relaxed(svsp, des_char, DESCHAR);
1224 
1225 	temp_char = FIELD_PREP(SVSB_TEMPCHAR_FLD_VCO, bdata->vco) |
1226 		    FIELD_PREP(SVSB_TEMPCHAR_FLD_MTDES, svsb->mtdes) |
1227 		    FIELD_PREP(SVSB_TEMPCHAR_FLD_DVT_FIXED, svsb->dvt_fixed);
1228 	svs_writel_relaxed(svsp, temp_char, TEMPCHAR);
1229 
1230 	det_char = FIELD_PREP(SVSB_DETCHAR_FLD_DCBDET, svsb->dcbdet) |
1231 		   FIELD_PREP(SVSB_DETCHAR_FLD_DCMDET, svsb->dcmdet);
1232 	svs_writel_relaxed(svsp, det_char, DETCHAR);
1233 
1234 	svs_writel_relaxed(svsp, bdata->dc_config, DCCONFIG);
1235 	svs_writel_relaxed(svsp, bdata->age_config, AGECONFIG);
1236 	svs_writel_relaxed(svsp, SVSB_RUNCONFIG_DEFAULT, RUNCONFIG);
1237 
1238 	bdata->set_freq_pct(svsp, svsb);
1239 
1240 	limit_vals = FIELD_PREP(SVSB_LIMITVALS_FLD_DTLO, SVSB_VAL_DTLO) |
1241 		     FIELD_PREP(SVSB_LIMITVALS_FLD_DTHI, SVSB_VAL_DTHI) |
1242 		     FIELD_PREP(SVSB_LIMITVALS_FLD_VMIN, svsb->vmin) |
1243 		     FIELD_PREP(SVSB_LIMITVALS_FLD_VMAX, svsb->vmax);
1244 	svs_writel_relaxed(svsp, limit_vals, LIMITVALS);
1245 
1246 	svs_writel_relaxed(svsp, SVSB_DET_WINDOW, DETWINDOW);
1247 	svs_writel_relaxed(svsp, SVSB_DET_MAX, CONFIG);
1248 	svs_writel_relaxed(svsp, bdata->chk_shift, CHKSHIFT);
1249 	svs_writel_relaxed(svsp, bdata->ctl0, CTL0);
1250 	svs_writel_relaxed(svsp, SVSB_INTSTS_VAL_CLEAN, INTSTS);
1251 
1252 	switch (target_phase) {
1253 	case SVSB_PHASE_INIT01:
1254 		svs_writel_relaxed(svsp, bdata->vboot, VBOOT);
1255 		svs_writel_relaxed(svsp, SVSB_INTEN_INIT0x, INTEN);
1256 		svs_writel_relaxed(svsp, SVSB_PTPEN_INIT01, SVSEN);
1257 		break;
1258 	case SVSB_PHASE_INIT02:
1259 		init2vals = FIELD_PREP(SVSB_INIT2VALS_FLD_AGEVOFFSETIN, svsb->age_voffset_in) |
1260 			    FIELD_PREP(SVSB_INIT2VALS_FLD_DCVOFFSETIN, svsb->dc_voffset_in);
1261 		svs_writel_relaxed(svsp, SVSB_INTEN_INIT0x, INTEN);
1262 		svs_writel_relaxed(svsp, init2vals, INIT2VALS);
1263 		svs_writel_relaxed(svsp, SVSB_PTPEN_INIT02, SVSEN);
1264 		break;
1265 	case SVSB_PHASE_MON:
1266 		ts_calcs = FIELD_PREP(SVSB_TSCALCS_FLD_BTS, svsb->bts) |
1267 			   FIELD_PREP(SVSB_TSCALCS_FLD_MTS, svsb->mts);
1268 		svs_writel_relaxed(svsp, ts_calcs, TSCALCS);
1269 		svs_writel_relaxed(svsp, SVSB_INTEN_MONVOPEN, INTEN);
1270 		svs_writel_relaxed(svsp, SVSB_PTPEN_MON, SVSEN);
1271 		break;
1272 	default:
1273 		dev_err(svsb->dev, "requested unknown target phase: %u\n",
1274 			target_phase);
1275 		break;
1276 	}
1277 }
1278 
1279 static inline void svs_save_bank_register_data(struct svs_platform *svsp,
1280 					       unsigned short bank_idx,
1281 					       enum svsb_phase phase)
1282 {
1283 	struct svs_bank *svsb = &svsp->banks[bank_idx];
1284 	enum svs_reg_index rg_i;
1285 
1286 	for (rg_i = DESCHAR; rg_i < SVS_REG_MAX; rg_i++)
1287 		svsb->reg_data[phase][rg_i] = svs_readl_relaxed(svsp, rg_i);
1288 }
1289 
1290 static inline void svs_error_isr_handler(struct svs_platform *svsp,
1291 					 unsigned short bank_idx)
1292 {
1293 	struct svs_bank *svsb = &svsp->banks[bank_idx];
1294 
1295 	dev_err(svsb->dev, "%s: CORESEL = 0x%08x\n",
1296 		__func__, svs_readl_relaxed(svsp, CORESEL));
1297 	dev_err(svsb->dev, "SVSEN = 0x%08x, INTSTS = 0x%08x\n",
1298 		svs_readl_relaxed(svsp, SVSEN),
1299 		svs_readl_relaxed(svsp, INTSTS));
1300 	dev_err(svsb->dev, "SMSTATE0 = 0x%08x, SMSTATE1 = 0x%08x\n",
1301 		svs_readl_relaxed(svsp, SMSTATE0),
1302 		svs_readl_relaxed(svsp, SMSTATE1));
1303 	dev_err(svsb->dev, "TEMP = 0x%08x\n", svs_readl_relaxed(svsp, TEMP));
1304 
1305 	svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_ERROR);
1306 
1307 	svsb->phase = SVSB_PHASE_ERROR;
1308 	svs_writel_relaxed(svsp, SVSB_PTPEN_OFF, SVSEN);
1309 	svs_writel_relaxed(svsp, SVSB_INTSTS_VAL_CLEAN, INTSTS);
1310 }
1311 
1312 static inline void svs_init01_isr_handler(struct svs_platform *svsp,
1313 					  unsigned short bank_idx)
1314 {
1315 	struct svs_bank *svsb = &svsp->banks[bank_idx];
1316 	u32 val;
1317 
1318 	dev_info(svsb->dev, "%s: VDN74~30:0x%08x~0x%08x, DC:0x%08x\n",
1319 		 __func__, svs_readl_relaxed(svsp, VDESIGN74),
1320 		 svs_readl_relaxed(svsp, VDESIGN30),
1321 		 svs_readl_relaxed(svsp, DCVALUES));
1322 
1323 	svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_INIT01);
1324 
1325 	svsb->phase = SVSB_PHASE_INIT01;
1326 	val = ~(svs_readl_relaxed(svsp, DCVALUES) & GENMASK(15, 0)) + 1;
1327 	svsb->dc_voffset_in = val & GENMASK(15, 0);
1328 	if (svsb->volt_flags & SVSB_INIT01_VOLT_IGNORE ||
1329 	    (svsb->dc_voffset_in & SVSB_DC_SIGNED_BIT &&
1330 	     svsb->volt_flags & SVSB_INIT01_VOLT_INC_ONLY))
1331 		svsb->dc_voffset_in = 0;
1332 
1333 	svsb->age_voffset_in = svs_readl_relaxed(svsp, AGEVALUES) &
1334 			       GENMASK(15, 0);
1335 
1336 	svs_writel_relaxed(svsp, SVSB_PTPEN_OFF, SVSEN);
1337 	svs_writel_relaxed(svsp, SVSB_INTSTS_F0_COMPLETE, INTSTS);
1338 	svsb->core_sel &= ~SVSB_DET_CLK_EN;
1339 }
1340 
1341 static inline void svs_init02_isr_handler(struct svs_platform *svsp,
1342 					  unsigned short bank_idx)
1343 {
1344 	struct svs_bank *svsb = &svsp->banks[bank_idx];
1345 	const struct svs_bank_pdata *bdata = &svsb->pdata;
1346 
1347 	dev_info(svsb->dev, "%s: VOP74~30:0x%08x~0x%08x, DC:0x%08x\n",
1348 		 __func__, svs_readl_relaxed(svsp, VOP74),
1349 		 svs_readl_relaxed(svsp, VOP30),
1350 		 svs_readl_relaxed(svsp, DCVALUES));
1351 
1352 	svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_INIT02);
1353 
1354 	svsb->phase = SVSB_PHASE_INIT02;
1355 	bdata->get_volts(svsp, svsb);
1356 
1357 	svs_writel_relaxed(svsp, SVSB_PTPEN_OFF, SVSEN);
1358 	svs_writel_relaxed(svsp, SVSB_INTSTS_F0_COMPLETE, INTSTS);
1359 }
1360 
1361 static inline void svs_mon_mode_isr_handler(struct svs_platform *svsp,
1362 					    unsigned short bank_idx)
1363 {
1364 	struct svs_bank *svsb = &svsp->banks[bank_idx];
1365 	const struct svs_bank_pdata *bdata = &svsb->pdata;
1366 
1367 	svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_MON);
1368 
1369 	svsb->phase = SVSB_PHASE_MON;
1370 	bdata->get_volts(svsp, svsb);
1371 
1372 	svsb->temp = svs_readl_relaxed(svsp, TEMP) & GENMASK(7, 0);
1373 	svs_writel_relaxed(svsp, SVSB_INTSTS_FLD_MONVOP, INTSTS);
1374 }
1375 
1376 static irqreturn_t svs_isr(int irq, void *data)
1377 {
1378 	struct svs_platform *svsp = data;
1379 	const struct svs_bank_pdata *bdata;
1380 	struct svs_bank *svsb = NULL;
1381 	unsigned long flags;
1382 	u32 idx, int_sts, svs_en;
1383 
1384 	for (idx = 0; idx < svsp->bank_max; idx++) {
1385 		svsb = &svsp->banks[idx];
1386 		bdata = &svsb->pdata;
1387 		WARN(!svsb, "%s: svsb(%s) is null", __func__, svsb->name);
1388 
1389 		spin_lock_irqsave(&svs_lock, flags);
1390 
1391 		/* Find out which svs bank fires interrupt */
1392 		if (bdata->int_st & svs_readl_relaxed(svsp, INTST)) {
1393 			spin_unlock_irqrestore(&svs_lock, flags);
1394 			continue;
1395 		}
1396 
1397 		svs_switch_bank(svsp, svsb);
1398 		int_sts = svs_readl_relaxed(svsp, INTSTS);
1399 		svs_en = svs_readl_relaxed(svsp, SVSEN);
1400 
1401 		if (int_sts == SVSB_INTSTS_F0_COMPLETE &&
1402 		    svs_en == SVSB_PTPEN_INIT01)
1403 			svs_init01_isr_handler(svsp, idx);
1404 		else if (int_sts == SVSB_INTSTS_F0_COMPLETE &&
1405 			 svs_en == SVSB_PTPEN_INIT02)
1406 			svs_init02_isr_handler(svsp, idx);
1407 		else if (int_sts & SVSB_INTSTS_FLD_MONVOP)
1408 			svs_mon_mode_isr_handler(svsp, idx);
1409 		else
1410 			svs_error_isr_handler(svsp, idx);
1411 
1412 		spin_unlock_irqrestore(&svs_lock, flags);
1413 		break;
1414 	}
1415 
1416 	svs_adjust_pm_opp_volts(svsb);
1417 
1418 	if (svsb->phase == SVSB_PHASE_INIT01 ||
1419 	    svsb->phase == SVSB_PHASE_INIT02)
1420 		complete(&svsb->init_completion);
1421 
1422 	return IRQ_HANDLED;
1423 }
1424 
1425 static bool svs_mode_available(struct svs_platform *svsp, u8 mode)
1426 {
1427 	int i;
1428 
1429 	for (i = 0; i < svsp->bank_max; i++)
1430 		if (svsp->banks[i].mode_support & mode)
1431 			return true;
1432 	return false;
1433 }
1434 
1435 static int svs_init01(struct svs_platform *svsp)
1436 {
1437 	const struct svs_bank_pdata *bdata;
1438 	struct svs_bank *svsb;
1439 	unsigned long flags, time_left;
1440 	bool search_done;
1441 	int ret = 0, r;
1442 	u32 opp_freq, opp_vboot, buck_volt, idx, i;
1443 
1444 	if (!svs_mode_available(svsp, SVSB_MODE_INIT01))
1445 		return 0;
1446 
1447 	/* Keep CPUs' core power on for svs_init01 initialization */
1448 	cpuidle_pause_and_lock();
1449 
1450 	 /* Svs bank init01 preparation - power enable */
1451 	for (idx = 0; idx < svsp->bank_max; idx++) {
1452 		svsb = &svsp->banks[idx];
1453 		bdata = &svsb->pdata;
1454 
1455 		if (!(svsb->mode_support & SVSB_MODE_INIT01))
1456 			continue;
1457 
1458 		ret = regulator_enable(svsb->buck);
1459 		if (ret) {
1460 			dev_err(svsb->dev, "%s enable fail: %d\n",
1461 				bdata->buck_name, ret);
1462 			goto svs_init01_resume_cpuidle;
1463 		}
1464 
1465 		/* Some buck doesn't support mode change. Show fail msg only */
1466 		ret = regulator_set_mode(svsb->buck, REGULATOR_MODE_FAST);
1467 		if (ret)
1468 			dev_notice(svsb->dev, "set fast mode fail: %d\n", ret);
1469 
1470 		if (svsb->volt_flags & SVSB_INIT01_PD_REQ) {
1471 			if (!pm_runtime_enabled(svsb->opp_dev)) {
1472 				pm_runtime_enable(svsb->opp_dev);
1473 				svsb->pm_runtime_enabled_count++;
1474 			}
1475 
1476 			ret = pm_runtime_resume_and_get(svsb->opp_dev);
1477 			if (ret < 0) {
1478 				dev_err(svsb->dev, "mtcmos on fail: %d\n", ret);
1479 				goto svs_init01_resume_cpuidle;
1480 			}
1481 		}
1482 	}
1483 
1484 	/*
1485 	 * Svs bank init01 preparation - vboot voltage adjustment
1486 	 * Sometimes two svs banks use the same buck. Therefore,
1487 	 * we have to set each svs bank to target voltage(vboot) first.
1488 	 */
1489 	for (idx = 0; idx < svsp->bank_max; idx++) {
1490 		svsb = &svsp->banks[idx];
1491 		bdata = &svsb->pdata;
1492 
1493 		if (!(svsb->mode_support & SVSB_MODE_INIT01))
1494 			continue;
1495 
1496 		/*
1497 		 * Find the fastest freq that can be run at vboot and
1498 		 * fix to that freq until svs_init01 is done.
1499 		 */
1500 		search_done = false;
1501 		opp_vboot = svs_bank_volt_to_opp_volt(bdata->vboot,
1502 						      bdata->volt_step,
1503 						      bdata->volt_base);
1504 
1505 		for (i = 0; i < bdata->opp_count; i++) {
1506 			opp_freq = svsb->opp_dfreq[i];
1507 			if (!search_done && svsb->opp_dvolt[i] <= opp_vboot) {
1508 				ret = dev_pm_opp_adjust_voltage(svsb->opp_dev,
1509 								opp_freq,
1510 								opp_vboot,
1511 								opp_vboot,
1512 								opp_vboot);
1513 				if (ret) {
1514 					dev_err(svsb->dev,
1515 						"set opp %uuV vboot fail: %d\n",
1516 						opp_vboot, ret);
1517 					goto svs_init01_finish;
1518 				}
1519 
1520 				search_done = true;
1521 			} else {
1522 				ret = dev_pm_opp_disable(svsb->opp_dev,
1523 							 svsb->opp_dfreq[i]);
1524 				if (ret) {
1525 					dev_err(svsb->dev,
1526 						"opp %uHz disable fail: %d\n",
1527 						svsb->opp_dfreq[i], ret);
1528 					goto svs_init01_finish;
1529 				}
1530 			}
1531 		}
1532 	}
1533 
1534 	/* Svs bank init01 begins */
1535 	for (idx = 0; idx < svsp->bank_max; idx++) {
1536 		svsb = &svsp->banks[idx];
1537 		bdata = &svsb->pdata;
1538 
1539 		if (!(svsb->mode_support & SVSB_MODE_INIT01))
1540 			continue;
1541 
1542 		opp_vboot = svs_bank_volt_to_opp_volt(bdata->vboot,
1543 						      bdata->volt_step,
1544 						      bdata->volt_base);
1545 
1546 		buck_volt = regulator_get_voltage(svsb->buck);
1547 		if (buck_volt != opp_vboot) {
1548 			dev_err(svsb->dev,
1549 				"buck voltage: %uuV, expected vboot: %uuV\n",
1550 				buck_volt, opp_vboot);
1551 			ret = -EPERM;
1552 			goto svs_init01_finish;
1553 		}
1554 
1555 		spin_lock_irqsave(&svs_lock, flags);
1556 		svs_set_bank_phase(svsp, idx, SVSB_PHASE_INIT01);
1557 		spin_unlock_irqrestore(&svs_lock, flags);
1558 
1559 		time_left = wait_for_completion_timeout(&svsb->init_completion,
1560 							msecs_to_jiffies(5000));
1561 		if (!time_left) {
1562 			dev_err(svsb->dev, "init01 completion timeout\n");
1563 			ret = -EBUSY;
1564 			goto svs_init01_finish;
1565 		}
1566 	}
1567 
1568 svs_init01_finish:
1569 	for (idx = 0; idx < svsp->bank_max; idx++) {
1570 		svsb = &svsp->banks[idx];
1571 		bdata = &svsb->pdata;
1572 
1573 		if (!(svsb->mode_support & SVSB_MODE_INIT01))
1574 			continue;
1575 
1576 		for (i = 0; i < bdata->opp_count; i++) {
1577 			r = dev_pm_opp_enable(svsb->opp_dev,
1578 					      svsb->opp_dfreq[i]);
1579 			if (r)
1580 				dev_err(svsb->dev, "opp %uHz enable fail: %d\n",
1581 					svsb->opp_dfreq[i], r);
1582 		}
1583 
1584 		if (svsb->volt_flags & SVSB_INIT01_PD_REQ) {
1585 			r = pm_runtime_put_sync(svsb->opp_dev);
1586 			if (r)
1587 				dev_err(svsb->dev, "mtcmos off fail: %d\n", r);
1588 
1589 			if (svsb->pm_runtime_enabled_count > 0) {
1590 				pm_runtime_disable(svsb->opp_dev);
1591 				svsb->pm_runtime_enabled_count--;
1592 			}
1593 		}
1594 
1595 		r = regulator_set_mode(svsb->buck, REGULATOR_MODE_NORMAL);
1596 		if (r)
1597 			dev_notice(svsb->dev, "set normal mode fail: %d\n", r);
1598 
1599 		r = regulator_disable(svsb->buck);
1600 		if (r)
1601 			dev_err(svsb->dev, "%s disable fail: %d\n",
1602 				bdata->buck_name, r);
1603 	}
1604 
1605 svs_init01_resume_cpuidle:
1606 	cpuidle_resume_and_unlock();
1607 
1608 	return ret;
1609 }
1610 
1611 static int svs_init02(struct svs_platform *svsp)
1612 {
1613 	const struct svs_bank_pdata *bdata;
1614 	struct svs_bank *svsb;
1615 	unsigned long flags, time_left;
1616 	int ret;
1617 	u32 idx;
1618 
1619 	if (!svs_mode_available(svsp, SVSB_MODE_INIT02))
1620 		return 0;
1621 
1622 	for (idx = 0; idx < svsp->bank_max; idx++) {
1623 		svsb = &svsp->banks[idx];
1624 
1625 		if (!(svsb->mode_support & SVSB_MODE_INIT02))
1626 			continue;
1627 
1628 		reinit_completion(&svsb->init_completion);
1629 		spin_lock_irqsave(&svs_lock, flags);
1630 		svs_set_bank_phase(svsp, idx, SVSB_PHASE_INIT02);
1631 		spin_unlock_irqrestore(&svs_lock, flags);
1632 
1633 		time_left = wait_for_completion_timeout(&svsb->init_completion,
1634 							msecs_to_jiffies(5000));
1635 		if (!time_left) {
1636 			dev_err(svsb->dev, "init02 completion timeout\n");
1637 			ret = -EBUSY;
1638 			goto out_of_init02;
1639 		}
1640 	}
1641 
1642 	/*
1643 	 * 2-line high/low bank update its corresponding opp voltages only.
1644 	 * Therefore, we sync voltages from opp for high/low bank voltages
1645 	 * consistency.
1646 	 */
1647 	for (idx = 0; idx < svsp->bank_max; idx++) {
1648 		svsb = &svsp->banks[idx];
1649 		bdata = &svsb->pdata;
1650 
1651 		if (!(svsb->mode_support & SVSB_MODE_INIT02))
1652 			continue;
1653 
1654 		if (bdata->type == SVSB_TYPE_HIGH || bdata->type == SVSB_TYPE_LOW) {
1655 			if (svs_sync_bank_volts_from_opp(svsb)) {
1656 				dev_err(svsb->dev, "sync volt fail\n");
1657 				ret = -EPERM;
1658 				goto out_of_init02;
1659 			}
1660 		}
1661 	}
1662 
1663 	return 0;
1664 
1665 out_of_init02:
1666 	for (idx = 0; idx < svsp->bank_max; idx++) {
1667 		svsb = &svsp->banks[idx];
1668 		svs_bank_disable_and_restore_default_volts(svsp, svsb);
1669 	}
1670 
1671 	return ret;
1672 }
1673 
1674 static void svs_mon_mode(struct svs_platform *svsp)
1675 {
1676 	struct svs_bank *svsb;
1677 	unsigned long flags;
1678 	u32 idx;
1679 
1680 	for (idx = 0; idx < svsp->bank_max; idx++) {
1681 		svsb = &svsp->banks[idx];
1682 
1683 		if (!(svsb->mode_support & SVSB_MODE_MON))
1684 			continue;
1685 
1686 		spin_lock_irqsave(&svs_lock, flags);
1687 		svs_set_bank_phase(svsp, idx, SVSB_PHASE_MON);
1688 		spin_unlock_irqrestore(&svs_lock, flags);
1689 	}
1690 }
1691 
1692 static int svs_start(struct svs_platform *svsp)
1693 {
1694 	int ret;
1695 
1696 	ret = svs_init01(svsp);
1697 	if (ret)
1698 		return ret;
1699 
1700 	ret = svs_init02(svsp);
1701 	if (ret)
1702 		return ret;
1703 
1704 	svs_mon_mode(svsp);
1705 
1706 	return 0;
1707 }
1708 
1709 static int svs_suspend(struct device *dev)
1710 {
1711 	struct svs_platform *svsp = dev_get_drvdata(dev);
1712 	int ret;
1713 	u32 idx;
1714 
1715 	for (idx = 0; idx < svsp->bank_max; idx++) {
1716 		struct svs_bank *svsb = &svsp->banks[idx];
1717 
1718 		svs_bank_disable_and_restore_default_volts(svsp, svsb);
1719 	}
1720 
1721 	ret = reset_control_assert(svsp->rst);
1722 	if (ret) {
1723 		dev_err(svsp->dev, "cannot assert reset %d\n", ret);
1724 		return ret;
1725 	}
1726 
1727 	clk_disable_unprepare(svsp->main_clk);
1728 
1729 	return 0;
1730 }
1731 
1732 static int svs_resume(struct device *dev)
1733 {
1734 	struct svs_platform *svsp = dev_get_drvdata(dev);
1735 	int ret;
1736 
1737 	ret = clk_prepare_enable(svsp->main_clk);
1738 	if (ret) {
1739 		dev_err(svsp->dev, "cannot enable main_clk, disable svs\n");
1740 		return ret;
1741 	}
1742 
1743 	ret = reset_control_deassert(svsp->rst);
1744 	if (ret) {
1745 		dev_err(svsp->dev, "cannot deassert reset %d\n", ret);
1746 		goto out_of_resume;
1747 	}
1748 
1749 	ret = svs_init02(svsp);
1750 	if (ret)
1751 		goto svs_resume_reset_assert;
1752 
1753 	svs_mon_mode(svsp);
1754 
1755 	return 0;
1756 
1757 svs_resume_reset_assert:
1758 	dev_err(svsp->dev, "assert reset: %d\n",
1759 		reset_control_assert(svsp->rst));
1760 
1761 out_of_resume:
1762 	clk_disable_unprepare(svsp->main_clk);
1763 	return ret;
1764 }
1765 
1766 static int svs_bank_resource_setup(struct svs_platform *svsp)
1767 {
1768 	const struct svs_bank_pdata *bdata;
1769 	struct svs_bank *svsb;
1770 	struct dev_pm_opp *opp;
1771 	char tz_name_buf[20];
1772 	unsigned long freq;
1773 	int count, ret;
1774 	u32 idx, i;
1775 
1776 	dev_set_drvdata(svsp->dev, svsp);
1777 
1778 	for (idx = 0; idx < svsp->bank_max; idx++) {
1779 		svsb = &svsp->banks[idx];
1780 		bdata = &svsb->pdata;
1781 
1782 		if (bdata->sw_id >= SVSB_SWID_MAX || bdata->type >= SVSB_TYPE_MAX) {
1783 			dev_err(svsb->dev, "unknown bank sw_id or type\n");
1784 			return -EINVAL;
1785 		}
1786 
1787 		svsb->dev = devm_kzalloc(svsp->dev, sizeof(*svsb->dev), GFP_KERNEL);
1788 		if (!svsb->dev)
1789 			return -ENOMEM;
1790 
1791 		svsb->name = devm_kasprintf(svsp->dev, GFP_KERNEL, "%s%s",
1792 					    svs_swid_names[bdata->sw_id],
1793 					    svs_type_names[bdata->type]);
1794 		if (!svsb->name)
1795 			return -ENOMEM;
1796 
1797 		ret = dev_set_name(svsb->dev, "%s", svsb->name);
1798 		if (ret)
1799 			return ret;
1800 
1801 		dev_set_drvdata(svsb->dev, svsp);
1802 
1803 		ret = devm_pm_opp_of_add_table(svsb->opp_dev);
1804 		if (ret) {
1805 			dev_err(svsb->dev, "add opp table fail: %d\n", ret);
1806 			return ret;
1807 		}
1808 
1809 		mutex_init(&svsb->lock);
1810 		init_completion(&svsb->init_completion);
1811 
1812 		if (svsb->mode_support & SVSB_MODE_INIT01) {
1813 			svsb->buck = devm_regulator_get_optional(svsb->opp_dev,
1814 								 bdata->buck_name);
1815 			if (IS_ERR(svsb->buck)) {
1816 				dev_err(svsb->dev, "cannot get \"%s-supply\"\n",
1817 					bdata->buck_name);
1818 				return PTR_ERR(svsb->buck);
1819 			}
1820 		}
1821 
1822 		if (!IS_ERR_OR_NULL(bdata->tzone_name)) {
1823 			snprintf(tz_name_buf, ARRAY_SIZE(tz_name_buf),
1824 				 "%s-thermal", bdata->tzone_name);
1825 			svsb->tzd = thermal_zone_get_zone_by_name(tz_name_buf);
1826 			if (IS_ERR(svsb->tzd)) {
1827 				dev_err(svsb->dev, "cannot get \"%s\" thermal zone\n",
1828 					tz_name_buf);
1829 				return PTR_ERR(svsb->tzd);
1830 			}
1831 		}
1832 
1833 		count = dev_pm_opp_get_opp_count(svsb->opp_dev);
1834 		if (bdata->opp_count != count) {
1835 			dev_err(svsb->dev,
1836 				"opp_count not \"%u\" but get \"%d\"?\n",
1837 				bdata->opp_count, count);
1838 			return count;
1839 		}
1840 
1841 		for (i = 0, freq = ULONG_MAX; i < bdata->opp_count; i++, freq--) {
1842 			opp = dev_pm_opp_find_freq_floor(svsb->opp_dev, &freq);
1843 			if (IS_ERR(opp)) {
1844 				dev_err(svsb->dev, "cannot find freq = %ld\n",
1845 					PTR_ERR(opp));
1846 				return PTR_ERR(opp);
1847 			}
1848 
1849 			svsb->opp_dfreq[i] = freq;
1850 			svsb->opp_dvolt[i] = dev_pm_opp_get_voltage(opp);
1851 			svsb->freq_pct[i] = percent(svsb->opp_dfreq[i],
1852 						    svsb->freq_base);
1853 			dev_pm_opp_put(opp);
1854 		}
1855 	}
1856 
1857 	return 0;
1858 }
1859 
1860 static int svs_get_efuse_data(struct svs_platform *svsp,
1861 			      const char *nvmem_cell_name,
1862 			      u32 **svsp_efuse, size_t *svsp_efuse_max)
1863 {
1864 	struct nvmem_cell *cell;
1865 
1866 	cell = nvmem_cell_get(svsp->dev, nvmem_cell_name);
1867 	if (IS_ERR(cell)) {
1868 		dev_err(svsp->dev, "no \"%s\"? %ld\n",
1869 			nvmem_cell_name, PTR_ERR(cell));
1870 		return PTR_ERR(cell);
1871 	}
1872 
1873 	*svsp_efuse = nvmem_cell_read(cell, svsp_efuse_max);
1874 	if (IS_ERR(*svsp_efuse)) {
1875 		nvmem_cell_put(cell);
1876 		return PTR_ERR(*svsp_efuse);
1877 	}
1878 
1879 	*svsp_efuse_max /= sizeof(u32);
1880 	nvmem_cell_put(cell);
1881 
1882 	return 0;
1883 }
1884 
1885 static u32 svs_get_fuse_val(u32 *fuse_array, const struct svs_fusemap *fmap, u8 nbits)
1886 {
1887 	u32 val;
1888 
1889 	if (fmap->index < 0)
1890 		return FUSE_DATA_NOT_VALID;
1891 
1892 	val = fuse_array[fmap->index] >> fmap->ofst;
1893 	val &= GENMASK(nbits - 1, 0);
1894 
1895 	return val;
1896 }
1897 
1898 static bool svs_is_available(struct svs_platform *svsp)
1899 {
1900 	int i, num_populated = 0;
1901 
1902 	/* If at least two fuse arrays are populated, SVS is calibrated */
1903 	for (i = 0; i < svsp->efuse_max; i++) {
1904 		if (svsp->efuse[i])
1905 			num_populated++;
1906 
1907 		if (num_populated > 1)
1908 			return true;
1909 	}
1910 
1911 	return false;
1912 }
1913 
1914 static bool svs_common_parse_efuse(struct svs_platform *svsp,
1915 				   const struct svs_platform_data *pdata)
1916 {
1917 	const struct svs_fusemap *gfmap = pdata->glb_fuse_map;
1918 	struct svs_fusemap tfm = { 0, 24 };
1919 	u32 golden_temp, val;
1920 	u8 ft_pgm, vmin;
1921 	int i;
1922 
1923 	if (!svs_is_available(svsp))
1924 		return false;
1925 
1926 	/* Get golden temperature from SVS-Thermal calibration */
1927 	val = svs_get_fuse_val(svsp->tefuse, &tfm, 8);
1928 
1929 	/* If golden temp is not programmed, use the default of 50 */
1930 	golden_temp = val ? val : 50;
1931 
1932 	/* Parse fused SVS calibration */
1933 	ft_pgm = svs_get_fuse_val(svsp->efuse, &gfmap[GLB_FT_PGM], 8);
1934 	vmin = svs_get_fuse_val(svsp->efuse, &gfmap[GLB_VMIN], 2);
1935 
1936 	for (i = 0; i < svsp->bank_max; i++) {
1937 		struct svs_bank *svsb = &svsp->banks[i];
1938 		const struct svs_bank_pdata *bdata = &svsb->pdata;
1939 		const struct svs_fusemap *dfmap = bdata->dev_fuse_map;
1940 
1941 		if (vmin == 1)
1942 			svsb->vmin = 0x1e;
1943 
1944 		if (ft_pgm == 0)
1945 			svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
1946 
1947 		svsb->mtdes = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_MTDES], 8);
1948 		svsb->bdes = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_BDES], 8);
1949 		svsb->mdes = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_MDES], 8);
1950 		svsb->dcbdet = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_DCBDET], 8);
1951 		svsb->dcmdet = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_DCMDET], 8);
1952 		svsb->vmax += svsb->dvt_fixed;
1953 
1954 		svsb->mts = (svsp->ts_coeff * 2) / 1000;
1955 		svsb->bts = (((500 * golden_temp + svsp->ts_coeff) / 1000) - 25) * 4;
1956 	}
1957 
1958 	return true;
1959 }
1960 
1961 static bool svs_mt8183_efuse_parsing(struct svs_platform *svsp,
1962 				     const struct svs_platform_data *pdata)
1963 {
1964 	struct svs_bank *svsb;
1965 	const struct svs_bank_pdata *bdata;
1966 	int format[6], x_roomt[6], o_vtsmcu[5], o_vtsabb, tb_roomt = 0;
1967 	int adc_ge_t, adc_oe_t, ge, oe, gain, degc_cali, adc_cali_en_t;
1968 	int o_slope, o_slope_sign, ts_id;
1969 	u32 idx, i, ft_pgm, mts, temp0, temp1, temp2;
1970 
1971 	for (i = 0; i < svsp->efuse_max; i++)
1972 		if (svsp->efuse[i])
1973 			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
1974 				 i, svsp->efuse[i]);
1975 
1976 	if (!svsp->efuse[2]) {
1977 		dev_notice(svsp->dev, "svs_efuse[2] = 0x0?\n");
1978 		return false;
1979 	}
1980 
1981 	/* Svs efuse parsing */
1982 	ft_pgm = svs_get_fuse_val(svsp->efuse, &pdata->glb_fuse_map[GLB_FT_PGM], 4);
1983 
1984 	for (idx = 0; idx < svsp->bank_max; idx++) {
1985 		svsb = &svsp->banks[idx];
1986 		bdata = &svsb->pdata;
1987 		const struct svs_fusemap *dfmap = bdata->dev_fuse_map;
1988 
1989 		if (ft_pgm <= 1)
1990 			svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
1991 
1992 		svsb->mtdes = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_MTDES], 8);
1993 		svsb->bdes = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_BDES], 8);
1994 		svsb->mdes = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_MDES], 8);
1995 		svsb->dcbdet = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_DCBDET], 8);
1996 		svsb->dcmdet = svs_get_fuse_val(svsp->efuse, &dfmap[BDEV_DCMDET], 8);
1997 
1998 		switch (bdata->sw_id) {
1999 		case SVSB_SWID_CPU_LITTLE:
2000 		case SVSB_SWID_CCI:
2001 			if (ft_pgm <= 3)
2002 				svsb->volt_od += 10;
2003 			else
2004 				svsb->volt_od += 2;
2005 			break;
2006 		case SVSB_SWID_CPU_BIG:
2007 			if (ft_pgm <= 3)
2008 				svsb->volt_od += 15;
2009 			else
2010 				svsb->volt_od += 12;
2011 			break;
2012 		case SVSB_SWID_GPU:
2013 			if (ft_pgm != FUSE_DATA_NOT_VALID && ft_pgm >= 2) {
2014 				svsb->freq_base = 800000000; /* 800MHz */
2015 				svsb->dvt_fixed = 2;
2016 			}
2017 			break;
2018 		default:
2019 			dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
2020 			return false;
2021 		}
2022 	}
2023 
2024 	/* Thermal efuse parsing */
2025 	adc_ge_t = (svsp->tefuse[1] >> 22) & GENMASK(9, 0);
2026 	adc_oe_t = (svsp->tefuse[1] >> 12) & GENMASK(9, 0);
2027 
2028 	o_vtsmcu[0] = (svsp->tefuse[0] >> 17) & GENMASK(8, 0);
2029 	o_vtsmcu[1] = (svsp->tefuse[0] >> 8) & GENMASK(8, 0);
2030 	o_vtsmcu[2] = svsp->tefuse[1] & GENMASK(8, 0);
2031 	o_vtsmcu[3] = (svsp->tefuse[2] >> 23) & GENMASK(8, 0);
2032 	o_vtsmcu[4] = (svsp->tefuse[2] >> 5) & GENMASK(8, 0);
2033 	o_vtsabb = (svsp->tefuse[2] >> 14) & GENMASK(8, 0);
2034 
2035 	degc_cali = (svsp->tefuse[0] >> 1) & GENMASK(5, 0);
2036 	adc_cali_en_t = svsp->tefuse[0] & BIT(0);
2037 	o_slope_sign = (svsp->tefuse[0] >> 7) & BIT(0);
2038 
2039 	ts_id = (svsp->tefuse[1] >> 9) & BIT(0);
2040 	if (!ts_id) {
2041 		o_slope = 1534;
2042 	} else {
2043 		o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0);
2044 		if (!o_slope_sign)
2045 			o_slope = 1534 + o_slope * 10;
2046 		else
2047 			o_slope = 1534 - o_slope * 10;
2048 	}
2049 
2050 	if (adc_cali_en_t == 0 ||
2051 	    adc_ge_t < 265 || adc_ge_t > 758 ||
2052 	    adc_oe_t < 265 || adc_oe_t > 758 ||
2053 	    o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 ||
2054 	    o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 ||
2055 	    o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 ||
2056 	    o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 ||
2057 	    o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 ||
2058 	    o_vtsabb < -8 || o_vtsabb > 484 ||
2059 	    degc_cali < 1 || degc_cali > 63) {
2060 		dev_err(svsp->dev, "bad thermal efuse, no mon mode\n");
2061 		goto remove_mt8183_svsb_mon_mode;
2062 	}
2063 
2064 	ge = ((adc_ge_t - 512) * 10000) / 4096;
2065 	oe = (adc_oe_t - 512);
2066 	gain = (10000 + ge);
2067 
2068 	format[0] = (o_vtsmcu[0] + 3350 - oe);
2069 	format[1] = (o_vtsmcu[1] + 3350 - oe);
2070 	format[2] = (o_vtsmcu[2] + 3350 - oe);
2071 	format[3] = (o_vtsmcu[3] + 3350 - oe);
2072 	format[4] = (o_vtsmcu[4] + 3350 - oe);
2073 	format[5] = (o_vtsabb + 3350 - oe);
2074 
2075 	for (i = 0; i < 6; i++)
2076 		x_roomt[i] = (((format[i] * 10000) / 4096) * 10000) / gain;
2077 
2078 	temp0 = (10000 * 100000 / gain) * 15 / 18;
2079 	mts = (temp0 * 10) / o_slope;
2080 
2081 	for (idx = 0; idx < svsp->bank_max; idx++) {
2082 		svsb = &svsp->banks[idx];
2083 		bdata = &svsb->pdata;
2084 		svsb->mts = mts;
2085 
2086 		switch (bdata->sw_id) {
2087 		case SVSB_SWID_CPU_LITTLE:
2088 			tb_roomt = x_roomt[3];
2089 			break;
2090 		case SVSB_SWID_CPU_BIG:
2091 			tb_roomt = x_roomt[4];
2092 			break;
2093 		case SVSB_SWID_CCI:
2094 			tb_roomt = x_roomt[3];
2095 			break;
2096 		case SVSB_SWID_GPU:
2097 			tb_roomt = x_roomt[1];
2098 			break;
2099 		default:
2100 			dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
2101 			goto remove_mt8183_svsb_mon_mode;
2102 		}
2103 
2104 		temp0 = (degc_cali * 10 / 2);
2105 		temp1 = ((10000 * 100000 / 4096 / gain) *
2106 			 oe + tb_roomt * 10) * 15 / 18;
2107 		temp2 = temp1 * 100 / o_slope;
2108 
2109 		svsb->bts = (temp0 + temp2 - 250) * 4 / 10;
2110 	}
2111 
2112 	return true;
2113 
2114 remove_mt8183_svsb_mon_mode:
2115 	for (idx = 0; idx < svsp->bank_max; idx++) {
2116 		svsb = &svsp->banks[idx];
2117 		svsb->mode_support &= ~SVSB_MODE_MON;
2118 	}
2119 
2120 	return true;
2121 }
2122 
2123 static struct device *svs_get_subsys_device(struct svs_platform *svsp,
2124 					    const char *node_name)
2125 {
2126 	struct platform_device *pdev;
2127 	struct device_node *np;
2128 
2129 	np = of_find_node_by_name(NULL, node_name);
2130 	if (!np) {
2131 		dev_err(svsp->dev, "cannot find %s node\n", node_name);
2132 		return ERR_PTR(-ENODEV);
2133 	}
2134 
2135 	pdev = of_find_device_by_node(np);
2136 	if (!pdev) {
2137 		of_node_put(np);
2138 		dev_err(svsp->dev, "cannot find pdev by %s\n", node_name);
2139 		return ERR_PTR(-ENXIO);
2140 	}
2141 
2142 	of_node_put(np);
2143 
2144 	return &pdev->dev;
2145 }
2146 
2147 static struct device *svs_add_device_link(struct svs_platform *svsp,
2148 					  const char *node_name)
2149 {
2150 	struct device *dev;
2151 	struct device_link *sup_link;
2152 
2153 	dev = svs_get_subsys_device(svsp, node_name);
2154 	if (IS_ERR(dev))
2155 		return dev;
2156 
2157 	sup_link = device_link_add(svsp->dev, dev,
2158 				   DL_FLAG_AUTOREMOVE_CONSUMER);
2159 	if (!sup_link) {
2160 		dev_err(svsp->dev, "sup_link is NULL\n");
2161 		return ERR_PTR(-EINVAL);
2162 	}
2163 
2164 	if (sup_link->supplier->links.status != DL_DEV_DRIVER_BOUND)
2165 		return ERR_PTR(-EPROBE_DEFER);
2166 
2167 	return dev;
2168 }
2169 
2170 static int svs_mt8192_platform_probe(struct svs_platform *svsp)
2171 {
2172 	struct device *dev;
2173 	u32 idx;
2174 
2175 	svsp->rst = devm_reset_control_get_optional(svsp->dev, "svs_rst");
2176 	if (IS_ERR(svsp->rst))
2177 		return dev_err_probe(svsp->dev, PTR_ERR(svsp->rst),
2178 				     "cannot get svs reset control\n");
2179 
2180 	dev = svs_add_device_link(svsp, "thermal-sensor");
2181 	if (IS_ERR(dev))
2182 		return dev_err_probe(svsp->dev, PTR_ERR(dev),
2183 				     "failed to get lvts device\n");
2184 
2185 	for (idx = 0; idx < svsp->bank_max; idx++) {
2186 		struct svs_bank *svsb = &svsp->banks[idx];
2187 		const struct svs_bank_pdata *bdata = &svsb->pdata;
2188 
2189 		switch (bdata->sw_id) {
2190 		case SVSB_SWID_CPU_LITTLE:
2191 		case SVSB_SWID_CPU_BIG:
2192 			svsb->opp_dev = get_cpu_device(bdata->cpu_id);
2193 			break;
2194 		case SVSB_SWID_CCI:
2195 			svsb->opp_dev = svs_add_device_link(svsp, "cci");
2196 			break;
2197 		case SVSB_SWID_GPU:
2198 			if (bdata->type == SVSB_TYPE_LOW)
2199 				svsb->opp_dev = svs_get_subsys_device(svsp, "gpu");
2200 			else
2201 				svsb->opp_dev = svs_add_device_link(svsp, "gpu");
2202 			break;
2203 		default:
2204 			dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
2205 			return -EINVAL;
2206 		}
2207 
2208 		if (IS_ERR(svsb->opp_dev))
2209 			return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev),
2210 					     "failed to get OPP device for bank %d\n",
2211 					     idx);
2212 	}
2213 
2214 	return 0;
2215 }
2216 
2217 static int svs_mt8183_platform_probe(struct svs_platform *svsp)
2218 {
2219 	struct device *dev;
2220 	u32 idx;
2221 
2222 	dev = svs_add_device_link(svsp, "thermal-sensor");
2223 	if (IS_ERR(dev))
2224 		return dev_err_probe(svsp->dev, PTR_ERR(dev),
2225 				     "failed to get thermal device\n");
2226 
2227 	for (idx = 0; idx < svsp->bank_max; idx++) {
2228 		struct svs_bank *svsb = &svsp->banks[idx];
2229 		const struct svs_bank_pdata *bdata = &svsb->pdata;
2230 
2231 		switch (bdata->sw_id) {
2232 		case SVSB_SWID_CPU_LITTLE:
2233 		case SVSB_SWID_CPU_BIG:
2234 			svsb->opp_dev = get_cpu_device(bdata->cpu_id);
2235 			break;
2236 		case SVSB_SWID_CCI:
2237 			svsb->opp_dev = svs_add_device_link(svsp, "cci");
2238 			break;
2239 		case SVSB_SWID_GPU:
2240 			svsb->opp_dev = svs_add_device_link(svsp, "gpu");
2241 			break;
2242 		default:
2243 			dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
2244 			return -EINVAL;
2245 		}
2246 
2247 		if (IS_ERR(svsb->opp_dev))
2248 			return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev),
2249 					     "failed to get OPP device for bank %d\n",
2250 					     idx);
2251 	}
2252 
2253 	return 0;
2254 }
2255 
2256 static struct svs_bank svs_mt8195_banks[] = {
2257 	{
2258 		.pdata = (const struct svs_bank_pdata) {
2259 			.sw_id			= SVSB_SWID_GPU,
2260 			.type			= SVSB_TYPE_LOW,
2261 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2262 			.get_volts		= svs_get_bank_volts_v3,
2263 			.opp_count		= MAX_OPP_ENTRIES,
2264 			.turn_freq_base		= 640000000,
2265 			.volt_step		= 6250,
2266 			.volt_base		= 400000,
2267 			.age_config		= 0x555555,
2268 			.dc_config		= 0x1,
2269 			.vco			= 0x18,
2270 			.chk_shift		= 0x87,
2271 			.int_st			= BIT(0),
2272 			.ctl0			= 0x00540003,
2273 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2274 				{ 10, 16 }, { 10, 24 }, { 10, 0 }, { 8, 0 }, { 8, 8 }
2275 			}
2276 		},
2277 		.mode_support	= SVSB_MODE_INIT02,
2278 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT,
2279 		.freq_base	= 640000000,
2280 		.core_sel	= 0x0fff0100,
2281 		.dvt_fixed	= 0x1,
2282 		.vmax		= 0x38,
2283 		.vmin		= 0x14,
2284 	},
2285 	{
2286 		.pdata = (const struct svs_bank_pdata) {
2287 			.sw_id			= SVSB_SWID_GPU,
2288 			.type			= SVSB_TYPE_HIGH,
2289 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2290 			.get_volts		= svs_get_bank_volts_v3,
2291 			.tzone_name		= "gpu",
2292 			.opp_count		= MAX_OPP_ENTRIES,
2293 			.turn_freq_base		= 640000000,
2294 			.volt_step		= 6250,
2295 			.volt_base		= 400000,
2296 			.age_config		= 0x555555,
2297 			.dc_config		= 0x1,
2298 			.vco			= 0x18,
2299 			.chk_shift		= 0x87,
2300 			.int_st			= BIT(1),
2301 			.ctl0			= 0x00540003,
2302 			.tzone_htemp		= 85000,
2303 			.tzone_htemp_voffset	= 0,
2304 			.tzone_ltemp		= 25000,
2305 			.tzone_ltemp_voffset	= 7,
2306 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2307 				{ 9, 16 }, { 9, 24 }, { 9, 0 }, { 8, 0 }, { 8, 8 }
2308 			},
2309 		},
2310 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2311 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2312 		.freq_base	= 880000000,
2313 		.core_sel	= 0x0fff0101,
2314 		.dvt_fixed	= 0x6,
2315 		.vmax		= 0x38,
2316 		.vmin		= 0x14,
2317 	},
2318 };
2319 
2320 static struct svs_bank svs_mt8192_banks[] = {
2321 	{
2322 		.pdata = (const struct svs_bank_pdata) {
2323 			.sw_id			= SVSB_SWID_GPU,
2324 			.type			= SVSB_TYPE_LOW,
2325 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2326 			.get_volts		= svs_get_bank_volts_v3,
2327 			.tzone_name		= "gpu",
2328 			.opp_count		= MAX_OPP_ENTRIES,
2329 			.turn_freq_base		= 688000000,
2330 			.volt_step		= 6250,
2331 			.volt_base		= 400000,
2332 			.age_config		= 0x555555,
2333 			.dc_config		= 0x1,
2334 			.vco			= 0x18,
2335 			.chk_shift		= 0x87,
2336 			.int_st			= BIT(0),
2337 			.ctl0			= 0x00540003,
2338 			.tzone_htemp		= 85000,
2339 			.tzone_htemp_voffset	= 0,
2340 			.tzone_ltemp		= 25000,
2341 			.tzone_ltemp_voffset	= 7,
2342 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2343 				{ 10, 16 }, { 10, 24 }, { 10, 0 }, { 17, 0 }, { 17, 8 }
2344 			}
2345 		},
2346 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT,
2347 		.mode_support	= SVSB_MODE_INIT02,
2348 		.freq_base	= 688000000,
2349 		.core_sel	= 0x0fff0100,
2350 		.dvt_fixed	= 0x1,
2351 		.vmax		= 0x60,
2352 		.vmin		= 0x1a,
2353 	},
2354 	{
2355 		.pdata = (const struct svs_bank_pdata) {
2356 			.sw_id			= SVSB_SWID_GPU,
2357 			.type			= SVSB_TYPE_HIGH,
2358 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2359 			.get_volts		= svs_get_bank_volts_v3,
2360 			.tzone_name		= "gpu",
2361 			.opp_count		= MAX_OPP_ENTRIES,
2362 			.turn_freq_base		= 688000000,
2363 			.volt_step		= 6250,
2364 			.volt_base		= 400000,
2365 			.age_config		= 0x555555,
2366 			.dc_config		= 0x1,
2367 			.vco			= 0x18,
2368 			.chk_shift		= 0x87,
2369 			.int_st			= BIT(1),
2370 			.ctl0			= 0x00540003,
2371 			.tzone_htemp		= 85000,
2372 			.tzone_htemp_voffset	= 0,
2373 			.tzone_ltemp		= 25000,
2374 			.tzone_ltemp_voffset	= 7,
2375 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2376 				{ 9, 16 }, { 9, 24 }, { 17, 0 }, { 17, 16 }, { 17, 24 }
2377 			}
2378 		},
2379 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2380 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2381 		.freq_base	= 902000000,
2382 		.core_sel	= 0x0fff0101,
2383 		.dvt_fixed	= 0x6,
2384 		.vmax		= 0x60,
2385 		.vmin		= 0x1a,
2386 	},
2387 };
2388 
2389 static struct svs_bank svs_mt8188_banks[] = {
2390 	{
2391 		.pdata = (const struct svs_bank_pdata) {
2392 			.sw_id			= SVSB_SWID_GPU,
2393 			.type			= SVSB_TYPE_LOW,
2394 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2395 			.get_volts		= svs_get_bank_volts_v3,
2396 			.opp_count		= MAX_OPP_ENTRIES,
2397 			.turn_freq_base		= 640000000,
2398 			.volt_step		= 6250,
2399 			.volt_base		= 400000,
2400 			.age_config		= 0x555555,
2401 			.dc_config		= 0x555555,
2402 			.vco			= 0x10,
2403 			.chk_shift		= 0x87,
2404 			.int_st			= BIT(0),
2405 			.ctl0			= 0x00100003,
2406 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2407 				{ 5, 16 }, { 5, 24 }, { 5, 0 }, { 15, 16 }, { 15, 24 }
2408 			}
2409 		},
2410 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT,
2411 		.mode_support	= SVSB_MODE_INIT02,
2412 		.freq_base	= 640000000,
2413 		.core_sel	= 0x0fff0000,
2414 		.dvt_fixed	= 0x1,
2415 		.vmax		= 0x38,
2416 		.vmin		= 0x1c,
2417 	},
2418 	{
2419 		.pdata = (const struct svs_bank_pdata) {
2420 			.sw_id			= SVSB_SWID_GPU,
2421 			.type			= SVSB_TYPE_HIGH,
2422 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2423 			.get_volts		= svs_get_bank_volts_v3,
2424 			.tzone_name		= "gpu",
2425 			.opp_count		= MAX_OPP_ENTRIES,
2426 			.turn_freq_base		= 640000000,
2427 			.volt_step		= 6250,
2428 			.volt_base		= 400000,
2429 			.age_config		= 0x555555,
2430 			.dc_config		= 0x555555,
2431 			.vco			= 0x10,
2432 			.chk_shift		= 0x87,
2433 			.int_st			= BIT(1),
2434 			.ctl0			= 0x00100003,
2435 			.tzone_htemp		= 85000,
2436 			.tzone_htemp_voffset	= 0,
2437 			.tzone_ltemp		= 25000,
2438 			.tzone_ltemp_voffset	= 7,
2439 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2440 				{ 4, 16 }, { 4, 24 }, { 4, 0 }, { 14, 0 }, { 14, 8 }
2441 			}
2442 		},
2443 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2444 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2445 		.freq_base	= 880000000,
2446 		.core_sel	= 0x0fff0001,
2447 		.dvt_fixed	= 0x4,
2448 		.vmax		= 0x38,
2449 		.vmin		= 0x1c,
2450 	},
2451 };
2452 
2453 static struct svs_bank svs_mt8186_banks[] = {
2454 	{
2455 		.pdata = (const struct svs_bank_pdata) {
2456 			.sw_id			= SVSB_SWID_CPU_BIG,
2457 			.type			= SVSB_TYPE_LOW,
2458 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2459 			.get_volts		= svs_get_bank_volts_v3,
2460 			.cpu_id			= 6,
2461 			.opp_count		= MAX_OPP_ENTRIES,
2462 			.turn_freq_base		= 1670000000,
2463 			.volt_step		= 6250,
2464 			.volt_base		= 400000,
2465 			.age_config		= 0x1,
2466 			.dc_config		= 0x1,
2467 			.vco			= 0x10,
2468 			.chk_shift		= 0x87,
2469 			.int_st			= BIT(0),
2470 			.ctl0			= 0x00540003,
2471 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2472 				{ 3, 16 }, { 3, 24 }, { 3, 0 }, { 14, 16 }, { 14, 24 }
2473 			}
2474 		},
2475 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT,
2476 		.volt_od	= 4,
2477 		.mode_support	= SVSB_MODE_INIT02,
2478 		.freq_base	= 1670000000,
2479 		.core_sel	= 0x0fff0100,
2480 		.dvt_fixed	= 0x3,
2481 		.vmax		= 0x59,
2482 		.vmin		= 0x20,
2483 	},
2484 	{
2485 		.pdata = (const struct svs_bank_pdata) {
2486 			.sw_id			= SVSB_SWID_CPU_BIG,
2487 			.type			= SVSB_TYPE_HIGH,
2488 			.set_freq_pct		= svs_set_bank_freq_pct_v3,
2489 			.get_volts		= svs_get_bank_volts_v3,
2490 			.cpu_id			= 6,
2491 			.tzone_name		= "cpu-big",
2492 			.opp_count		= MAX_OPP_ENTRIES,
2493 			.turn_freq_base		= 1670000000,
2494 			.volt_step		= 6250,
2495 			.volt_base		= 400000,
2496 			.age_config		= 0x1,
2497 			.dc_config		= 0x1,
2498 			.vco			= 0x10,
2499 			.chk_shift		= 0x87,
2500 			.int_st			= BIT(1),
2501 			.ctl0			= 0x00540003,
2502 			.tzone_htemp		= 85000,
2503 			.tzone_htemp_voffset	= 8,
2504 			.tzone_ltemp		= 25000,
2505 			.tzone_ltemp_voffset	= 8,
2506 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2507 				{ 2, 16 }, { 2, 24 }, { 2, 0 }, { 13, 0 }, { 13, 8 }
2508 			}
2509 		},
2510 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2511 		.volt_od	= 4,
2512 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2513 		.freq_base	= 2050000000,
2514 		.core_sel	= 0x0fff0101,
2515 		.dvt_fixed	= 0x6,
2516 		.vmax		= 0x73,
2517 		.vmin		= 0x20,
2518 	},
2519 	{
2520 		.pdata = (const struct svs_bank_pdata) {
2521 			.sw_id			= SVSB_SWID_CPU_LITTLE,
2522 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2523 			.get_volts		= svs_get_bank_volts_v2,
2524 			.cpu_id			= 0,
2525 			.tzone_name		= "cpu-little",
2526 			.opp_count		= MAX_OPP_ENTRIES,
2527 			.volt_step		= 6250,
2528 			.volt_base		= 400000,
2529 			.age_config		= 0x1,
2530 			.dc_config		= 0x1,
2531 			.vco			= 0x10,
2532 			.chk_shift		= 0x87,
2533 			.int_st			= BIT(2),
2534 			.ctl0			= 0x3210000f,
2535 			.tzone_htemp		= 85000,
2536 			.tzone_htemp_voffset	= 8,
2537 			.tzone_ltemp		= 25000,
2538 			.tzone_ltemp_voffset	= 8,
2539 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2540 				{ 4, 16 }, { 4, 24 }, { 4, 0 }, { 14, 0 }, { 14, 8 }
2541 			}
2542 		},
2543 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2544 		.volt_od	= 3,
2545 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2546 		.freq_base	= 2000000000,
2547 		.core_sel	= 0x0fff0102,
2548 		.dvt_fixed	= 0x6,
2549 		.vmax		= 0x65,
2550 		.vmin		= 0x20,
2551 	},
2552 	{
2553 		.pdata = (const struct svs_bank_pdata) {
2554 			.sw_id			= SVSB_SWID_CCI,
2555 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2556 			.get_volts		= svs_get_bank_volts_v2,
2557 			.tzone_name		= "cci",
2558 			.opp_count		= MAX_OPP_ENTRIES,
2559 			.volt_step		= 6250,
2560 			.volt_base		= 400000,
2561 			.age_config		= 0x1,
2562 			.dc_config		= 0x1,
2563 			.vco			= 0x10,
2564 			.chk_shift		= 0x87,
2565 			.int_st			= BIT(3),
2566 			.ctl0			= 0x3210000f,
2567 			.tzone_htemp		= 85000,
2568 			.tzone_htemp_voffset	= 8,
2569 			.tzone_ltemp		= 25000,
2570 			.tzone_ltemp_voffset	= 8,
2571 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2572 				{ 5, 16 }, { 5, 24 }, { 5, 0 }, { 15, 16 }, { 15, 24 }
2573 			}
2574 		},
2575 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2576 		.volt_od	= 3,
2577 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2578 		.freq_base	= 1400000000,
2579 		.core_sel	= 0x0fff0103,
2580 		.dvt_fixed	= 0x6,
2581 		.vmax		= 0x65,
2582 		.vmin		= 0x20,
2583 	},
2584 	{
2585 		.pdata = (const struct svs_bank_pdata) {
2586 			.sw_id			= SVSB_SWID_GPU,
2587 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2588 			.get_volts		= svs_get_bank_volts_v2,
2589 			.tzone_name		= "gpu",
2590 			.opp_count		= MAX_OPP_ENTRIES,
2591 			.volt_step		= 6250,
2592 			.volt_base		= 400000,
2593 			.age_config		= 0x555555,
2594 			.dc_config		= 0x1,
2595 			.vco			= 0x10,
2596 			.chk_shift		= 0x87,
2597 			.int_st			= BIT(4),
2598 			.ctl0			= 0x00100003,
2599 			.tzone_htemp		= 85000,
2600 			.tzone_htemp_voffset	= 8,
2601 			.tzone_ltemp		= 25000,
2602 			.tzone_ltemp_voffset	= 7,
2603 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2604 				{ 6, 16 }, { 6, 24 }, { 6, 0 }, { 15, 8 }, { 15, 0 }
2605 			}
2606 		},
2607 		.volt_flags	= SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2608 		.mode_support	= SVSB_MODE_INIT02 | SVSB_MODE_MON,
2609 		.freq_base	= 850000000,
2610 		.core_sel	= 0x0fff0104,
2611 		.dvt_fixed	= 0x4,
2612 		.vmax		= 0x58,
2613 		.vmin		= 0x20,
2614 	},
2615 };
2616 
2617 static struct svs_bank svs_mt8183_banks[] = {
2618 	{
2619 		.pdata = (const struct svs_bank_pdata) {
2620 			.sw_id			= SVSB_SWID_CPU_LITTLE,
2621 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2622 			.get_volts		= svs_get_bank_volts_v2,
2623 			.cpu_id			= 0,
2624 			.buck_name		= "proc",
2625 			.opp_count		= MAX_OPP_ENTRIES,
2626 			.vboot			= 0x30,
2627 			.volt_step		= 6250,
2628 			.volt_base		= 500000,
2629 			.age_config		= 0x555555,
2630 			.dc_config		= 0x555555,
2631 			.vco			= 0x10,
2632 			.chk_shift		= 0x77,
2633 			.int_st			= BIT(0),
2634 			.ctl0			= 0x00010001,
2635 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2636 				{ 16, 0 }, { 16, 8 }, { 17, 16 }, { 16, 16 }, { 16, 24 }
2637 			}
2638 		},
2639 		.volt_flags	= SVSB_INIT01_VOLT_INC_ONLY,
2640 		.mode_support	= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
2641 		.freq_base	= 1989000000,
2642 		.core_sel	= 0x8fff0000,
2643 		.dvt_fixed	= 0x7,
2644 		.vmax		= 0x64,
2645 		.vmin		= 0x18,
2646 
2647 	},
2648 	{
2649 		.pdata = (const struct svs_bank_pdata) {
2650 			.sw_id			= SVSB_SWID_CPU_BIG,
2651 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2652 			.get_volts		= svs_get_bank_volts_v2,
2653 			.cpu_id			= 4,
2654 			.buck_name		= "proc",
2655 			.opp_count		= MAX_OPP_ENTRIES,
2656 			.vboot			= 0x30,
2657 			.volt_step		= 6250,
2658 			.volt_base		= 500000,
2659 			.age_config		= 0x555555,
2660 			.dc_config		= 0x555555,
2661 			.vco			= 0x10,
2662 			.chk_shift		= 0x77,
2663 			.int_st			= BIT(1),
2664 			.ctl0			= 0x00000001,
2665 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2666 				{ 18, 0 }, { 18, 8 }, { 17, 0 }, { 18, 16 }, { 18, 24 }
2667 			}
2668 		},
2669 		.volt_flags	= SVSB_INIT01_VOLT_INC_ONLY,
2670 		.mode_support	= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
2671 		.freq_base	= 1989000000,
2672 		.core_sel	= 0x8fff0001,
2673 		.dvt_fixed	= 0x7,
2674 		.vmax		= 0x58,
2675 		.vmin		= 0x10,
2676 
2677 	},
2678 	{
2679 		.pdata = (const struct svs_bank_pdata) {
2680 			.sw_id			= SVSB_SWID_CCI,
2681 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2682 			.get_volts		= svs_get_bank_volts_v2,
2683 			.buck_name		= "proc",
2684 			.opp_count		= MAX_OPP_ENTRIES,
2685 			.vboot			= 0x30,
2686 			.volt_step		= 6250,
2687 			.volt_base		= 500000,
2688 			.age_config		= 0x555555,
2689 			.dc_config		= 0x555555,
2690 			.vco			= 0x10,
2691 			.chk_shift		= 0x77,
2692 			.int_st			= BIT(2),
2693 			.ctl0			= 0x00100003,
2694 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2695 				{ 4, 0 }, { 4, 8 }, { 5, 16 }, { 4, 16 }, { 4, 24 }
2696 			}
2697 		},
2698 		.volt_flags	= SVSB_INIT01_VOLT_INC_ONLY,
2699 		.mode_support	= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
2700 		.freq_base	= 1196000000,
2701 		.core_sel	= 0x8fff0002,
2702 		.dvt_fixed	= 0x7,
2703 		.vmax		= 0x64,
2704 		.vmin		= 0x18,
2705 	},
2706 	{
2707 		.pdata = (const struct svs_bank_pdata) {
2708 			.sw_id			= SVSB_SWID_GPU,
2709 			.set_freq_pct		= svs_set_bank_freq_pct_v2,
2710 			.get_volts		= svs_get_bank_volts_v2,
2711 			.buck_name		= "mali",
2712 			.tzone_name		= "gpu",
2713 			.opp_count		= MAX_OPP_ENTRIES,
2714 			.vboot			= 0x30,
2715 			.volt_step		= 6250,
2716 			.volt_base		= 500000,
2717 			.age_config		= 0x555555,
2718 			.dc_config		= 0x555555,
2719 			.vco			= 0x10,
2720 			.chk_shift		= 0x77,
2721 			.int_st			= BIT(3),
2722 			.ctl0			= 0x00050001,
2723 			.tzone_htemp		= 85000,
2724 			.tzone_htemp_voffset	= 0,
2725 			.tzone_ltemp		= 25000,
2726 			.tzone_ltemp_voffset	= 3,
2727 			.dev_fuse_map		= (const struct svs_fusemap[BDEV_MAX]) {
2728 				{ 6, 0 }, { 6, 8 }, { 5, 0 }, { 6, 16 }, { 6, 24 }
2729 			}
2730 		},
2731 		.volt_flags	= SVSB_INIT01_PD_REQ | SVSB_INIT01_VOLT_INC_ONLY,
2732 		.mode_support	= SVSB_MODE_INIT01 | SVSB_MODE_INIT02 | SVSB_MODE_MON,
2733 		.freq_base	= 900000000,
2734 		.core_sel	= 0x8fff0003,
2735 		.dvt_fixed	= 0x3,
2736 		.vmax		= 0x40,
2737 		.vmin		= 0x14,
2738 	},
2739 };
2740 
2741 static const struct svs_platform_data svs_mt8195_platform_data = {
2742 	.name = "mt8195-svs",
2743 	.banks = svs_mt8195_banks,
2744 	.efuse_parsing = svs_common_parse_efuse,
2745 	.probe = svs_mt8192_platform_probe,
2746 	.regs = svs_regs_v2,
2747 	.bank_max = ARRAY_SIZE(svs_mt8195_banks),
2748 	.ts_coeff = SVSB_TS_COEFF_MT8195,
2749 	.glb_fuse_map = (const struct svs_fusemap[GLB_MAX]) {
2750 		{ 0, 0 }, { 19, 4 }
2751 	}
2752 };
2753 
2754 static const struct svs_platform_data svs_mt8192_platform_data = {
2755 	.name = "mt8192-svs",
2756 	.banks = svs_mt8192_banks,
2757 	.efuse_parsing = svs_common_parse_efuse,
2758 	.probe = svs_mt8192_platform_probe,
2759 	.regs = svs_regs_v2,
2760 	.bank_max = ARRAY_SIZE(svs_mt8192_banks),
2761 	.ts_coeff = SVSB_TS_COEFF_MT8195,
2762 	.glb_fuse_map = (const struct svs_fusemap[GLB_MAX]) {
2763 		/* FT_PGM not present */
2764 		{ -1, 0 }, { 19, 4 }
2765 	}
2766 };
2767 
2768 static const struct svs_platform_data svs_mt8188_platform_data = {
2769 	.name = "mt8188-svs",
2770 	.banks = svs_mt8188_banks,
2771 	.efuse_parsing = svs_common_parse_efuse,
2772 	.probe = svs_mt8192_platform_probe,
2773 	.regs = svs_regs_v2,
2774 	.bank_max = ARRAY_SIZE(svs_mt8188_banks),
2775 	.ts_coeff = SVSB_TS_COEFF_MT8195,
2776 	.glb_fuse_map = (const struct svs_fusemap[GLB_MAX]) {
2777 		/* FT_PGM and VMIN not present */
2778 		{ -1, 0 }, { -1, 0 }
2779 	}
2780 };
2781 
2782 static const struct svs_platform_data svs_mt8186_platform_data = {
2783 	.name = "mt8186-svs",
2784 	.banks = svs_mt8186_banks,
2785 	.efuse_parsing = svs_common_parse_efuse,
2786 	.probe = svs_mt8192_platform_probe,
2787 	.regs = svs_regs_v2,
2788 	.bank_max = ARRAY_SIZE(svs_mt8186_banks),
2789 	.ts_coeff = SVSB_TS_COEFF_MT8186,
2790 	.glb_fuse_map = (const struct svs_fusemap[GLB_MAX]) {
2791 		/* FT_PGM and VMIN not present */
2792 		{ -1, 0 }, { -1, 0 }
2793 	}
2794 };
2795 
2796 static const struct svs_platform_data svs_mt8183_platform_data = {
2797 	.name = "mt8183-svs",
2798 	.banks = svs_mt8183_banks,
2799 	.efuse_parsing = svs_mt8183_efuse_parsing,
2800 	.probe = svs_mt8183_platform_probe,
2801 	.regs = svs_regs_v2,
2802 	.bank_max = ARRAY_SIZE(svs_mt8183_banks),
2803 	.glb_fuse_map = (const struct svs_fusemap[GLB_MAX]) {
2804 		/* VMIN not present */
2805 		{ 0, 4 }, { -1, 0 }
2806 	}
2807 };
2808 
2809 static const struct of_device_id svs_of_match[] = {
2810 	{ .compatible = "mediatek,mt8195-svs", .data = &svs_mt8195_platform_data },
2811 	{ .compatible = "mediatek,mt8192-svs", .data = &svs_mt8192_platform_data },
2812 	{ .compatible = "mediatek,mt8188-svs", .data = &svs_mt8188_platform_data },
2813 	{ .compatible = "mediatek,mt8186-svs", .data = &svs_mt8186_platform_data },
2814 	{ .compatible = "mediatek,mt8183-svs", .data = &svs_mt8183_platform_data },
2815 	{ /* sentinel */ }
2816 };
2817 MODULE_DEVICE_TABLE(of, svs_of_match);
2818 
2819 static int svs_probe(struct platform_device *pdev)
2820 {
2821 	struct svs_platform *svsp;
2822 	const struct svs_platform_data *svsp_data;
2823 	int ret, svsp_irq;
2824 
2825 	svsp_data = of_device_get_match_data(&pdev->dev);
2826 
2827 	svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL);
2828 	if (!svsp)
2829 		return -ENOMEM;
2830 
2831 	svsp->dev = &pdev->dev;
2832 	svsp->banks = svsp_data->banks;
2833 	svsp->regs = svsp_data->regs;
2834 	svsp->bank_max = svsp_data->bank_max;
2835 	svsp->ts_coeff = svsp_data->ts_coeff;
2836 
2837 	ret = svsp_data->probe(svsp);
2838 	if (ret)
2839 		return ret;
2840 
2841 	ret = svs_get_efuse_data(svsp, "svs-calibration-data",
2842 				 &svsp->efuse, &svsp->efuse_max);
2843 	if (ret)
2844 		return dev_err_probe(&pdev->dev, ret, "Cannot read SVS calibration\n");
2845 
2846 	ret = svs_get_efuse_data(svsp, "t-calibration-data",
2847 				 &svsp->tefuse, &svsp->tefuse_max);
2848 	if (ret) {
2849 		dev_err_probe(&pdev->dev, ret, "Cannot read SVS-Thermal calibration\n");
2850 		goto svs_probe_free_efuse;
2851 	}
2852 
2853 	if (!svsp_data->efuse_parsing(svsp, svsp_data)) {
2854 		ret = dev_err_probe(svsp->dev, -EINVAL, "efuse data parsing failed\n");
2855 		goto svs_probe_free_tefuse;
2856 	}
2857 
2858 	ret = svs_bank_resource_setup(svsp);
2859 	if (ret) {
2860 		dev_err_probe(svsp->dev, ret, "svs bank resource setup fail\n");
2861 		goto svs_probe_free_tefuse;
2862 	}
2863 
2864 	svsp_irq = platform_get_irq(pdev, 0);
2865 	if (svsp_irq < 0) {
2866 		ret = svsp_irq;
2867 		goto svs_probe_free_tefuse;
2868 	}
2869 
2870 	svsp->main_clk = devm_clk_get(svsp->dev, "main");
2871 	if (IS_ERR(svsp->main_clk)) {
2872 		ret = dev_err_probe(svsp->dev, PTR_ERR(svsp->main_clk),
2873 				    "failed to get clock\n");
2874 		goto svs_probe_free_tefuse;
2875 	}
2876 
2877 	ret = clk_prepare_enable(svsp->main_clk);
2878 	if (ret) {
2879 		dev_err_probe(svsp->dev, ret, "cannot enable main clk\n");
2880 		goto svs_probe_free_tefuse;
2881 	}
2882 
2883 	svsp->base = of_iomap(svsp->dev->of_node, 0);
2884 	if (IS_ERR_OR_NULL(svsp->base)) {
2885 		ret = dev_err_probe(svsp->dev, -EINVAL, "cannot find svs register base\n");
2886 		goto svs_probe_clk_disable;
2887 	}
2888 
2889 	ret = devm_request_threaded_irq(svsp->dev, svsp_irq, NULL, svs_isr,
2890 					IRQF_ONESHOT, svsp_data->name, svsp);
2891 	if (ret) {
2892 		dev_err_probe(svsp->dev, ret, "register irq(%d) failed\n", svsp_irq);
2893 		goto svs_probe_iounmap;
2894 	}
2895 
2896 	ret = svs_start(svsp);
2897 	if (ret) {
2898 		dev_err_probe(svsp->dev, ret, "svs start fail\n");
2899 		goto svs_probe_iounmap;
2900 	}
2901 
2902 #ifdef CONFIG_DEBUG_FS
2903 	ret = svs_create_debug_cmds(svsp);
2904 	if (ret) {
2905 		dev_err_probe(svsp->dev, ret, "svs create debug cmds fail\n");
2906 		goto svs_probe_iounmap;
2907 	}
2908 #endif
2909 
2910 	return 0;
2911 
2912 svs_probe_iounmap:
2913 	iounmap(svsp->base);
2914 svs_probe_clk_disable:
2915 	clk_disable_unprepare(svsp->main_clk);
2916 svs_probe_free_tefuse:
2917 	kfree(svsp->tefuse);
2918 svs_probe_free_efuse:
2919 	kfree(svsp->efuse);
2920 	return ret;
2921 }
2922 
2923 static DEFINE_SIMPLE_DEV_PM_OPS(svs_pm_ops, svs_suspend, svs_resume);
2924 
2925 static struct platform_driver svs_driver = {
2926 	.probe	= svs_probe,
2927 	.driver	= {
2928 		.name		= "mtk-svs",
2929 		.pm		= &svs_pm_ops,
2930 		.of_match_table	= svs_of_match,
2931 	},
2932 };
2933 
2934 module_platform_driver(svs_driver);
2935 
2936 MODULE_AUTHOR("Roger Lu <roger.lu@mediatek.com>");
2937 MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>");
2938 MODULE_DESCRIPTION("MediaTek SVS driver");
2939 MODULE_LICENSE("GPL");
2940