blob: 2186c063c1651ae37c343f8f9f064e0087e9d11d [file] [log] [blame]
Angel Ponse67ab182020-04-04 18:51:11 +02001/* SPDX-License-Identifier: GPL-2.0-only */
henryc.chen31ae3142015-07-31 17:10:52 +08002#include <assert.h>
3#include <console/console.h>
4#include <delay.h>
Biao Huang0dd83152015-09-03 17:39:12 +08005#include <soc/addressmap.h>
henryc.chen31ae3142015-07-31 17:10:52 +08006#include <soc/mt6391.h>
7#include <soc/pmic_wrap.h>
Biao Huang0dd83152015-09-03 17:39:12 +08008#include <types.h>
henryc.chen31ae3142015-07-31 17:10:52 +08009
Julius Wernercd49cce2019-03-05 16:53:33 -080010#if CONFIG(DEBUG_PMIC)
henryc.chen31ae3142015-07-31 17:10:52 +080011#define DEBUG_PMIC(level, x...) printk(level, x)
12#else
13#define DEBUG_PMIC(level, x...)
14#endif
15
Yidi Lina622f282016-01-29 17:25:03 +080016int mt6391_configure_ca53_voltage(int uv)
17{
18 /* target voltage = 700mv + 6.25mv * buck_val */
19 u16 buck_val = (uv - 700000) / 6250;
Tristan Shiehab1b83d2018-11-01 18:01:50 +080020 u16 current_val = pwrap_read_field(PMIC_RG_VCA15_CON12, 0x7f, 0x0);
Yidi Lina622f282016-01-29 17:25:03 +080021
22 assert(buck_val < (1 << 8));
Tristan Shiehab1b83d2018-11-01 18:01:50 +080023 pwrap_write_field(PMIC_RG_VCA15_CON9, buck_val, 0x7f, 0x0);
24 pwrap_write_field(PMIC_RG_VCA15_CON10, buck_val, 0x7f, 0x0);
Yidi Lina622f282016-01-29 17:25:03 +080025
26 /* For buck delay, default slew rate is 6.25mv/0.5us */
27 if (buck_val > current_val)
Elyes Haouas4abc5c52023-08-13 12:50:46 +020028 return ((buck_val - current_val) / 2);
Yidi Lina622f282016-01-29 17:25:03 +080029 else
30 return 0;
31}
32
Koro Chen64a6b922015-07-31 17:11:04 +080033static void mt6391_configure_vcama(enum ldo_voltage vsel)
34{
35 /* 2'b00: 1.5V
36 * 2'b01: 1.8V
37 * 2'b10: 2.5V
38 * 2'b11: 2.8V
39 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +080040 pwrap_write_field(PMIC_RG_ANALDO_CON6, vsel - 2,
41 PMIC_RG_VCAMA_VOSEL_MASK, PMIC_RG_VCAMA_VOSEL_SHIFT);
42 pwrap_write_field(PMIC_RG_ANALDO_CON2, 1,
43 PMIC_RG_VCAMA_EN_MASK, PMIC_RG_VCAMA_EN_SHIFT);
Koro Chen64a6b922015-07-31 17:11:04 +080044}
45
henryc.chen31ae3142015-07-31 17:10:52 +080046void mt6391_configure_ldo(enum ldo_power ldo, enum ldo_voltage vsel)
47{
48 u16 addr;
49 switch (ldo) {
50 case LDO_VCAMD:
51 assert(vsel != 0);
52 if (vsel == LDO_1P22)
53 vsel = 0;
54 break;
Jitao Shi8ea218b2016-01-11 19:24:37 +080055 case LDO_VGP2:
henryc.chen31ae3142015-07-31 17:10:52 +080056 assert(vsel != 1);
57 if (vsel == LDO_1P0)
58 vsel = 1;
59 break;
60 case LDO_VGP5:
61 assert(vsel != 7);
62 if (vsel == LDO_2P0)
63 vsel = 7;
64 break;
Koro Chen64a6b922015-07-31 17:11:04 +080065 case LDO_VCAMA:
66 assert(vsel > LDO_1P3 && vsel < LDO_3P0);
67 mt6391_configure_vcama(vsel);
68 return;
henryc.chen31ae3142015-07-31 17:10:52 +080069 default:
70 break;
71 }
72 assert(vsel < LDO_NUM_VOLTAGES);
73
74 if (ldo == LDO_VGP6)
75 addr = PMIC_RG_DIGLDO_CON33;
76 else
77 addr = PMIC_RG_DIGLDO_CON19 + ldo * 2;
78
Tristan Shiehab1b83d2018-11-01 18:01:50 +080079 pwrap_write_field(addr, vsel, 0x7, 5);
80 pwrap_write_field(PMIC_RG_DIGLDO_CON5 + ldo * 2, 1, 1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +080081
82}
83
84void mt6391_enable_reset_when_ap_resets(void)
85{
86 /* Enable AP watchdog reset */
Tristan Shiehab1b83d2018-11-01 18:01:50 +080087 pwrap_write_field(PMIC_RG_TOP_RST_MISC, 0x0, 0x1, 0);
henryc.chen31ae3142015-07-31 17:10:52 +080088}
89
90static void mt6391_init_setting(void)
91{
92 /* Enable PMIC RST function (depends on main chip RST function) */
93 /*
94 * state1: RG_SYSRSTB_EN = 1, RG_STRUP_MAN_RST_EN=1, RG_RST_PART_SEL=1
95 * state2: RG_SYSRSTB_EN = 1, RG_STRUP_MAN_RST_EN=0, RG_RST_PART_SEL=1
96 * state3: RG_SYSRSTB_EN = 1, RG_STRUP_MAN_RST_EN=x, RG_RST_PART_SEL=0
97 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +080098 pwrap_write_field(PMIC_RG_TOP_RST_MISC, 0x1, 0x1, 1);
99 pwrap_write_field(PMIC_RG_TOP_RST_MISC, 0x0, 0x1, 2);
100 pwrap_write_field(PMIC_RG_TOP_RST_MISC, 0x1, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800101
102 /* Disable AP watchdog reset */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800103 pwrap_write_field(PMIC_RG_TOP_RST_MISC, 0x1, 0x1, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800104
105 /* Enable CA15 by default for different PMIC behavior */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800106 pwrap_write_field(PMIC_RG_VCA15_CON7, 0x1, 0x1, 0);
107 pwrap_write_field(PMIC_RG_VSRMCA15_CON7, 0x1, 0x1, 0);
108 pwrap_write_field(PMIC_RG_VPCA7_CON7, 0x1, 0x1, 0);
Tristan Shiehf42db112018-06-06 12:52:20 +0800109 udelay(200); /* delay for Buck ready */
henryc.chen31ae3142015-07-31 17:10:52 +0800110
111 /* [3:3]: RG_PWMOC_CK_PDN; For OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800112 pwrap_write_field(PMIC_RG_TOP_CKPDN, 0x0, 0x1, 3);
henryc.chen31ae3142015-07-31 17:10:52 +0800113 /* [9:9]: RG_SRCVOLT_HW_AUTO_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800114 pwrap_write_field(PMIC_RG_TOP_CKCON1, 0x1, 0x1, 9);
henryc.chen31ae3142015-07-31 17:10:52 +0800115 /* [8:8]: RG_OSC_SEL_AUTO; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800116 pwrap_write_field(PMIC_RG_TOP_CKCON1, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800117 /* [6:6]: RG_SMPS_DIV2_SRC_AUTOFF_DIS; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800118 pwrap_write_field(PMIC_RG_TOP_CKCON1, 0x1, 0x1, 6);
henryc.chen31ae3142015-07-31 17:10:52 +0800119 /* [5:5]: RG_SMPS_AUTOFF_DIS; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800120 pwrap_write_field(PMIC_RG_TOP_CKCON1, 0x1, 0x1, 5);
henryc.chen31ae3142015-07-31 17:10:52 +0800121 /* [7:7]: VDRM_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800122 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 7);
henryc.chen31ae3142015-07-31 17:10:52 +0800123 /* [6:6]: VSRMCA7_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800124 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 6);
henryc.chen31ae3142015-07-31 17:10:52 +0800125 /* [5:5]: VPCA7_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800126 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 5);
henryc.chen31ae3142015-07-31 17:10:52 +0800127 /* [4:4]: VIO18_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800128 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800129 /* [3:3]: VGPU_DEG_EN; For OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800130 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 3);
henryc.chen31ae3142015-07-31 17:10:52 +0800131 /* [2:2]: VCORE_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800132 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 2);
henryc.chen31ae3142015-07-31 17:10:52 +0800133 /* [1:1]: VSRMCA15_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800134 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800135 /* [0:0]: VCA15_DEG_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800136 pwrap_write_field(PMIC_RG_OC_DEG_EN, 0x1, 0x1, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800137 /* [11:11]: RG_INT_EN_THR_H; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800138 pwrap_write_field(PMIC_RG_INT_CON0, 0x1, 0x1, 11);
henryc.chen31ae3142015-07-31 17:10:52 +0800139 /* [10:10]: RG_INT_EN_THR_L; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800140 pwrap_write_field(PMIC_RG_INT_CON0, 0x1, 0x1, 10);
henryc.chen31ae3142015-07-31 17:10:52 +0800141 /* [4:4]: RG_INT_EN_BAT_L; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800142 pwrap_write_field(PMIC_RG_INT_CON0, 0x1, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800143 /* [11:11]: RG_INT_EN_VGPU; OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800144 pwrap_write_field(PMIC_RG_INT_CON1, 0x1, 0x1, 11);
henryc.chen31ae3142015-07-31 17:10:52 +0800145 /* [8:8]: RG_INT_EN_VCA15; OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800146 pwrap_write_field(PMIC_RG_INT_CON1, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800147 /* [12:0]: BUCK_RSV; for OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800148 pwrap_write_field(PMIC_RG_BUCK_CON3, 0x600, 0x0FFF, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800149 /* [11:10]: QI_VCORE_VSLEEP; sleep mode only (0.7V) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800150 pwrap_write_field(PMIC_RG_BUCK_CON8, 0x0, 0x3, 10);
henryc.chen31ae3142015-07-31 17:10:52 +0800151 /* [7:6]: QI_VSRMCA7_VSLEEP; sleep mode only (0.85V) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800152 pwrap_write_field(PMIC_RG_BUCK_CON8, 0x0, 0x3, 6);
henryc.chen31ae3142015-07-31 17:10:52 +0800153 /* [5:4]: QI_VSRMCA15_VSLEEP; sleep mode only (0.7V) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800154 pwrap_write_field(PMIC_RG_BUCK_CON8, 0x1, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800155 /* [3:2]: QI_VPCA7_VSLEEP; sleep mode only (0.85V) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800156 pwrap_write_field(PMIC_RG_BUCK_CON8, 0x0, 0x3, 2);
henryc.chen31ae3142015-07-31 17:10:52 +0800157 /* [1:0]: QI_VCA15_VSLEEP; sleep mode only (0.7V) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800158 pwrap_write_field(PMIC_RG_BUCK_CON8, 0x1, 0x3, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800159 /* [13:12]: RG_VCA15_CSL2; for OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800160 pwrap_write_field(PMIC_RG_VCA15_CON1, 0x0, 0x3, 12);
henryc.chen31ae3142015-07-31 17:10:52 +0800161 /* [11:10]: RG_VCA15_CSL1; for OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800162 pwrap_write_field(PMIC_RG_VCA15_CON1, 0x0, 0x3, 10);
henryc.chen31ae3142015-07-31 17:10:52 +0800163 /* [15:15]: VCA15_SFCHG_REN; soft change rising enable */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800164 pwrap_write_field(PMIC_RG_VCA15_CON8, 0x1, 0x1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +0800165 /* [14:8]: VCA15_SFCHG_RRATE; soft change rising step=0.5 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800166 pwrap_write_field(PMIC_RG_VCA15_CON8, 0x5, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800167 /* [7:7]: VCA15_SFCHG_FEN; soft change falling enable */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800168 pwrap_write_field(PMIC_RG_VCA15_CON8, 0x1, 0x1, 7);
henryc.chen31ae3142015-07-31 17:10:52 +0800169 /* [6:0]: VCA15_SFCHG_FRATE; soft change falling step=2us */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800170 pwrap_write_field(PMIC_RG_VCA15_CON8, 0x17, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800171 /* [6:0]: VCA15_VOSEL_SLEEP; sleep mode only (0.7V) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800172 pwrap_write_field(PMIC_RG_VCA15_CON11, 0x0, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800173 /* [8:8]: VCA15_VSLEEP_EN; set sleep mode reference volt */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800174 pwrap_write_field(PMIC_RG_VCA15_CON18, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800175 /* [5:4]: VCA15_VOSEL_TRANS_EN; rising & falling enable */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800176 pwrap_write_field(PMIC_RG_VCA15_CON18, 0x3, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800177 /* [5:5]: VSRMCA15_TRACK_SLEEP_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800178 pwrap_write_field(PMIC_RG_VSRMCA15_CON5, 0x1, 0x1, 5);
henryc.chen31ae3142015-07-31 17:10:52 +0800179 /* [5:4]: VSRMCA15_VOSEL_SEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800180 pwrap_write_field(PMIC_RG_VSRMCA15_CON6, 0x0, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800181 /* [15:15]: VSRMCA15_SFCHG_REN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800182 pwrap_write_field(PMIC_RG_VSRMCA15_CON8, 0x1, 0x1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +0800183 /* [14:8]: VSRMCA15_SFCHG_RRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800184 pwrap_write_field(PMIC_RG_VSRMCA15_CON8, 0x5, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800185 /* [7:7]: VSRMCA15_SFCHG_FEN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800186 pwrap_write_field(PMIC_RG_VSRMCA15_CON8, 0x1, 0x1, 7);
henryc.chen31ae3142015-07-31 17:10:52 +0800187 /* [6:0]: VSRMCA15_SFCHG_FRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800188 pwrap_write_field(PMIC_RG_VSRMCA15_CON8, 0x17, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800189 /* [6:0]: VSRMCA15_VOSEL_SLEEP; Sleep mode setting on */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800190 pwrap_write_field(PMIC_RG_VSRMCA15_CON11, 0x00, 0x7F, 0);
Elyes HAOUAS1f220a92020-02-20 14:17:55 +0100191 /* [8:8]: VSRMCA15_VSLEEP_EN; set sleep mode reference */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800192 pwrap_write_field(PMIC_RG_VSRMCA15_CON18, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800193 /* [5:4]: VSRMCA15_VOSEL_TRANS_EN; rising & falling e */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800194 pwrap_write_field(PMIC_RG_VSRMCA15_CON18, 0x3, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800195 /* [1:1]: VCORE_VOSEL_CTRL; sleep mode voltage control fo */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800196 pwrap_write_field(PMIC_RG_VCORE_CON5, 0x1, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800197 /* [5:4]: VCORE_VOSEL_SEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800198 pwrap_write_field(PMIC_RG_VCORE_CON6, 0x0, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800199 /* [15:15]: VCORE_SFCHG_REN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800200 pwrap_write_field(PMIC_RG_VCORE_CON8, 0x1, 0x1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +0800201 /* [14:8]: VCORE_SFCHG_RRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800202 pwrap_write_field(PMIC_RG_VCORE_CON8, 0x5, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800203 /* [6:0]: VCORE_SFCHG_FRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800204 pwrap_write_field(PMIC_RG_VCORE_CON8, 0x17, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800205 /* [6:0]: VCORE_VOSEL_SLEEP; Sleep mode setting only (0. */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800206 pwrap_write_field(PMIC_RG_VCORE_CON11, 0x0, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800207 /* [8:8]: VCORE_VSLEEP_EN; Sleep mode HW control R2R to */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800208 pwrap_write_field(PMIC_RG_VCORE_CON18, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800209 /* [5:4]: VCORE_VOSEL_TRANS_EN; Follows MT6320 VCORE set */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800210 pwrap_write_field(PMIC_RG_VCORE_CON18, 0x0, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800211 /* [1:0]: VCORE_TRANSTD; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800212 pwrap_write_field(PMIC_RG_VCORE_CON18, 0x3, 0x3, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800213 /* [9:8]: RG_VGPU_CSL; for OC protection */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800214 pwrap_write_field(PMIC_RG_VGPU_CON1, 0x1, 0x3, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800215 /* [15:15]: VGPU_SFCHG_REN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800216 pwrap_write_field(PMIC_RG_VGPU_CON8, 0x1, 0x1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +0800217 /* [14:8]: VGPU_SFCHG_RRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800218 pwrap_write_field(PMIC_RG_VGPU_CON8, 0x5, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800219 /* [6:0]: VGPU_SFCHG_FRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800220 pwrap_write_field(PMIC_RG_VGPU_CON8, 0x17, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800221 /* [5:4]: VGPU_VOSEL_TRANS_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800222 pwrap_write_field(PMIC_RG_VGPU_CON18, 0x0, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800223 /* [1:0]: VGPU_TRANSTD; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800224 pwrap_write_field(PMIC_RG_VGPU_CON18, 0x3, 0x3, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800225 /* [5:4]: VPCA7_VOSEL_SEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800226 pwrap_write_field(PMIC_RG_VPCA7_CON6, 0x0, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800227 /* [15:15]: VPCA7_SFCHG_REN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800228 pwrap_write_field(PMIC_RG_VPCA7_CON8, 0x1, 0x1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +0800229 /* [14:8]: VPCA7_SFCHG_RRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800230 pwrap_write_field(PMIC_RG_VPCA7_CON8, 0x5, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800231 /* [7:7]: VPCA7_SFCHG_FEN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800232 pwrap_write_field(PMIC_RG_VPCA7_CON8, 0x1, 0x1, 7);
henryc.chen31ae3142015-07-31 17:10:52 +0800233 /* [6:0]: VPCA7_SFCHG_FRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800234 pwrap_write_field(PMIC_RG_VPCA7_CON8, 0x17, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800235 /* [6:0]: VPCA7_VOSEL_SLEEP; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800236 pwrap_write_field(PMIC_RG_VPCA7_CON11, 0x18, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800237 /* [8:8]: VPCA7_VSLEEP_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800238 pwrap_write_field(PMIC_RG_VPCA7_CON18, 0x0, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800239 /* [5:4]: VPCA7_VOSEL_TRANS_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800240 pwrap_write_field(PMIC_RG_VPCA7_CON18, 0x3, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800241 /* [5:5]: VSRMCA7_TRACK_SLEEP_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800242 pwrap_write_field(PMIC_RG_VSRMCA7_CON5, 0x0, 0x1, 5);
henryc.chen31ae3142015-07-31 17:10:52 +0800243 /* [5:4]: VSRMCA7_VOSEL_SEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800244 pwrap_write_field(PMIC_RG_VSRMCA7_CON6, 0x0, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800245 /* [15:15]: VSRMCA7_SFCHG_REN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800246 pwrap_write_field(PMIC_RG_VSRMCA7_CON8, 0x1, 0x1, 15);
henryc.chen31ae3142015-07-31 17:10:52 +0800247 /* [14:8]: VSRMCA7_SFCHG_RRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800248 pwrap_write_field(PMIC_RG_VSRMCA7_CON8, 0x5, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800249 /* [7:7]: VSRMCA7_SFCHG_FEN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800250 pwrap_write_field(PMIC_RG_VSRMCA7_CON8, 0x1, 0x1, 7);
henryc.chen31ae3142015-07-31 17:10:52 +0800251 /* [6:0]: VSRMCA7_SFCHG_FRATE; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800252 pwrap_write_field(PMIC_RG_VSRMCA7_CON8, 0x17, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800253 /* [6:0]: VSRMCA7_VOSEL_SLEEP; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800254 pwrap_write_field(PMIC_RG_VSRMCA7_CON11, 0x18, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800255 /* [8:8]: VSRMCA7_VSLEEP_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800256 pwrap_write_field(PMIC_RG_VSRMCA7_CON18, 0x0, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800257 /* [5:4]: VSRMCA7_VOSEL_TRANS_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800258 pwrap_write_field(PMIC_RG_VSRMCA7_CON18, 0x3, 0x3, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800259 /* [8:8]: VDRM_VSLEEP_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800260 pwrap_write_field(PMIC_RG_VDRM_CON18, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800261 /* [2:2]: VIBR_THER_SHEN_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800262 pwrap_write_field(PMIC_RG_DIGLDO_CON24, 0x1, 0x1, 2);
henryc.chen31ae3142015-07-31 17:10:52 +0800263 /* [5:5]: THR_HWPDN_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800264 pwrap_write_field(PMIC_RG_STRUP_CON0, 0x1, 0x1, 5);
henryc.chen31ae3142015-07-31 17:10:52 +0800265 /* [3:3]: RG_RST_DRVSEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800266 pwrap_write_field(PMIC_RG_STRUP_CON2, 0x1, 0x1, 3);
henryc.chen31ae3142015-07-31 17:10:52 +0800267 /* [2:2]: RG_EN_DRVSEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800268 pwrap_write_field(PMIC_RG_STRUP_CON2, 0x1, 0x1, 2);
henryc.chen31ae3142015-07-31 17:10:52 +0800269 /* [1:1]: PWRBB_DEB_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800270 pwrap_write_field(PMIC_RG_STRUP_CON5, 0x1, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800271 /* [12:12]: VSRMCA15_PG_H2L_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800272 pwrap_write_field(PMIC_RG_STRUP_CON7, 0x1, 0x1, 12);
henryc.chen31ae3142015-07-31 17:10:52 +0800273 /* [11:11]: VPCA15_PG_H2L_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800274 pwrap_write_field(PMIC_RG_STRUP_CON7, 0x1, 0x1, 11);
henryc.chen31ae3142015-07-31 17:10:52 +0800275 /* [10:10]: VCORE_PG_H2L_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800276 pwrap_write_field(PMIC_RG_STRUP_CON7, 0x1, 0x1, 10);
henryc.chen31ae3142015-07-31 17:10:52 +0800277 /* [9:9]: VSRMCA7_PG_H2L_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800278 pwrap_write_field(PMIC_RG_STRUP_CON7, 0x1, 0x1, 9);
henryc.chen31ae3142015-07-31 17:10:52 +0800279 /* [8:8]: VPCA7_PG_H2L_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800280 pwrap_write_field(PMIC_RG_STRUP_CON7, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800281 /* [1:1]: STRUP_PWROFF_PREOFF_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800282 pwrap_write_field(PMIC_RG_STRUP_CON10, 0x1, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800283 /* [0:0]: STRUP_PWROFF_SEQ_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800284 pwrap_write_field(PMIC_RG_STRUP_CON10, 0x1, 0x1, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800285 /* [15:8]: RG_ADC_TRIM_CH_SEL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800286 pwrap_write_field(PMIC_RG_AUXADC_CON14, 0xFC, 0xFF, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800287 /* [1:1]: FLASH_THER_SHDN_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800288 pwrap_write_field(PMIC_RG_FLASH_CON0, 0x1, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800289 /* [1:1]: KPLED_THER_SHDN_EN; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800290 pwrap_write_field(PMIC_RG_KPLED_CON0, 0x1, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800291 /* [14:8]: VSRMCA15_VOSEL_OFFSET; set offset=100mV */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800292 pwrap_write_field(PMIC_RG_VSRMCA15_CON19, 0x10, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800293 /* [6:0]: VSRMCA15_VOSEL_DELTA; set delta=0mV */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800294 pwrap_write_field(PMIC_RG_VSRMCA15_CON19, 0x0, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800295 /* [14:8]: VSRMCA15_VOSEL_ON_HB; set HB=1.15V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800296 pwrap_write_field(PMIC_RG_VSRMCA15_CON20, 0x48, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800297 /* [6:0]: VSRMCA15_VOSEL_ON_LB; set LB=0.7V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800298 pwrap_write_field(PMIC_RG_VSRMCA15_CON20, 0x0, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800299 /* [6:0]: VSRMCA15_VOSEL_SLEEP_LB; set sleep LB=0.7V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800300 pwrap_write_field(PMIC_RG_VSRMCA15_CON21, 0x0, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800301 /* [14:8]: VSRMCA7_VOSEL_OFFSET; set offset=25mV */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800302 pwrap_write_field(PMIC_RG_VSRMCA7_CON19, 0x4, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800303 /* [6:0]: VSRMCA7_VOSEL_DELTA; set delta=0mV */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800304 pwrap_write_field(PMIC_RG_VSRMCA7_CON19, 0x0, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800305 /* [14:8]: VSRMCA7_VOSEL_ON_HB; set HB=1.275V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800306 pwrap_write_field(PMIC_RG_VSRMCA7_CON20, 0x5C, 0x7F, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800307 /* [6:0]: VSRMCA7_VOSEL_ON_LB; set LB=1.05000V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800308 pwrap_write_field(PMIC_RG_VSRMCA7_CON20, 0x38, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800309 /* [6:0]: VSRMCA7_VOSEL_SLEEP_LB; set sleep LB=0.85000 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800310 pwrap_write_field(PMIC_RG_VSRMCA7_CON21, 0x18, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800311 /* [1:1]: VCA15_VOSEL_CTRL, VCA15_EN_CTRL; DVS HW control */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800312 pwrap_write_field(PMIC_RG_VCA15_CON5, 0x3, 0x3, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800313 /* [1:1]: VSRMCA15_VOSEL_CTRL, VSRAM15_EN_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800314 pwrap_write_field(PMIC_RG_VSRMCA15_CON5, 0x3, 0x3, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800315 /* [1:1]: VPCA7_VOSEL_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800316 pwrap_write_field(PMIC_RG_VPCA7_CON5, 0x0, 0x1, 1);
henryc.chen31ae3142015-07-31 17:10:52 +0800317 /* [1:1]: VSRMCA7_VOSEL_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800318 pwrap_write_field(PMIC_RG_VSRMCA7_CON5, 0x0, 0x1, 1);
henryc.chenaad29032016-03-07 15:17:01 +0800319 /* [0:0]: VSRMCA7_EN_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800320 pwrap_write_field(PMIC_RG_VSRMCA7_CON5, 0x1, 0x1, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800321 /* [4:4]: VCA15_TRACK_ON_CTRL; DVFS tracking enable */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800322 pwrap_write_field(PMIC_RG_VCA15_CON5, 0x1, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800323 /* [4:4]: VSRMCA15_TRACK_ON_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800324 pwrap_write_field(PMIC_RG_VSRMCA15_CON5, 0x1, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800325 /* [4:4]: VPCA7_TRACK_ON_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800326 pwrap_write_field(PMIC_RG_VPCA7_CON5, 0x0, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800327 /* [4:4]: VSRMCA7_TRACK_ON_CTRL; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800328 pwrap_write_field(PMIC_RG_VSRMCA7_CON5, 0x0, 0x1, 4);
henryc.chen31ae3142015-07-31 17:10:52 +0800329 /* [15:14]: VGPU OC; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800330 pwrap_write_field(PMIC_RG_OC_CTL1, 0x3, 0x3, 14);
henryc.chen31ae3142015-07-31 17:10:52 +0800331 /* [3:2]: VCA15 OC; */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800332 pwrap_write_field(PMIC_RG_OC_CTL1, 0x3, 0x3, 2);
henryc.chen31ae3142015-07-31 17:10:52 +0800333
334 /* Set VPCA7 to 1.2V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800335 pwrap_write_field(PMIC_RG_VPCA7_CON9, 0x50, 0x7f, 0x0);
336 pwrap_write_field(PMIC_RG_VPCA7_CON10, 0x50, 0x7f, 0x0);
henryc.chen31ae3142015-07-31 17:10:52 +0800337 /* Set VSRMCA7 to 1.1V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800338 pwrap_write_field(PMIC_RG_VSRMCA7_CON9, 0x40, 0x7f, 0x0);
339 pwrap_write_field(PMIC_RG_VSRMCA7_CON10, 0x40, 0x7f, 0x0);
henryc.chen31ae3142015-07-31 17:10:52 +0800340
341 /* Enable VGP6 and set to 3.3V*/
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800342 pwrap_write_field(PMIC_RG_DIGLDO_CON10, 0x1, 0x1, 15);
343 pwrap_write_field(PMIC_RG_DIGLDO_CON33, 0x07, 0x07, 5);
henryc.chen31ae3142015-07-31 17:10:52 +0800344
345 /* Set VDRM to 1.21875V */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800346 pwrap_write_field(PMIC_RG_VDRM_CON9, 0x43, 0x7F, 0);
347 pwrap_write_field(PMIC_RG_VDRM_CON10, 0x43, 0x7F, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800348
Elyes HAOUAS1f220a92020-02-20 14:17:55 +0100349 /* 26M clock amplitude adjust */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800350 pwrap_write_field(PMIC_RG_DCXO_ANALOG_CON1, 0x0, 0x3, 2);
351 pwrap_write_field(PMIC_RG_DCXO_ANALOG_CON1, 0x1, 0x3, 11);
henryc.chen31ae3142015-07-31 17:10:52 +0800352
353 /* For low power, set VTCXO switch by SRCVOLTEN */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800354 pwrap_write_field(PMIC_RG_DIGLDO_CON27, 0x0100, 0x0100, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800355 /* [6:5]=0(VTCXO_SRCLK_MODE_SEL) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800356 pwrap_write_field(PMIC_RG_ANALDO_CON0, 0, 0x3, 13);
henryc.chen31ae3142015-07-31 17:10:52 +0800357 /* [11]=0(VTCXO_ON_CTRL), */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800358 pwrap_write_field(PMIC_RG_ANALDO_CON0, 1, 0x1, 11);
henryc.chen31ae3142015-07-31 17:10:52 +0800359 /* [10]=1(RG_VTCXO_EN), */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800360 pwrap_write_field(PMIC_RG_ANALDO_CON0, 1, 0x1, 10);
henryc.chen31ae3142015-07-31 17:10:52 +0800361 /* [4:3]=1(RG_VTCXOTD_SEL) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800362 pwrap_write_field(PMIC_RG_ANALDO_CON0, 0x3, 0x3, 3);
henryc.chen31ae3142015-07-31 17:10:52 +0800363 /* For low power, VIO18 set sleep_en to HW mode */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800364 pwrap_write_field(PMIC_RG_VIO18_CON18, 0x1, 0x1, 8);
henryc.chen31ae3142015-07-31 17:10:52 +0800365
366}
367
368static void mt6391_default_buck_voltage(void)
369{
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800370 u16 reg = 0;
371 u16 buck = 0;
Paul Menzel454cfa02017-10-24 15:38:51 +0200372 /*
373 * There are two kinds of PMIC used for MT8173 : MT6397s/MT6391.
374 *
henryc.chen31ae3142015-07-31 17:10:52 +0800375 * MT6397s: the default voltage of register was not suitable for
376 * MT8173, needs to apply the setting of eFuse.
377 * VPCA15/VSRMCA15/: 1.15V
378 * VCORE: 1.05V
379 *
380 * MT6391: the default voltage of register was matched for MT8173.
381 * VPAC15/VCORE/VGPU: 1.0V
382 * VSRMCA15: 1.0125V
383 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800384 reg = pwrap_read_field(PMIC_RG_EFUSE_DOUT_288_303, 0xFFFF, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800385
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800386 if ((reg & 0x01) == 0x01) {
henryc.chen31ae3142015-07-31 17:10:52 +0800387 /* VCORE */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800388 reg = pwrap_read_field(PMIC_RG_EFUSE_DOUT_256_271, 0xF, 12);
389 buck = pwrap_read_field(PMIC_RG_VCORE_CON9, 0x7f, 0x0);
henryc.chen31ae3142015-07-31 17:10:52 +0800390
391 /* VCORE_VOSEL[3:6] => eFuse bit 268-271 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800392 buck = (buck & 0x07) | (reg << 3);
393 pwrap_write_field(PMIC_RG_VCORE_CON9, buck, 0x7f, 0x0);
394 pwrap_write_field(PMIC_RG_VCORE_CON10, buck, 0x7f, 0x0);
henryc.chen31ae3142015-07-31 17:10:52 +0800395
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800396 reg = pwrap_read_field(PMIC_RG_EFUSE_DOUT_272_287, 0xFFFF, 0);
henryc.chen31ae3142015-07-31 17:10:52 +0800397 /* VCA15 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800398 buck = 0;
399 buck = pwrap_read_field(PMIC_RG_VCA15_CON9, 0x7f, 0x0);
400 buck = (buck & 0x07) | ((reg & 0x0F) << 3);
401 pwrap_write_field(PMIC_RG_VCA15_CON9, buck, 0x7f, 0x0);
402 pwrap_write_field(PMIC_RG_VCA15_CON10, buck, 0x7f, 0x0);
henryc.chen31ae3142015-07-31 17:10:52 +0800403
404 /* VSAMRCA15 */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800405 buck = 0;
406 buck = pwrap_read_field(PMIC_RG_VSRMCA15_CON9, 0x7f, 0x0);
407 buck = (buck & 0x07) | ((reg & 0xF0) >> 1);
408 pwrap_write_field(PMIC_RG_VSRMCA15_CON9, buck, 0x7f, 0x0);
409 pwrap_write_field(PMIC_RG_VSRMCA15_CON10, buck, 0x7f, 0x0);
henryc.chen31ae3142015-07-31 17:10:52 +0800410
411 /* set the power control by register(use original) */
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800412 pwrap_write_field(PMIC_RG_BUCK_CON3, 0x1, 0x1, 12);
henryc.chen31ae3142015-07-31 17:10:52 +0800413 }
414}
415
416void mt6391_init(void)
417{
418 if (pwrap_init())
Paul Menzel22db82d2017-10-24 15:40:18 +0200419 die("ERROR - Failed to initialize pmic wrap!");
henryc.chen31ae3142015-07-31 17:10:52 +0800420 /* pmic initial setting */
421 mt6391_init_setting();
422
423 /* Adjust default BUCK voltage from eFuse */
424 mt6391_default_buck_voltage();
425}
Biao Huang0dd83152015-09-03 17:39:12 +0800426
427/* API of GPIO in PMIC MT6391 */
428enum {
429 MAX_GPIO_REG_BITS = 16,
430 MAX_GPIO_MODE_PER_REG = 5,
431 GPIO_MODE_BITS = 3,
432 GPIO_PORT_OFFSET = 3,
433 GPIO_SET_OFFSET = 2,
434 GPIO_RST_OFFSET = 4,
435 MAX_MT6391_GPIO = 40
436};
437
438enum {
439 MT6391_GPIO_DIRECTION_IN = 0,
440 MT6391_GPIO_DIRECTION_OUT = 1,
441};
442
443enum {
444 MT6391_GPIO_MODE = 0,
445};
446
447static void pos_bit_calc(u32 pin, u16 *pos, u16 *bit)
448{
449 *pos = (pin / MAX_GPIO_REG_BITS) << GPIO_PORT_OFFSET;
450 *bit = pin % MAX_GPIO_REG_BITS;
451}
452
453static void pos_bit_calc_mode(u32 pin, u16 *pos, u16 *bit)
454{
455 *pos = (pin / MAX_GPIO_MODE_PER_REG) << GPIO_PORT_OFFSET;
456 *bit = (pin % MAX_GPIO_MODE_PER_REG) * GPIO_MODE_BITS;
457}
458
459static s32 mt6391_gpio_set_dir(u32 pin, u32 dir)
460{
461 u16 pos;
462 u16 bit;
463 u16 reg;
464
465 assert(pin <= MAX_MT6391_GPIO);
466
467 pos_bit_calc(pin, &pos, &bit);
468
469 if (dir == MT6391_GPIO_DIRECTION_IN)
470 reg = MT6391_GPIO_DIR_BASE + pos + GPIO_RST_OFFSET;
471 else
472 reg = MT6391_GPIO_DIR_BASE + pos + GPIO_SET_OFFSET;
473
474 if (pwrap_write(reg, 1L << bit) != 0)
475 return -1;
476
477 return 0;
478}
479
480void mt6391_gpio_set_pull(u32 pin, enum mt6391_pull_enable enable,
481 enum mt6391_pull_select select)
482{
483 u16 pos;
484 u16 bit;
485 u16 en_reg, sel_reg;
486
487 assert(pin <= MAX_MT6391_GPIO);
488
489 pos_bit_calc(pin, &pos, &bit);
490
491 if (enable == MT6391_GPIO_PULL_DISABLE) {
492 en_reg = MT6391_GPIO_PULLEN_BASE + pos + GPIO_RST_OFFSET;
493 } else {
494 en_reg = MT6391_GPIO_PULLEN_BASE + pos + GPIO_SET_OFFSET;
495 sel_reg = (select == MT6391_GPIO_PULL_DOWN) ?
496 (MT6391_GPIO_PULLSEL_BASE + pos + GPIO_RST_OFFSET) :
497 (MT6391_GPIO_PULLSEL_BASE + pos + GPIO_SET_OFFSET);
498 pwrap_write(sel_reg, 1L << bit);
499 }
500 pwrap_write(en_reg, 1L << bit);
501}
502
503int mt6391_gpio_get(u32 pin)
504{
505 u16 pos;
506 u16 bit;
507 u16 reg;
508 u16 data;
509
510 assert(pin <= MAX_MT6391_GPIO);
511
512 pos_bit_calc(pin, &pos, &bit);
513
514 reg = MT6391_GPIO_DIN_BASE + pos;
515 pwrap_read(reg, &data);
516
517 return (data & (1L << bit)) ? 1 : 0;
518}
519
520void mt6391_gpio_set(u32 pin, int output)
521{
522 u16 pos;
523 u16 bit;
524 u16 reg;
525
526 assert(pin <= MAX_MT6391_GPIO);
527
528 pos_bit_calc(pin, &pos, &bit);
529
530 if (output == 0)
531 reg = MT6391_GPIO_DOUT_BASE + pos + GPIO_RST_OFFSET;
532 else
533 reg = MT6391_GPIO_DOUT_BASE + pos + GPIO_SET_OFFSET;
534
535 pwrap_write(reg, 1L << bit);
536}
537
538void mt6391_gpio_set_mode(u32 pin, int mode)
539{
540 u16 pos;
541 u16 bit;
542 u16 mask = (1L << GPIO_MODE_BITS) - 1;
543
544 assert(pin <= MAX_MT6391_GPIO);
545
546 pos_bit_calc_mode(pin, &pos, &bit);
Tristan Shiehab1b83d2018-11-01 18:01:50 +0800547 pwrap_write_field(MT6391_GPIO_MODE_BASE + pos, mode, mask, bit);
Biao Huang0dd83152015-09-03 17:39:12 +0800548}
549
550void mt6391_gpio_input_pulldown(u32 gpio)
551{
552 mt6391_gpio_set_pull(gpio, MT6391_GPIO_PULL_ENABLE,
553 MT6391_GPIO_PULL_DOWN);
554 mt6391_gpio_set_dir(gpio, MT6391_GPIO_DIRECTION_IN);
555 mt6391_gpio_set_mode(gpio, MT6391_GPIO_MODE);
556}
557
558void mt6391_gpio_input_pullup(u32 gpio)
559{
560 mt6391_gpio_set_pull(gpio, MT6391_GPIO_PULL_ENABLE,
561 MT6391_GPIO_PULL_UP);
562 mt6391_gpio_set_dir(gpio, MT6391_GPIO_DIRECTION_IN);
563 mt6391_gpio_set_mode(gpio, MT6391_GPIO_MODE);
564}
565
566void mt6391_gpio_input(u32 gpio)
567{
568 mt6391_gpio_set_pull(gpio, MT6391_GPIO_PULL_DISABLE,
569 MT6391_GPIO_PULL_DOWN);
570 mt6391_gpio_set_dir(gpio, MT6391_GPIO_DIRECTION_IN);
571 mt6391_gpio_set_mode(gpio, MT6391_GPIO_MODE);
572}
573
574void mt6391_gpio_output(u32 gpio, int value)
575{
576 mt6391_gpio_set_pull(gpio, MT6391_GPIO_PULL_DISABLE,
577 MT6391_GPIO_PULL_DOWN);
578 mt6391_gpio_set(gpio, value);
579 mt6391_gpio_set_dir(gpio, MT6391_GPIO_DIRECTION_OUT);
580 mt6391_gpio_set_mode(gpio, MT6391_GPIO_MODE);
581}