Merge tag '6.10-rc1-smb3-client-fixes' of git://git.samba.org/sfrench/cifs-2.6
[sfrench/cifs-2.6.git] / drivers / soc / mediatek / mtk-svs.c
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");