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