1*01ce1d5dSWenzhen Yu /*
2*01ce1d5dSWenzhen Yu * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*01ce1d5dSWenzhen Yu *
4*01ce1d5dSWenzhen Yu * SPDX-License-Identifier: BSD-3-Clause
5*01ce1d5dSWenzhen Yu */
6*01ce1d5dSWenzhen Yu
7*01ce1d5dSWenzhen Yu #include <stdbool.h>
8*01ce1d5dSWenzhen Yu
9*01ce1d5dSWenzhen Yu #include <lib/mmio.h>
10*01ce1d5dSWenzhen Yu #include <platform_def.h>
11*01ce1d5dSWenzhen Yu
12*01ce1d5dSWenzhen Yu #include <mt_plat_spm_setting.h>
13*01ce1d5dSWenzhen Yu #include <mt_spm.h>
14*01ce1d5dSWenzhen Yu #include <mt_spm_internal.h>
15*01ce1d5dSWenzhen Yu #include <mt_spm_reg.h>
16*01ce1d5dSWenzhen Yu #include <pmic_wrap/inc/mt_spm_pmic_wrap.h>
17*01ce1d5dSWenzhen Yu
18*01ce1d5dSWenzhen Yu /*
19*01ce1d5dSWenzhen Yu * BIT Operation
20*01ce1d5dSWenzhen Yu */
21*01ce1d5dSWenzhen Yu #define CMD_DATA(h, l, v) ((GENMASK(h, l) & ((v) << (l))))
22*01ce1d5dSWenzhen Yu #define VOLT_DATA(v) CMD_DATA(7, 0, VOLT_TO_PMIC_VAL(v))
23*01ce1d5dSWenzhen Yu /*
24*01ce1d5dSWenzhen Yu * PMIC_WRAP
25*01ce1d5dSWenzhen Yu */
26*01ce1d5dSWenzhen Yu #define VCORE_BASE_UV 0 /* PMIC MT6316 */
27*01ce1d5dSWenzhen Yu #define VOLT_TO_PMIC_VAL(volt) (((volt) - VCORE_BASE_UV + 500 - 1) / 500)
28*01ce1d5dSWenzhen Yu #define PMIC_VAL_TO_VOLT(pmic) (((pmic) * 500) + VCORE_BASE_UV)
29*01ce1d5dSWenzhen Yu
30*01ce1d5dSWenzhen Yu #define NR_PMIC_WRAP_CMD NR_IDX_ALL
31*01ce1d5dSWenzhen Yu #define MAX_RETRY_COUNT 100
32*01ce1d5dSWenzhen Yu #define SPM_DATA_SHIFT 16
33*01ce1d5dSWenzhen Yu
34*01ce1d5dSWenzhen Yu /* MT6316 */
35*01ce1d5dSWenzhen Yu #define MT6316_TOP_VRCTL_VOSEL_VBUCK1 0x1448
36*01ce1d5dSWenzhen Yu #define MT6316_VCORE_VBUCK1_ON 0x1441
37*01ce1d5dSWenzhen Yu #define MT6316_VCORE_VBUCK1_OFF 0x1442
38*01ce1d5dSWenzhen Yu
39*01ce1d5dSWenzhen Yu static struct pmic_wrap_cmd_setting cmd_table[NR_PMIC_WRAP_CMD] = {
40*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD0, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(57500)},
41*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD1, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(57500)},
42*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD2, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(60000)},
43*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD3, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(65000)},
44*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD4, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(72500)},
45*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD5, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(72500)},
46*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD6, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(82500)},
47*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD7, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(87500)},
48*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD8, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(87500)},
49*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD9, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(57500)},
50*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD10, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(60000)},
51*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD11, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(65000)},
52*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD12, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(72500)},
53*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD13, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(82500)},
54*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD14, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(87500)},
55*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD15, MT6316_VCORE_VBUCK1_ON, 1},
56*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD16, MT6316_VCORE_VBUCK1_OFF, 1},
57*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD17, MT6316_TOP_VRCTL_VOSEL_VBUCK1, VOLT_DATA(75000)},
58*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD18, 0, 0},
59*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD19, 0, 0},
60*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD20, 0, 0},
61*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD21, 0, 0},
62*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD22, 0, 0},
63*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD23, 0, 0},
64*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD24, 0, 0},
65*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD25, 0, 0},
66*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD26, 0, 0},
67*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD27, 0, 0},
68*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD28, 0, 0},
69*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD29, 0, 0},
70*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD30, 0, 0},
71*01ce1d5dSWenzhen Yu {SPM_PWRAP_CMD31, 0, 0},
72*01ce1d5dSWenzhen Yu };
73*01ce1d5dSWenzhen Yu
74*01ce1d5dSWenzhen Yu static struct pmic_wrap_phase_setting phase_table[NR_PMIC_WRAP_PHASE] = {
75*01ce1d5dSWenzhen Yu {
76*01ce1d5dSWenzhen Yu .cmd = cmd_table,
77*01ce1d5dSWenzhen Yu .nr_idx = NR_IDX_ALL,
78*01ce1d5dSWenzhen Yu },
79*01ce1d5dSWenzhen Yu };
80*01ce1d5dSWenzhen Yu
81*01ce1d5dSWenzhen Yu static struct pmic_wrap_setting pmic_wrap_table = {
82*01ce1d5dSWenzhen Yu .phase = phase_table,
83*01ce1d5dSWenzhen Yu .phase_nr_idx = NR_PMIC_WRAP_PHASE,
84*01ce1d5dSWenzhen Yu };
85*01ce1d5dSWenzhen Yu
plat_spm_pmic_wrap_init(void)86*01ce1d5dSWenzhen Yu void plat_spm_pmic_wrap_init(void)
87*01ce1d5dSWenzhen Yu {
88*01ce1d5dSWenzhen Yu mt_spm_pmic_wrap_set_table(&pmic_wrap_table);
89*01ce1d5dSWenzhen Yu mt_spm_pmic_wrap_set_phase(PMIC_WRAP_PHASE_ALLINONE);
90*01ce1d5dSWenzhen Yu }
91