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