1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2022 MediaTek Inc.
4 * Copyright (C) 2022 Collabora Ltd.
5 * AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
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>
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)
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)
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
56 #define SVSB_DESCHAR_FLD_MDES GENMASK(7, 0)
57 #define SVSB_DESCHAR_FLD_BDES GENMASK(15, 8)
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)
65 #define SVSB_DETCHAR_FLD_DCMDET GENMASK(7, 0)
66 #define SVSB_DETCHAR_FLD_DCBDET GENMASK(15, 8)
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
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)
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
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
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)
110 #define SVSB_TSCALCS_FLD_MTS GENMASK(11, 0)
111 #define SVSB_TSCALCS_FLD_BTS GENMASK(23, 12)
114 #define SVSB_INIT2VALS_FLD_DCVOFFSETIN GENMASK(15, 0)
115 #define SVSB_INIT2VALS_FLD_AGEVOFFSETIN GENMASK(31, 16)
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)
123 /* SVS Thermal Coefficients */
124 #define SVSB_TS_COEFF_MT8195 250460
125 #define SVSB_TS_COEFF_MT8186 204650
128 #define FUSE_DATA_NOT_VALID U32_MAX
130 /* svs bank related setting */
132 #define MAX_OPP_ENTRIES 16
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
139 static DEFINE_SPINLOCK(svs_lock);
141 #ifdef CONFIG_DEBUG_FS
142 #define debug_fops_ro(name) \
143 static int svs_##name##_debug_open(struct inode *inode, \
146 return single_open(filp, svs_##name##_debug_show, \
149 static const struct file_operations svs_##name##_debug_fops = { \
150 .owner = THIS_MODULE, \
151 .open = svs_##name##_debug_open, \
153 .llseek = seq_lseek, \
154 .release = single_release, \
157 #define debug_fops_rw(name) \
158 static int svs_##name##_debug_open(struct inode *inode, \
161 return single_open(filp, svs_##name##_debug_show, \
164 static const struct file_operations svs_##name##_debug_fops = { \
165 .owner = THIS_MODULE, \
166 .open = svs_##name##_debug_open, \
168 .write = svs_##name##_debug_write, \
169 .llseek = seq_lseek, \
170 .release = single_release, \
173 #define svs_dentry_data(name) {__stringify(name), &svs_##name##_debug_fops}
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
185 SVSB_SWID_CPU_LITTLE,
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
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)
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.
218 * svs bank general phase-enabled order:
219 * SVSB_PHASE_INIT01 -> SVSB_PHASE_INIT02 -> SVSB_PHASE_MON
222 SVSB_PHASE_ERROR = 0,
287 static const u32 svs_regs_v2[] = {
330 [THERMINTST] = 0x304,
332 [THSTAGE0ST] = 0x30c,
333 [THSTAGE1ST] = 0x310,
334 [THSTAGE2ST] = 0x314,
344 static const char * const svs_swid_names[SVSB_SWID_MAX] = {
345 "SVSB_CPU_LITTLE", "SVSB_CPU_BIG", "SVSB_CCI", "SVSB_GPU"
348 static const char * const svs_type_names[SVSB_TYPE_MAX] = {
352 enum svs_fusemap_dev {
361 enum svs_fusemap_glb {
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
387 struct svs_platform {
390 struct clk *main_clk;
391 struct svs_bank *banks;
392 struct reset_control *rst;
402 struct svs_platform_data {
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;
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
439 struct svs_bank_pdata {
440 const struct svs_fusemap *dev_fuse_map;
452 u16 tzone_htemp_voffset;
453 u16 tzone_ltemp_voffset;
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);
468 * struct svs_bank - svs bank representation
469 * @pdata: SVS Bank immutable config parameters
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
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
505 * Svs bank will generate suitable voltages by below general math equation
506 * and provide these voltages to opp voltage table.
508 * opp_volt[i] = (volt[i] * volt_step) + volt_base;
511 const struct svs_bank_pdata pdata;
513 struct device *opp_dev;
514 struct completion init_completion;
515 struct regulator *buck;
516 struct thermal_zone_device *tzd;
518 int pm_runtime_enabled_count;
521 enum svsb_phase phase;
522 u32 reg_data[SVSB_PHASE_MAX][SVS_REG_MAX];
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];
548 static u32 percent(u32 numerator, u32 denominator)
550 /* If not divide 1000, "numerator * 100" will have data overflow. */
554 return DIV_ROUND_UP(numerator * 100, denominator);
557 static u32 svs_readl_relaxed(struct svs_platform *svsp, enum svs_reg_index rg_i)
559 return readl_relaxed(svsp->base + svsp->regs[rg_i]);
562 static void svs_writel_relaxed(struct svs_platform *svsp, u32 val,
563 enum svs_reg_index rg_i)
565 writel_relaxed(val, svsp->base + svsp->regs[rg_i]);
568 static void svs_switch_bank(struct svs_platform *svsp, struct svs_bank *svsb)
570 svs_writel_relaxed(svsp, svsb->core_sel, CORESEL);
573 static u32 svs_bank_volt_to_opp_volt(u32 svsb_volt, u32 svsb_volt_step,
576 return (svsb_volt * svsb_volt_step) + svsb_volt_base;
579 static u32 svs_opp_volt_to_bank_volt(u32 opp_u_volt, u32 svsb_volt_step,
582 return (opp_u_volt - svsb_volt_base) / svsb_volt_step;
585 static int svs_sync_bank_volts_from_opp(struct svs_bank *svsb)
587 const struct svs_bank_pdata *bdata = &svsb->pdata;
588 struct dev_pm_opp *opp;
591 for (i = 0; i < bdata->opp_count; i++) {
592 opp = dev_pm_opp_find_freq_exact(svsb->opp_dev,
596 dev_err(svsb->dev, "cannot find freq = %u (%ld)\n",
597 svsb->opp_dfreq[i], PTR_ERR(opp));
601 opp_u_volt = dev_pm_opp_get_voltage(opp);
602 svsb->volt[i] = svs_opp_volt_to_bank_volt(opp_u_volt,
611 static int svs_adjust_pm_opp_volts(struct svs_bank *svsb)
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;
617 mutex_lock(&svsb->lock);
620 * 2-line bank updates its corresponding opp volts.
621 * 1-line bank updates all opp volts.
623 if (bdata->type == SVSB_TYPE_HIGH) {
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;
631 opp_stop = bdata->opp_count;
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;
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;
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)) {
653 opp_stop = bdata->opp_count;
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];
663 case SVSB_PHASE_INIT01:
666 case SVSB_PHASE_INIT02:
668 svsb_volt = max(svsb->volt[i] + temp_voffset, svsb->vmin);
669 opp_volt = svs_bank_volt_to_opp_volt(svsb_volt,
674 dev_err(svsb->dev, "unknown phase: %u\n", svsb->phase);
679 opp_volt = min(opp_volt, svsb->opp_dvolt[i]);
680 ret = dev_pm_opp_adjust_voltage(svsb->opp_dev,
685 dev_err(svsb->dev, "set %uuV fail: %d\n",
692 mutex_unlock(&svsb->lock);
697 static void svs_bank_disable_and_restore_default_volts(struct svs_platform *svsp,
698 struct svs_bank *svsb)
702 if (svsb->mode_support == SVSB_MODE_ALL_DISABLE)
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);
711 svsb->phase = SVSB_PHASE_ERROR;
712 svs_adjust_pm_opp_volts(svsb);
715 #ifdef CONFIG_DEBUG_FS
716 static int svs_dump_debug_show(struct seq_file *m, void *p)
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;
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",
728 for (i = 0; i < svsp->tefuse_max; i++)
730 seq_printf(m, "THERMAL_EFUSE%d = 0x%08x\n",
733 for (bank_id = 0, idx = 0; idx < svsp->bank_max; idx++, bank_id++) {
734 svsb = &svsp->banks[idx];
736 for (i = SVSB_PHASE_INIT01; i <= SVSB_PHASE_MON; i++) {
737 seq_printf(m, "Bank_number = %u\n", bank_id);
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");
744 seq_puts(m, "mode = error\n");
746 for (j = DESCHAR; j < SVS_REG_MAX; j++) {
747 svs_reg_addr = (unsigned long)(svsp->base +
749 seq_printf(m, "0x%08lx = 0x%08x\n",
750 svs_reg_addr, svsb->reg_data[i][j]);
760 static int svs_enable_debug_show(struct seq_file *m, void *v)
762 struct svs_bank *svsb = (struct svs_bank *)m->private;
764 switch (svsb->phase) {
765 case SVSB_PHASE_ERROR:
766 seq_puts(m, "disabled\n");
768 case SVSB_PHASE_INIT01:
769 seq_puts(m, "init1\n");
771 case SVSB_PHASE_INIT02:
772 seq_puts(m, "init2\n");
775 seq_puts(m, "mon mode\n");
778 seq_puts(m, "unknown\n");
785 static ssize_t svs_enable_debug_write(struct file *filp,
786 const char __user *buffer,
787 size_t count, loff_t *pos)
789 struct svs_bank *svsb = file_inode(filp)->i_private;
790 struct svs_platform *svsp = dev_get_drvdata(svsb->dev);
794 if (count >= PAGE_SIZE)
797 buf = (char *)memdup_user_nul(buffer, count);
801 ret = kstrtoint(buf, 10, &enabled);
806 svs_bank_disable_and_restore_default_volts(svsp, svsb);
807 svsb->mode_support = SVSB_MODE_ALL_DISABLE;
815 debug_fops_rw(enable);
817 static int svs_status_debug_show(struct seq_file *m, void *v)
819 struct svs_bank *svsb = (struct svs_bank *)m->private;
820 struct dev_pm_opp *opp;
821 int tzone_temp = 0, ret;
824 ret = thermal_zone_get_temp(svsb->tzd, &tzone_temp);
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);
829 seq_printf(m, "%s: temperature = %d, vbin_turn_pt = %u, turn_pt = %u\n",
830 svsb->name, tzone_temp, svsb->vbin_turn_pt,
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);
837 seq_printf(m, "%s: cannot find freq = %u (%ld)\n",
838 svsb->name, svsb->opp_dfreq[i],
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]);
854 debug_fops_ro(status);
856 static int svs_create_debug_cmds(struct svs_platform *svsp)
858 struct svs_bank *svsb;
859 struct dentry *svs_dir, *svsb_dir, *file_entry;
860 const char *d = "/sys/kernel/debug/svs";
865 const struct file_operations *fops;
868 struct svs_dentry svs_entries[] = {
869 svs_dentry_data(dump),
872 struct svs_dentry svsb_entries[] = {
873 svs_dentry_data(enable),
874 svs_dentry_data(status),
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);
884 for (i = 0; i < ARRAY_SIZE(svs_entries); i++) {
885 file_entry = debugfs_create_file(svs_entries[i].name, 0664,
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);
895 for (idx = 0; idx < svsp->bank_max; idx++) {
896 svsb = &svsp->banks[idx];
898 if (svsb->mode_support == SVSB_MODE_ALL_DISABLE)
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);
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);
923 #endif /* CONFIG_DEBUG_FS */
925 static u32 interpolate(u32 f0, u32 f1, u32 v0, u32 v1, u32 fx)
929 if (v0 == v1 || f0 == f1)
932 /* *100 to have decimal fraction factor */
933 vx = (v0 * 100) - ((((v0 - v1) * 100) / (f0 - f1)) * (f0 - fx));
935 return DIV_ROUND_UP(vx, 100);
938 static void svs_get_bank_volts_v3(struct svs_platform *svsp, struct svs_bank *svsb)
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);
945 if (svsb->phase == SVSB_PHASE_MON &&
946 svsb->volt_flags & SVSB_MON_VOLT_IGNORE)
949 vop74 = svs_readl_relaxed(svsp, VOP74);
950 vop30 = svs_readl_relaxed(svsp, VOP30);
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 :
960 svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
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);
968 for (i = j; i < bdata->opp_count; i++) {
969 b_sft = BITS8 * (shift_byte % REG_BYTES);
970 vop = (shift_byte < REG_BYTES) ? &vop30 :
972 svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
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],
985 if (bdata->type == SVSB_TYPE_HIGH) {
986 /* volt[0] + volt[j] ~ volt[turn_pt - 1] */
988 svsb->volt[0] = FIELD_GET(SVSB_VOPS_FLD_VOP0_4, vop30);
990 for (i = j; i < turn_pt; i++) {
991 b_sft = BITS8 * (shift_byte % REG_BYTES);
992 vop = (shift_byte < REG_BYTES) ? &vop30 :
994 svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
998 /* volt[1] ~ volt[j - 1] by interpolate */
999 for (i = 1; i < j; i++)
1000 svsb->volt[i] = interpolate(svsb->freq_pct[0],
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 :
1011 svsb->volt[i] = (*vop >> b_sft) & GENMASK(7, 0);
1017 if (bdata->type == SVSB_TYPE_HIGH) {
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;
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;
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],
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;
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],
1048 svsb->volt[svsb->vbin_turn_pt],
1053 static void svs_set_bank_freq_pct_v3(struct svs_platform *svsp, struct svs_bank *svsb)
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);
1060 for (i = 0; i < bdata->opp_count; i++) {
1061 if (svsb->opp_dfreq[i] <= bdata->turn_freq_base) {
1067 turn_pt = svsb->turn_pt;
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) {
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.
1078 freq_pct30 = svsb->freq_pct[0];
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);
1088 } else if (bdata->type == SVSB_TYPE_LOW) {
1090 * freq_pct[turn_pt] +
1091 * freq_pct[opp_count - 7] ~ freq_pct[opp_count -1]
1093 freq_pct30 = svsb->freq_pct[turn_pt];
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);
1105 if (bdata->type == SVSB_TYPE_HIGH) {
1108 * freq_pct[turn_pt - 7] ~ freq_pct[turn_pt - 1]
1110 freq_pct30 = svsb->freq_pct[0];
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);
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);
1132 svs_writel_relaxed(svsp, freq_pct74, FREQPCT74);
1133 svs_writel_relaxed(svsp, freq_pct30, FREQPCT30);
1136 static void svs_get_bank_volts_v2(struct svs_platform *svsp, struct svs_bank *svsb)
1138 const struct svs_bank_pdata *bdata = &svsb->pdata;
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);
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);
1153 for (i = 0; i <= 12; i += 2)
1154 svsb->volt[i + 1] = interpolate(svsb->freq_pct[i],
1155 svsb->freq_pct[i + 2],
1158 svsb->freq_pct[i + 1]);
1160 svsb->volt[15] = interpolate(svsb->freq_pct[12],
1164 svsb->freq_pct[15]);
1166 for (i = 0; i < bdata->opp_count; i++)
1167 svsb->volt[i] += svsb->volt_od;
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],
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;
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],
1188 svsb->volt[svsb->vbin_turn_pt],
1193 static void svs_set_bank_freq_pct_v2(struct svs_platform *svsp, struct svs_bank *svsb)
1195 u32 freqpct74_val, freqpct30_val;
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]);
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]);
1207 svs_writel_relaxed(svsp, freqpct74_val, FREQPCT74);
1208 svs_writel_relaxed(svsp, freqpct30_val, FREQPCT30);
1211 static void svs_set_bank_phase(struct svs_platform *svsp,
1212 unsigned int bank_idx,
1213 enum svsb_phase target_phase)
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;
1219 svs_switch_bank(svsp, svsb);
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);
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);
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);
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);
1238 bdata->set_freq_pct(svsp, svsb);
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);
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);
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);
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);
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);
1273 dev_err(svsb->dev, "requested unknown target phase: %u\n",
1279 static inline void svs_save_bank_register_data(struct svs_platform *svsp,
1280 unsigned short bank_idx,
1281 enum svsb_phase phase)
1283 struct svs_bank *svsb = &svsp->banks[bank_idx];
1284 enum svs_reg_index rg_i;
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);
1290 static inline void svs_error_isr_handler(struct svs_platform *svsp,
1291 unsigned short bank_idx)
1293 struct svs_bank *svsb = &svsp->banks[bank_idx];
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));
1305 svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_ERROR);
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);
1312 static inline void svs_init01_isr_handler(struct svs_platform *svsp,
1313 unsigned short bank_idx)
1315 struct svs_bank *svsb = &svsp->banks[bank_idx];
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));
1323 svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_INIT01);
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;
1333 svsb->age_voffset_in = svs_readl_relaxed(svsp, AGEVALUES) &
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;
1341 static inline void svs_init02_isr_handler(struct svs_platform *svsp,
1342 unsigned short bank_idx)
1344 struct svs_bank *svsb = &svsp->banks[bank_idx];
1345 const struct svs_bank_pdata *bdata = &svsb->pdata;
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));
1352 svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_INIT02);
1354 svsb->phase = SVSB_PHASE_INIT02;
1355 bdata->get_volts(svsp, svsb);
1357 svs_writel_relaxed(svsp, SVSB_PTPEN_OFF, SVSEN);
1358 svs_writel_relaxed(svsp, SVSB_INTSTS_F0_COMPLETE, INTSTS);
1361 static inline void svs_mon_mode_isr_handler(struct svs_platform *svsp,
1362 unsigned short bank_idx)
1364 struct svs_bank *svsb = &svsp->banks[bank_idx];
1365 const struct svs_bank_pdata *bdata = &svsb->pdata;
1367 svs_save_bank_register_data(svsp, bank_idx, SVSB_PHASE_MON);
1369 svsb->phase = SVSB_PHASE_MON;
1370 bdata->get_volts(svsp, svsb);
1372 svsb->temp = svs_readl_relaxed(svsp, TEMP) & GENMASK(7, 0);
1373 svs_writel_relaxed(svsp, SVSB_INTSTS_FLD_MONVOP, INTSTS);
1376 static irqreturn_t svs_isr(int irq, void *data)
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;
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);
1389 spin_lock_irqsave(&svs_lock, flags);
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);
1397 svs_switch_bank(svsp, svsb);
1398 int_sts = svs_readl_relaxed(svsp, INTSTS);
1399 svs_en = svs_readl_relaxed(svsp, SVSEN);
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);
1410 svs_error_isr_handler(svsp, idx);
1412 spin_unlock_irqrestore(&svs_lock, flags);
1416 svs_adjust_pm_opp_volts(svsb);
1418 if (svsb->phase == SVSB_PHASE_INIT01 ||
1419 svsb->phase == SVSB_PHASE_INIT02)
1420 complete(&svsb->init_completion);
1425 static bool svs_mode_available(struct svs_platform *svsp, u8 mode)
1429 for (i = 0; i < svsp->bank_max; i++)
1430 if (svsp->banks[i].mode_support & mode)
1435 static int svs_init01(struct svs_platform *svsp)
1437 const struct svs_bank_pdata *bdata;
1438 struct svs_bank *svsb;
1439 unsigned long flags, time_left;
1442 u32 opp_freq, opp_vboot, buck_volt, idx, i;
1444 if (!svs_mode_available(svsp, SVSB_MODE_INIT01))
1447 /* Keep CPUs' core power on for svs_init01 initialization */
1448 cpuidle_pause_and_lock();
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;
1455 if (!(svsb->mode_support & SVSB_MODE_INIT01))
1458 ret = regulator_enable(svsb->buck);
1460 dev_err(svsb->dev, "%s enable fail: %d\n",
1461 bdata->buck_name, ret);
1462 goto svs_init01_resume_cpuidle;
1465 /* Some buck doesn't support mode change. Show fail msg only */
1466 ret = regulator_set_mode(svsb->buck, REGULATOR_MODE_FAST);
1468 dev_notice(svsb->dev, "set fast mode fail: %d\n", ret);
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++;
1476 ret = pm_runtime_resume_and_get(svsb->opp_dev);
1478 dev_err(svsb->dev, "mtcmos on fail: %d\n", ret);
1479 goto svs_init01_resume_cpuidle;
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.
1489 for (idx = 0; idx < svsp->bank_max; idx++) {
1490 svsb = &svsp->banks[idx];
1491 bdata = &svsb->pdata;
1493 if (!(svsb->mode_support & SVSB_MODE_INIT01))
1497 * Find the fastest freq that can be run at vboot and
1498 * fix to that freq until svs_init01 is done.
1500 search_done = false;
1501 opp_vboot = svs_bank_volt_to_opp_volt(bdata->vboot,
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,
1515 "set opp %uuV vboot fail: %d\n",
1517 goto svs_init01_finish;
1522 ret = dev_pm_opp_disable(svsb->opp_dev,
1523 svsb->opp_dfreq[i]);
1526 "opp %uHz disable fail: %d\n",
1527 svsb->opp_dfreq[i], ret);
1528 goto svs_init01_finish;
1534 /* Svs bank init01 begins */
1535 for (idx = 0; idx < svsp->bank_max; idx++) {
1536 svsb = &svsp->banks[idx];
1537 bdata = &svsb->pdata;
1539 if (!(svsb->mode_support & SVSB_MODE_INIT01))
1542 opp_vboot = svs_bank_volt_to_opp_volt(bdata->vboot,
1546 buck_volt = regulator_get_voltage(svsb->buck);
1547 if (buck_volt != opp_vboot) {
1549 "buck voltage: %uuV, expected vboot: %uuV\n",
1550 buck_volt, opp_vboot);
1552 goto svs_init01_finish;
1555 spin_lock_irqsave(&svs_lock, flags);
1556 svs_set_bank_phase(svsp, idx, SVSB_PHASE_INIT01);
1557 spin_unlock_irqrestore(&svs_lock, flags);
1559 time_left = wait_for_completion_timeout(&svsb->init_completion,
1560 msecs_to_jiffies(5000));
1562 dev_err(svsb->dev, "init01 completion timeout\n");
1564 goto svs_init01_finish;
1569 for (idx = 0; idx < svsp->bank_max; idx++) {
1570 svsb = &svsp->banks[idx];
1571 bdata = &svsb->pdata;
1573 if (!(svsb->mode_support & SVSB_MODE_INIT01))
1576 for (i = 0; i < bdata->opp_count; i++) {
1577 r = dev_pm_opp_enable(svsb->opp_dev,
1578 svsb->opp_dfreq[i]);
1580 dev_err(svsb->dev, "opp %uHz enable fail: %d\n",
1581 svsb->opp_dfreq[i], r);
1584 if (svsb->volt_flags & SVSB_INIT01_PD_REQ) {
1585 r = pm_runtime_put_sync(svsb->opp_dev);
1587 dev_err(svsb->dev, "mtcmos off fail: %d\n", r);
1589 if (svsb->pm_runtime_enabled_count > 0) {
1590 pm_runtime_disable(svsb->opp_dev);
1591 svsb->pm_runtime_enabled_count--;
1595 r = regulator_set_mode(svsb->buck, REGULATOR_MODE_NORMAL);
1597 dev_notice(svsb->dev, "set normal mode fail: %d\n", r);
1599 r = regulator_disable(svsb->buck);
1601 dev_err(svsb->dev, "%s disable fail: %d\n",
1602 bdata->buck_name, r);
1605 svs_init01_resume_cpuidle:
1606 cpuidle_resume_and_unlock();
1611 static int svs_init02(struct svs_platform *svsp)
1613 const struct svs_bank_pdata *bdata;
1614 struct svs_bank *svsb;
1615 unsigned long flags, time_left;
1619 if (!svs_mode_available(svsp, SVSB_MODE_INIT02))
1622 for (idx = 0; idx < svsp->bank_max; idx++) {
1623 svsb = &svsp->banks[idx];
1625 if (!(svsb->mode_support & SVSB_MODE_INIT02))
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);
1633 time_left = wait_for_completion_timeout(&svsb->init_completion,
1634 msecs_to_jiffies(5000));
1636 dev_err(svsb->dev, "init02 completion timeout\n");
1643 * 2-line high/low bank update its corresponding opp voltages only.
1644 * Therefore, we sync voltages from opp for high/low bank voltages
1647 for (idx = 0; idx < svsp->bank_max; idx++) {
1648 svsb = &svsp->banks[idx];
1649 bdata = &svsb->pdata;
1651 if (!(svsb->mode_support & SVSB_MODE_INIT02))
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");
1666 for (idx = 0; idx < svsp->bank_max; idx++) {
1667 svsb = &svsp->banks[idx];
1668 svs_bank_disable_and_restore_default_volts(svsp, svsb);
1674 static void svs_mon_mode(struct svs_platform *svsp)
1676 struct svs_bank *svsb;
1677 unsigned long flags;
1680 for (idx = 0; idx < svsp->bank_max; idx++) {
1681 svsb = &svsp->banks[idx];
1683 if (!(svsb->mode_support & SVSB_MODE_MON))
1686 spin_lock_irqsave(&svs_lock, flags);
1687 svs_set_bank_phase(svsp, idx, SVSB_PHASE_MON);
1688 spin_unlock_irqrestore(&svs_lock, flags);
1692 static int svs_start(struct svs_platform *svsp)
1696 ret = svs_init01(svsp);
1700 ret = svs_init02(svsp);
1709 static int svs_suspend(struct device *dev)
1711 struct svs_platform *svsp = dev_get_drvdata(dev);
1715 for (idx = 0; idx < svsp->bank_max; idx++) {
1716 struct svs_bank *svsb = &svsp->banks[idx];
1718 svs_bank_disable_and_restore_default_volts(svsp, svsb);
1721 ret = reset_control_assert(svsp->rst);
1723 dev_err(svsp->dev, "cannot assert reset %d\n", ret);
1727 clk_disable_unprepare(svsp->main_clk);
1732 static int svs_resume(struct device *dev)
1734 struct svs_platform *svsp = dev_get_drvdata(dev);
1737 ret = clk_prepare_enable(svsp->main_clk);
1739 dev_err(svsp->dev, "cannot enable main_clk, disable svs\n");
1743 ret = reset_control_deassert(svsp->rst);
1745 dev_err(svsp->dev, "cannot deassert reset %d\n", ret);
1749 ret = svs_init02(svsp);
1751 goto svs_resume_reset_assert;
1757 svs_resume_reset_assert:
1758 dev_err(svsp->dev, "assert reset: %d\n",
1759 reset_control_assert(svsp->rst));
1762 clk_disable_unprepare(svsp->main_clk);
1766 static int svs_bank_resource_setup(struct svs_platform *svsp)
1768 const struct svs_bank_pdata *bdata;
1769 struct svs_bank *svsb;
1770 struct dev_pm_opp *opp;
1771 char tz_name_buf[20];
1776 dev_set_drvdata(svsp->dev, svsp);
1778 for (idx = 0; idx < svsp->bank_max; idx++) {
1779 svsb = &svsp->banks[idx];
1780 bdata = &svsb->pdata;
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");
1787 svsb->dev = devm_kzalloc(svsp->dev, sizeof(*svsb->dev), GFP_KERNEL);
1791 svsb->name = devm_kasprintf(svsp->dev, GFP_KERNEL, "%s%s",
1792 svs_swid_names[bdata->sw_id],
1793 svs_type_names[bdata->type]);
1797 ret = dev_set_name(svsb->dev, "%s", svsb->name);
1801 dev_set_drvdata(svsb->dev, svsp);
1803 ret = devm_pm_opp_of_add_table(svsb->opp_dev);
1805 dev_err(svsb->dev, "add opp table fail: %d\n", ret);
1809 mutex_init(&svsb->lock);
1810 init_completion(&svsb->init_completion);
1812 if (svsb->mode_support & SVSB_MODE_INIT01) {
1813 svsb->buck = devm_regulator_get_optional(svsb->opp_dev,
1815 if (IS_ERR(svsb->buck)) {
1816 dev_err(svsb->dev, "cannot get \"%s-supply\"\n",
1818 return PTR_ERR(svsb->buck);
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",
1829 return PTR_ERR(svsb->tzd);
1833 count = dev_pm_opp_get_opp_count(svsb->opp_dev);
1834 if (bdata->opp_count != count) {
1836 "opp_count not \"%u\" but get \"%d\"?\n",
1837 bdata->opp_count, count);
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);
1844 dev_err(svsb->dev, "cannot find freq = %ld\n",
1846 return PTR_ERR(opp);
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],
1853 dev_pm_opp_put(opp);
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)
1864 struct nvmem_cell *cell;
1866 cell = nvmem_cell_get(svsp->dev, nvmem_cell_name);
1868 dev_err(svsp->dev, "no \"%s\"? %ld\n",
1869 nvmem_cell_name, PTR_ERR(cell));
1870 return PTR_ERR(cell);
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);
1879 *svsp_efuse_max /= sizeof(u32);
1880 nvmem_cell_put(cell);
1885 static u32 svs_get_fuse_val(u32 *fuse_array, const struct svs_fusemap *fmap, u8 nbits)
1889 if (fmap->index < 0)
1890 return FUSE_DATA_NOT_VALID;
1892 val = fuse_array[fmap->index] >> fmap->ofst;
1893 val &= GENMASK(nbits - 1, 0);
1898 static bool svs_is_available(struct svs_platform *svsp)
1900 int i, num_populated = 0;
1902 /* If at least two fuse arrays are populated, SVS is calibrated */
1903 for (i = 0; i < svsp->efuse_max; i++) {
1907 if (num_populated > 1)
1914 static bool svs_common_parse_efuse(struct svs_platform *svsp,
1915 const struct svs_platform_data *pdata)
1917 const struct svs_fusemap *gfmap = pdata->glb_fuse_map;
1918 struct svs_fusemap tfm = { 0, 24 };
1919 u32 golden_temp, val;
1923 if (!svs_is_available(svsp))
1926 /* Get golden temperature from SVS-Thermal calibration */
1927 val = svs_get_fuse_val(svsp->tefuse, &tfm, 8);
1929 /* If golden temp is not programmed, use the default of 50 */
1930 golden_temp = val ? val : 50;
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);
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;
1945 svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
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;
1954 svsb->mts = (svsp->ts_coeff * 2) / 1000;
1955 svsb->bts = (((500 * golden_temp + svsp->ts_coeff) / 1000) - 25) * 4;
1961 static bool svs_mt8183_efuse_parsing(struct svs_platform *svsp,
1962 const struct svs_platform_data *pdata)
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;
1971 for (i = 0; i < svsp->efuse_max; i++)
1973 dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
1976 if (!svsp->efuse[2]) {
1977 dev_notice(svsp->dev, "svs_efuse[2] = 0x0?\n");
1981 /* Svs efuse parsing */
1982 ft_pgm = svs_get_fuse_val(svsp->efuse, &pdata->glb_fuse_map[GLB_FT_PGM], 4);
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;
1990 svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
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);
1998 switch (bdata->sw_id) {
1999 case SVSB_SWID_CPU_LITTLE:
2002 svsb->volt_od += 10;
2006 case SVSB_SWID_CPU_BIG:
2008 svsb->volt_od += 15;
2010 svsb->volt_od += 12;
2013 if (ft_pgm != FUSE_DATA_NOT_VALID && ft_pgm >= 2) {
2014 svsb->freq_base = 800000000; /* 800MHz */
2015 svsb->dvt_fixed = 2;
2019 dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
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);
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);
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);
2039 ts_id = (svsp->tefuse[1] >> 9) & BIT(0);
2043 o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0);
2045 o_slope = 1534 + o_slope * 10;
2047 o_slope = 1534 - o_slope * 10;
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;
2064 ge = ((adc_ge_t - 512) * 10000) / 4096;
2065 oe = (adc_oe_t - 512);
2066 gain = (10000 + ge);
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);
2075 for (i = 0; i < 6; i++)
2076 x_roomt[i] = (((format[i] * 10000) / 4096) * 10000) / gain;
2078 temp0 = (10000 * 100000 / gain) * 15 / 18;
2079 mts = (temp0 * 10) / o_slope;
2081 for (idx = 0; idx < svsp->bank_max; idx++) {
2082 svsb = &svsp->banks[idx];
2083 bdata = &svsb->pdata;
2086 switch (bdata->sw_id) {
2087 case SVSB_SWID_CPU_LITTLE:
2088 tb_roomt = x_roomt[3];
2090 case SVSB_SWID_CPU_BIG:
2091 tb_roomt = x_roomt[4];
2094 tb_roomt = x_roomt[3];
2097 tb_roomt = x_roomt[1];
2100 dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
2101 goto remove_mt8183_svsb_mon_mode;
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;
2109 svsb->bts = (temp0 + temp2 - 250) * 4 / 10;
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;
2123 static struct device *svs_get_subsys_device(struct svs_platform *svsp,
2124 const char *node_name)
2126 struct platform_device *pdev;
2127 struct device_node *np;
2129 np = of_find_node_by_name(NULL, node_name);
2131 dev_err(svsp->dev, "cannot find %s node\n", node_name);
2132 return ERR_PTR(-ENODEV);
2135 pdev = of_find_device_by_node(np);
2138 dev_err(svsp->dev, "cannot find pdev by %s\n", node_name);
2139 return ERR_PTR(-ENXIO);
2147 static struct device *svs_add_device_link(struct svs_platform *svsp,
2148 const char *node_name)
2151 struct device_link *sup_link;
2153 dev = svs_get_subsys_device(svsp, node_name);
2157 sup_link = device_link_add(svsp->dev, dev,
2158 DL_FLAG_AUTOREMOVE_CONSUMER);
2160 dev_err(svsp->dev, "sup_link is NULL\n");
2161 return ERR_PTR(-EINVAL);
2164 if (sup_link->supplier->links.status != DL_DEV_DRIVER_BOUND)
2165 return ERR_PTR(-EPROBE_DEFER);
2170 static int svs_mt8192_platform_probe(struct svs_platform *svsp)
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");
2180 dev = svs_add_device_link(svsp, "thermal-sensor");
2182 return dev_err_probe(svsp->dev, PTR_ERR(dev),
2183 "failed to get lvts device\n");
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;
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);
2195 svsb->opp_dev = svs_add_device_link(svsp, "cci");
2198 if (bdata->type == SVSB_TYPE_LOW)
2199 svsb->opp_dev = svs_get_subsys_device(svsp, "gpu");
2201 svsb->opp_dev = svs_add_device_link(svsp, "gpu");
2204 dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
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",
2217 static int svs_mt8183_platform_probe(struct svs_platform *svsp)
2222 dev = svs_add_device_link(svsp, "thermal-sensor");
2224 return dev_err_probe(svsp->dev, PTR_ERR(dev),
2225 "failed to get thermal device\n");
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;
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);
2237 svsb->opp_dev = svs_add_device_link(svsp, "cci");
2240 svsb->opp_dev = svs_add_device_link(svsp, "gpu");
2243 dev_err(svsb->dev, "unknown sw_id: %u\n", bdata->sw_id);
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",
2256 static struct svs_bank svs_mt8195_banks[] = {
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,
2266 .volt_base = 400000,
2267 .age_config = 0x555555,
2273 .dev_fuse_map = (const struct svs_fusemap[BDEV_MAX]) {
2274 { 10, 16 }, { 10, 24 }, { 10, 0 }, { 8, 0 }, { 8, 8 }
2277 .mode_support = SVSB_MODE_INIT02,
2278 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT,
2279 .freq_base = 640000000,
2280 .core_sel = 0x0fff0100,
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,
2295 .volt_base = 400000,
2296 .age_config = 0x555555,
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 }
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,
2320 static struct svs_bank svs_mt8192_banks[] = {
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,
2331 .volt_base = 400000,
2332 .age_config = 0x555555,
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 }
2346 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT,
2347 .mode_support = SVSB_MODE_INIT02,
2348 .freq_base = 688000000,
2349 .core_sel = 0x0fff0100,
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,
2364 .volt_base = 400000,
2365 .age_config = 0x555555,
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 }
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,
2389 static struct svs_bank svs_mt8188_banks[] = {
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,
2399 .volt_base = 400000,
2400 .age_config = 0x555555,
2401 .dc_config = 0x555555,
2406 .dev_fuse_map = (const struct svs_fusemap[BDEV_MAX]) {
2407 { 5, 16 }, { 5, 24 }, { 5, 0 }, { 15, 16 }, { 15, 24 }
2410 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT,
2411 .mode_support = SVSB_MODE_INIT02,
2412 .freq_base = 640000000,
2413 .core_sel = 0x0fff0000,
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,
2428 .volt_base = 400000,
2429 .age_config = 0x555555,
2430 .dc_config = 0x555555,
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 }
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,
2453 static struct svs_bank svs_mt8186_banks[] = {
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,
2461 .opp_count = MAX_OPP_ENTRIES,
2462 .turn_freq_base = 1670000000,
2464 .volt_base = 400000,
2471 .dev_fuse_map = (const struct svs_fusemap[BDEV_MAX]) {
2472 { 3, 16 }, { 3, 24 }, { 3, 0 }, { 14, 16 }, { 14, 24 }
2475 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT,
2477 .mode_support = SVSB_MODE_INIT02,
2478 .freq_base = 1670000000,
2479 .core_sel = 0x0fff0100,
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,
2491 .tzone_name = "cpu-big",
2492 .opp_count = MAX_OPP_ENTRIES,
2493 .turn_freq_base = 1670000000,
2495 .volt_base = 400000,
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 }
2510 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2512 .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON,
2513 .freq_base = 2050000000,
2514 .core_sel = 0x0fff0101,
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,
2525 .tzone_name = "cpu-little",
2526 .opp_count = MAX_OPP_ENTRIES,
2528 .volt_base = 400000,
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 }
2543 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2545 .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON,
2546 .freq_base = 2000000000,
2547 .core_sel = 0x0fff0102,
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,
2560 .volt_base = 400000,
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 }
2575 .volt_flags = SVSB_REMOVE_DVTFIXED_VOLT | SVSB_MON_VOLT_IGNORE,
2577 .mode_support = SVSB_MODE_INIT02 | SVSB_MODE_MON,
2578 .freq_base = 1400000000,
2579 .core_sel = 0x0fff0103,
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,
2592 .volt_base = 400000,
2593 .age_config = 0x555555,
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 }
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,
2617 static struct svs_bank svs_mt8183_banks[] = {
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,
2624 .buck_name = "proc",
2625 .opp_count = MAX_OPP_ENTRIES,
2628 .volt_base = 500000,
2629 .age_config = 0x555555,
2630 .dc_config = 0x555555,
2635 .dev_fuse_map = (const struct svs_fusemap[BDEV_MAX]) {
2636 { 16, 0 }, { 16, 8 }, { 17, 16 }, { 16, 16 }, { 16, 24 }
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,
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,
2654 .buck_name = "proc",
2655 .opp_count = MAX_OPP_ENTRIES,
2658 .volt_base = 500000,
2659 .age_config = 0x555555,
2660 .dc_config = 0x555555,
2665 .dev_fuse_map = (const struct svs_fusemap[BDEV_MAX]) {
2666 { 18, 0 }, { 18, 8 }, { 17, 0 }, { 18, 16 }, { 18, 24 }
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,
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,
2687 .volt_base = 500000,
2688 .age_config = 0x555555,
2689 .dc_config = 0x555555,
2694 .dev_fuse_map = (const struct svs_fusemap[BDEV_MAX]) {
2695 { 4, 0 }, { 4, 8 }, { 5, 16 }, { 4, 16 }, { 4, 24 }
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,
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,
2716 .volt_base = 500000,
2717 .age_config = 0x555555,
2718 .dc_config = 0x555555,
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 }
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,
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]) {
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 }
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 }
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 }
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 */
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 },
2817 MODULE_DEVICE_TABLE(of, svs_of_match);
2819 static int svs_probe(struct platform_device *pdev)
2821 struct svs_platform *svsp;
2822 const struct svs_platform_data *svsp_data;
2825 svsp_data = of_device_get_match_data(&pdev->dev);
2827 svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL);
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;
2837 ret = svsp_data->probe(svsp);
2841 ret = svs_get_efuse_data(svsp, "svs-calibration-data",
2842 &svsp->efuse, &svsp->efuse_max);
2844 return dev_err_probe(&pdev->dev, ret, "Cannot read SVS calibration\n");
2846 ret = svs_get_efuse_data(svsp, "t-calibration-data",
2847 &svsp->tefuse, &svsp->tefuse_max);
2849 dev_err_probe(&pdev->dev, ret, "Cannot read SVS-Thermal calibration\n");
2850 goto svs_probe_free_efuse;
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;
2858 ret = svs_bank_resource_setup(svsp);
2860 dev_err_probe(svsp->dev, ret, "svs bank resource setup fail\n");
2861 goto svs_probe_free_tefuse;
2864 svsp_irq = platform_get_irq(pdev, 0);
2867 goto svs_probe_free_tefuse;
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;
2877 ret = clk_prepare_enable(svsp->main_clk);
2879 dev_err_probe(svsp->dev, ret, "cannot enable main clk\n");
2880 goto svs_probe_free_tefuse;
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;
2889 ret = devm_request_threaded_irq(svsp->dev, svsp_irq, NULL, svs_isr,
2890 IRQF_ONESHOT, svsp_data->name, svsp);
2892 dev_err_probe(svsp->dev, ret, "register irq(%d) failed\n", svsp_irq);
2893 goto svs_probe_iounmap;
2896 ret = svs_start(svsp);
2898 dev_err_probe(svsp->dev, ret, "svs start fail\n");
2899 goto svs_probe_iounmap;
2902 #ifdef CONFIG_DEBUG_FS
2903 ret = svs_create_debug_cmds(svsp);
2905 dev_err_probe(svsp->dev, ret, "svs create debug cmds fail\n");
2906 goto 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:
2923 static DEFINE_SIMPLE_DEV_PM_OPS(svs_pm_ops, svs_suspend, svs_resume);
2925 static struct platform_driver svs_driver = {
2930 .of_match_table = svs_of_match,
2934 module_platform_driver(svs_driver);
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");