1*3da2d29cSRaymond Sun /*
2*3da2d29cSRaymond Sun * Copyright (c) 2025, MediaTek Inc. All rights reserved.
3*3da2d29cSRaymond Sun *
4*3da2d29cSRaymond Sun * SPDX-License-Identifier: BSD-3-Clause
5*3da2d29cSRaymond Sun */
6*3da2d29cSRaymond Sun
7*3da2d29cSRaymond Sun #include <errno.h>
8*3da2d29cSRaymond Sun #include <stdint.h>
9*3da2d29cSRaymond Sun #include <stdio.h>
10*3da2d29cSRaymond Sun #include <common/debug.h>
11*3da2d29cSRaymond Sun #include <drivers/delay_timer.h>
12*3da2d29cSRaymond Sun #include <lib/mmio.h>
13*3da2d29cSRaymond Sun #include <lib/mmio_poll.h>
14*3da2d29cSRaymond Sun #include <lib/utils_def.h>
15*3da2d29cSRaymond Sun
16*3da2d29cSRaymond Sun #include <lib/mtk_init/mtk_init.h>
17*3da2d29cSRaymond Sun #include <lpm/mt_lp_api.h>
18*3da2d29cSRaymond Sun #include <mt_spm_reg.h>
19*3da2d29cSRaymond Sun #include <mtk_mmap_pool.h>
20*3da2d29cSRaymond Sun #include <soc_temp_lvts.h>
21*3da2d29cSRaymond Sun #include <soc_temp_lvts_interface.h>
22*3da2d29cSRaymond Sun #include <thermal_lvts.h>
23*3da2d29cSRaymond Sun
24*3da2d29cSRaymond Sun enum mt8189_lvts_domain {
25*3da2d29cSRaymond Sun MT8189_AP_DOMAIN,
26*3da2d29cSRaymond Sun MT8189_MCU_DOMAIN,
27*3da2d29cSRaymond Sun MT8189_NUM_DOMAIN
28*3da2d29cSRaymond Sun };
29*3da2d29cSRaymond Sun
30*3da2d29cSRaymond Sun enum mt8189_lvts_controller_enum {
31*3da2d29cSRaymond Sun MT8189_LVTS_MCU_CTRL0,
32*3da2d29cSRaymond Sun MT8189_LVTS_MCU_CTRL1,
33*3da2d29cSRaymond Sun MT8189_LVTS_MCU_CTRL2,
34*3da2d29cSRaymond Sun MT8189_LVTS_AP_CTRL0,
35*3da2d29cSRaymond Sun MT8189_LVTS_GPU_CTRL0,
36*3da2d29cSRaymond Sun MT8189_LVTS_CTRL_NUM
37*3da2d29cSRaymond Sun };
38*3da2d29cSRaymond Sun
39*3da2d29cSRaymond Sun #define THERMAL_CSRAM_BASE_MAP_ADDR (THERMAL_CSRAM_BASE & ~(PAGE_SIZE - 1))
40*3da2d29cSRaymond Sun static const mmap_region_t thermal_mmap[] MTK_MMAP_SECTION = {
41*3da2d29cSRaymond Sun MAP_REGION_FLAT(THERM_CTRL_AP_BASE, THERM_AP_REG_SIZE,
42*3da2d29cSRaymond Sun MT_DEVICE | MT_RW | MT_SECURE),
43*3da2d29cSRaymond Sun MAP_REGION_FLAT(THERM_CTRL_MCU_BASE, THERM_MCU_REG_SIZE,
44*3da2d29cSRaymond Sun MT_DEVICE | MT_RW | MT_SECURE),
45*3da2d29cSRaymond Sun MAP_REGION_FLAT(THERMAL_CSRAM_BASE_MAP_ADDR, PAGE_SIZE,
46*3da2d29cSRaymond Sun MT_DEVICE | MT_RW | MT_SECURE),
47*3da2d29cSRaymond Sun MAP_REGION_FLAT(INFRACFG_BASE, PAGE_SIZE,
48*3da2d29cSRaymond Sun MT_DEVICE | MT_RW | MT_SECURE),
49*3da2d29cSRaymond Sun {0}
50*3da2d29cSRaymond Sun };
51*3da2d29cSRaymond Sun DECLARE_MTK_MMAP_REGIONS(thermal_mmap);
52*3da2d29cSRaymond Sun
disable_hw_reboot_interrupt(struct lvts_data * lvts_data,unsigned int tc_id)53*3da2d29cSRaymond Sun void disable_hw_reboot_interrupt(struct lvts_data *lvts_data,
54*3da2d29cSRaymond Sun unsigned int tc_id)
55*3da2d29cSRaymond Sun {
56*3da2d29cSRaymond Sun uint32_t temp;
57*3da2d29cSRaymond Sun uintptr_t base;
58*3da2d29cSRaymond Sun
59*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, tc_id);
60*3da2d29cSRaymond Sun
61*3da2d29cSRaymond Sun /* LVTS thermal controller has two interrupts for thermal HW reboot
62*3da2d29cSRaymond Sun * One is for AP SW and the other is for RGU
63*3da2d29cSRaymond Sun * The interrupt of AP SW can turn off by a bit of a register, but
64*3da2d29cSRaymond Sun * the other for RGU cannot.
65*3da2d29cSRaymond Sun * To prevent rebooting device accidentally, we are going to add
66*3da2d29cSRaymond Sun * a huge offset to LVTS and make LVTS always report extremely low
67*3da2d29cSRaymond Sun * temperature.
68*3da2d29cSRaymond Sun */
69*3da2d29cSRaymond Sun
70*3da2d29cSRaymond Sun /* After adding the huge offset 0x3FFF, LVTS alawys adds the
71*3da2d29cSRaymond Sun * offset to MSR_RAW.
72*3da2d29cSRaymond Sun * When MSR_RAW is larger, SW will convert lower temperature/
73*3da2d29cSRaymond Sun */
74*3da2d29cSRaymond Sun mmio_setbits_32(LVTSPROTCTL_0 + base, 0x3FFF);
75*3da2d29cSRaymond Sun
76*3da2d29cSRaymond Sun /* Disable the interrupt of AP SW */
77*3da2d29cSRaymond Sun temp = mmio_read_32(LVTSMONINT_0 + base);
78*3da2d29cSRaymond Sun
79*3da2d29cSRaymond Sun temp = temp & ~(STAGE3_INT_EN);
80*3da2d29cSRaymond Sun
81*3da2d29cSRaymond Sun if (lvts_data->enable_dump_log) {
82*3da2d29cSRaymond Sun temp = temp & ~(HIGH_OFFSET3_INT_EN |
83*3da2d29cSRaymond Sun HIGH_OFFSET2_INT_EN |
84*3da2d29cSRaymond Sun HIGH_OFFSET1_INT_EN |
85*3da2d29cSRaymond Sun HIGH_OFFSET0_INT_EN);
86*3da2d29cSRaymond Sun
87*3da2d29cSRaymond Sun temp = temp & ~(LOW_OFFSET3_INT_EN |
88*3da2d29cSRaymond Sun LOW_OFFSET2_INT_EN |
89*3da2d29cSRaymond Sun LOW_OFFSET1_INT_EN |
90*3da2d29cSRaymond Sun LOW_OFFSET0_INT_EN);
91*3da2d29cSRaymond Sun }
92*3da2d29cSRaymond Sun
93*3da2d29cSRaymond Sun mmio_write_32(LVTSMONINT_0 + base, temp);
94*3da2d29cSRaymond Sun dmbsy();
95*3da2d29cSRaymond Sun }
96*3da2d29cSRaymond Sun
enable_hw_reboot_interrupt(struct lvts_data * lvts_data,unsigned int tc_id)97*3da2d29cSRaymond Sun void enable_hw_reboot_interrupt(struct lvts_data *lvts_data,
98*3da2d29cSRaymond Sun unsigned int tc_id)
99*3da2d29cSRaymond Sun {
100*3da2d29cSRaymond Sun uint32_t temp;
101*3da2d29cSRaymond Sun uintptr_t base;
102*3da2d29cSRaymond Sun
103*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, tc_id);
104*3da2d29cSRaymond Sun
105*3da2d29cSRaymond Sun /* Enable the interrupt of AP SW */
106*3da2d29cSRaymond Sun temp = mmio_read_32(LVTSMONINT_0 + base);
107*3da2d29cSRaymond Sun
108*3da2d29cSRaymond Sun if (lvts_data->enable_dump_log) {
109*3da2d29cSRaymond Sun temp = temp | HIGH_OFFSET3_INT_EN |
110*3da2d29cSRaymond Sun HIGH_OFFSET2_INT_EN |
111*3da2d29cSRaymond Sun HIGH_OFFSET1_INT_EN |
112*3da2d29cSRaymond Sun HIGH_OFFSET0_INT_EN;
113*3da2d29cSRaymond Sun
114*3da2d29cSRaymond Sun temp = temp | LOW_OFFSET3_INT_EN |
115*3da2d29cSRaymond Sun LOW_OFFSET2_INT_EN |
116*3da2d29cSRaymond Sun LOW_OFFSET1_INT_EN |
117*3da2d29cSRaymond Sun LOW_OFFSET0_INT_EN;
118*3da2d29cSRaymond Sun } else {
119*3da2d29cSRaymond Sun temp = temp | STAGE3_INT_EN;
120*3da2d29cSRaymond Sun }
121*3da2d29cSRaymond Sun
122*3da2d29cSRaymond Sun mmio_write_32(LVTSMONINT_0 + base, temp);
123*3da2d29cSRaymond Sun
124*3da2d29cSRaymond Sun /* Clear the offset */
125*3da2d29cSRaymond Sun mmio_clrbits_32(LVTSPROTCTL_0 + base, PROTOFFSET);
126*3da2d29cSRaymond Sun
127*3da2d29cSRaymond Sun dmbsy();
128*3da2d29cSRaymond Sun }
129*3da2d29cSRaymond Sun
set_tc_hw_reboot_threshold(struct lvts_data * lvts_data,int trip_point,unsigned int tc_id)130*3da2d29cSRaymond Sun void set_tc_hw_reboot_threshold(struct lvts_data *lvts_data, int trip_point,
131*3da2d29cSRaymond Sun unsigned int tc_id)
132*3da2d29cSRaymond Sun {
133*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
134*3da2d29cSRaymond Sun unsigned int msr_raw, cur_msr_raw, d_index, i;
135*3da2d29cSRaymond Sun uint32_t temp, config;
136*3da2d29cSRaymond Sun uintptr_t base;
137*3da2d29cSRaymond Sun struct platform_ops *ops = &lvts_data->ops;
138*3da2d29cSRaymond Sun
139*3da2d29cSRaymond Sun msr_raw = 0;
140*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, tc_id);
141*3da2d29cSRaymond Sun d_index = get_dominator_index(lvts_data, tc_id);
142*3da2d29cSRaymond Sun
143*3da2d29cSRaymond Sun disable_hw_reboot_interrupt(lvts_data, tc_id);
144*3da2d29cSRaymond Sun
145*3da2d29cSRaymond Sun if (tc_id < MT8189_LVTS_CTRL_NUM) {
146*3da2d29cSRaymond Sun temp = mmio_read_32(LVTSPROTCTL_0 + base);
147*3da2d29cSRaymond Sun if (d_index == ALL_SENSING_POINTS) {
148*3da2d29cSRaymond Sun /* Maximum of 4 sensing points */
149*3da2d29cSRaymond Sun config = (0x1 << 16);
150*3da2d29cSRaymond Sun mmio_write_32(LVTSPROTCTL_0 + base, config | temp);
151*3da2d29cSRaymond Sun msr_raw = 0;
152*3da2d29cSRaymond Sun for (i = 0; i < tc[tc_id].num_sensor; i++) {
153*3da2d29cSRaymond Sun cur_msr_raw = ops->lvts_temp_to_raw(
154*3da2d29cSRaymond Sun &(tc[tc_id].coeff), i, trip_point);
155*3da2d29cSRaymond Sun if (msr_raw < cur_msr_raw)
156*3da2d29cSRaymond Sun msr_raw = cur_msr_raw;
157*3da2d29cSRaymond Sun }
158*3da2d29cSRaymond Sun } else {
159*3da2d29cSRaymond Sun /* Select protection sensor */
160*3da2d29cSRaymond Sun config = ((d_index << 2) + 0x2) << 16;
161*3da2d29cSRaymond Sun mmio_write_32(LVTSPROTCTL_0 + base, config | temp);
162*3da2d29cSRaymond Sun msr_raw = ops->lvts_temp_to_raw(
163*3da2d29cSRaymond Sun &(tc[tc_id].coeff), d_index, trip_point);
164*3da2d29cSRaymond Sun }
165*3da2d29cSRaymond Sun } else {
166*3da2d29cSRaymond Sun INFO("Error: tc_id %d over %d\n", tc_id, MT8189_LVTS_CTRL_NUM);
167*3da2d29cSRaymond Sun }
168*3da2d29cSRaymond Sun
169*3da2d29cSRaymond Sun if (lvts_data->enable_dump_log) {
170*3da2d29cSRaymond Sun /* high offset INT */
171*3da2d29cSRaymond Sun mmio_write_32(LVTSOFFSETH_0 + base, msr_raw);
172*3da2d29cSRaymond Sun
173*3da2d29cSRaymond Sun /*
174*3da2d29cSRaymond Sun * lowoffset INT
175*3da2d29cSRaymond Sun * set a big msr_raw = 0xffff(very low temperature)
176*3da2d29cSRaymond Sun * to let lowoffset INT not be triggered
177*3da2d29cSRaymond Sun */
178*3da2d29cSRaymond Sun mmio_write_32(LVTSOFFSETL_0 + base, 0xffff);
179*3da2d29cSRaymond Sun } else {
180*3da2d29cSRaymond Sun mmio_write_32(LVTSPROTTC_0 + base, msr_raw);
181*3da2d29cSRaymond Sun }
182*3da2d29cSRaymond Sun
183*3da2d29cSRaymond Sun dmbsy();
184*3da2d29cSRaymond Sun
185*3da2d29cSRaymond Sun enable_hw_reboot_interrupt(lvts_data, tc_id);
186*3da2d29cSRaymond Sun }
187*3da2d29cSRaymond Sun
188*3da2d29cSRaymond Sun #define LVTS_COEFF_A_X_1000 (-250460)
189*3da2d29cSRaymond Sun #define LVTS_COEFF_B_X_1000 (250460)
190*3da2d29cSRaymond Sun
lvts_raw_to_temp_v1(const struct formula_coeff * co,uint32_t sensor_id,uint32_t msr_raw)191*3da2d29cSRaymond Sun static int lvts_raw_to_temp_v1(const struct formula_coeff *co,
192*3da2d29cSRaymond Sun uint32_t sensor_id, uint32_t msr_raw)
193*3da2d29cSRaymond Sun {
194*3da2d29cSRaymond Sun /* This function returns degree mC
195*3da2d29cSRaymond Sun * temp[i] = a * MSR_RAW/16384 + GOLDEN_TEMP/2 + b
196*3da2d29cSRaymond Sun * a = -250.46
197*3da2d29cSRaymond Sun * b = 250.46
198*3da2d29cSRaymond Sun */
199*3da2d29cSRaymond Sun (void)sensor_id;
200*3da2d29cSRaymond Sun int temp_mC = 0;
201*3da2d29cSRaymond Sun int temp1 = 0;
202*3da2d29cSRaymond Sun int golden_temp = co ? (int)co->golden_temp : DEFAULT_EFUSE_GOLDEN_TEMP;
203*3da2d29cSRaymond Sun
204*3da2d29cSRaymond Sun temp1 = ((int)LVTS_COEFF_A_X_1000 * ((int)msr_raw)) >> 14;
205*3da2d29cSRaymond Sun
206*3da2d29cSRaymond Sun temp_mC = temp1 + golden_temp * 500 + LVTS_COEFF_B_X_1000;
207*3da2d29cSRaymond Sun
208*3da2d29cSRaymond Sun return temp_mC;
209*3da2d29cSRaymond Sun }
210*3da2d29cSRaymond Sun
lvts_temp_to_raw_v1(const struct formula_coeff * co,uint32_t sensor_id,int temp)211*3da2d29cSRaymond Sun static uint32_t lvts_temp_to_raw_v1(const struct formula_coeff *co,
212*3da2d29cSRaymond Sun uint32_t sensor_id, int temp)
213*3da2d29cSRaymond Sun {
214*3da2d29cSRaymond Sun /* MSR_RAW = ((temp[i] - GOLDEN_TEMP/2 - b) * 16384) / a
215*3da2d29cSRaymond Sun * a = -250.46
216*3da2d29cSRaymond Sun * b = 250.46
217*3da2d29cSRaymond Sun */
218*3da2d29cSRaymond Sun (void)sensor_id;
219*3da2d29cSRaymond Sun uint32_t msr_raw = 0;
220*3da2d29cSRaymond Sun int golden_temp = co ? (int)co->golden_temp : DEFAULT_EFUSE_GOLDEN_TEMP;
221*3da2d29cSRaymond Sun
222*3da2d29cSRaymond Sun msr_raw = (uint32_t)(
223*3da2d29cSRaymond Sun ((long long)(
224*3da2d29cSRaymond Sun (golden_temp * 500) + LVTS_COEFF_B_X_1000 - temp) << 14) /
225*3da2d29cSRaymond Sun (-1 * LVTS_COEFF_A_X_1000));
226*3da2d29cSRaymond Sun msr_raw = msr_raw & 0xFFFF;
227*3da2d29cSRaymond Sun
228*3da2d29cSRaymond Sun return msr_raw;
229*3da2d29cSRaymond Sun }
230*3da2d29cSRaymond Sun
mt8189_get_calibration_data(struct lvts_data * lvts_data)231*3da2d29cSRaymond Sun static void mt8189_get_calibration_data(struct lvts_data *lvts_data)
232*3da2d29cSRaymond Sun {
233*3da2d29cSRaymond Sun lvts_data->efuse[0] = mmio_read_32(EFUSEC_BASE + 0x01A4);
234*3da2d29cSRaymond Sun lvts_data->efuse[1] = mmio_read_32(EFUSEC_BASE + 0x01A8);
235*3da2d29cSRaymond Sun lvts_data->efuse[2] = mmio_read_32(EFUSEC_BASE + 0x01AC);
236*3da2d29cSRaymond Sun lvts_data->efuse[3] = mmio_read_32(EFUSEC_BASE + 0x01B0);
237*3da2d29cSRaymond Sun lvts_data->efuse[4] = mmio_read_32(EFUSEC_BASE + 0x01B4);
238*3da2d29cSRaymond Sun lvts_data->efuse[5] = mmio_read_32(EFUSEC_BASE + 0x01B8);
239*3da2d29cSRaymond Sun lvts_data->efuse[6] = mmio_read_32(EFUSEC_BASE + 0x01BC);
240*3da2d29cSRaymond Sun lvts_data->efuse[7] = mmio_read_32(EFUSEC_BASE + 0x01C0);
241*3da2d29cSRaymond Sun lvts_data->efuse[8] = mmio_read_32(EFUSEC_BASE + 0x01C4);
242*3da2d29cSRaymond Sun lvts_data->efuse[9] = mmio_read_32(EFUSEC_BASE + 0x01C8);
243*3da2d29cSRaymond Sun lvts_data->efuse[10] = mmio_read_32(EFUSEC_BASE + 0x01CC);
244*3da2d29cSRaymond Sun lvts_data->efuse[11] = mmio_read_32(EFUSEC_BASE + 0x01D0);
245*3da2d29cSRaymond Sun lvts_data->efuse[12] = mmio_read_32(EFUSEC_BASE + 0x01D4);
246*3da2d29cSRaymond Sun lvts_data->efuse[13] = mmio_read_32(EFUSEC_BASE + 0x01D8);
247*3da2d29cSRaymond Sun lvts_data->efuse[14] = mmio_read_32(EFUSEC_BASE + 0x01DC);
248*3da2d29cSRaymond Sun
249*3da2d29cSRaymond Sun lvts_data->efuse[15] = mmio_read_32(EFUSEC_BASE + 0x01E0);
250*3da2d29cSRaymond Sun lvts_data->efuse[16] = mmio_read_32(EFUSEC_BASE + 0x01E4);
251*3da2d29cSRaymond Sun lvts_data->efuse[17] = mmio_read_32(EFUSEC_BASE + 0x01E8);
252*3da2d29cSRaymond Sun lvts_data->efuse[18] = mmio_read_32(EFUSEC_BASE + 0x01EC);
253*3da2d29cSRaymond Sun lvts_data->efuse[19] = mmio_read_32(EFUSEC_BASE + 0x01F0);
254*3da2d29cSRaymond Sun lvts_data->efuse[20] = mmio_read_32(EFUSEC_BASE + 0x01F4);
255*3da2d29cSRaymond Sun lvts_data->efuse[21] = mmio_read_32(EFUSEC_BASE + 0x01F8);
256*3da2d29cSRaymond Sun lvts_data->efuse[22] = mmio_read_32(EFUSEC_BASE + 0x01FC);
257*3da2d29cSRaymond Sun }
258*3da2d29cSRaymond Sun
init_controller_v1(struct lvts_data * lvts_data)259*3da2d29cSRaymond Sun static void init_controller_v1(struct lvts_data *lvts_data)
260*3da2d29cSRaymond Sun {
261*3da2d29cSRaymond Sun unsigned int i;
262*3da2d29cSRaymond Sun uintptr_t base;
263*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
264*3da2d29cSRaymond Sun
265*3da2d29cSRaymond Sun assert(lvts_data->num_tc <= MT8189_LVTS_CTRL_NUM);
266*3da2d29cSRaymond Sun lvts_write_all_device(lvts_data, SET_DEVICE_LOW_POWER_SINGLE_MODE_V1);
267*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++) {
268*3da2d29cSRaymond Sun if (tc[i].ctrl_on_off == CTRL_OFF)
269*3da2d29cSRaymond Sun continue;
270*3da2d29cSRaymond Sun
271*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, i);
272*3da2d29cSRaymond Sun
273*3da2d29cSRaymond Sun mmio_write_32(LVTSTSSEL_0 + base, 0x13121110);
274*3da2d29cSRaymond Sun mmio_write_32(LVTSCALSCALE_0 + base, SET_CALC_SCALE_RULES);
275*3da2d29cSRaymond Sun dmbsy();
276*3da2d29cSRaymond Sun
277*3da2d29cSRaymond Sun set_polling_speed(lvts_data, i);
278*3da2d29cSRaymond Sun set_hw_filter(lvts_data, i);
279*3da2d29cSRaymond Sun }
280*3da2d29cSRaymond Sun }
281*3da2d29cSRaymond Sun
mt8189_device_enable_and_init(struct lvts_data * lvts_data)282*3da2d29cSRaymond Sun static void mt8189_device_enable_and_init(struct lvts_data *lvts_data)
283*3da2d29cSRaymond Sun {
284*3da2d29cSRaymond Sun unsigned int i;
285*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
286*3da2d29cSRaymond Sun
287*3da2d29cSRaymond Sun assert(lvts_data->num_tc <= MT8189_LVTS_CTRL_NUM);
288*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++) {
289*3da2d29cSRaymond Sun if (tc[i].ctrl_on_off == CTRL_OFF)
290*3da2d29cSRaymond Sun continue;
291*3da2d29cSRaymond Sun
292*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC1030300, i);
293*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC10307A6, i);
294*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC1030500, i);
295*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC1030420, i);
296*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC1030A8C, i);
297*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC1030CFC, i);
298*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC103098D, i);
299*3da2d29cSRaymond Sun lvts_write_device(lvts_data, 0xC10308F1, i);
300*3da2d29cSRaymond Sun }
301*3da2d29cSRaymond Sun }
302*3da2d29cSRaymond Sun
mt8189_device_read_count_rc_n(struct lvts_data * lvts_data)303*3da2d29cSRaymond Sun static int mt8189_device_read_count_rc_n(struct lvts_data *lvts_data)
304*3da2d29cSRaymond Sun {
305*3da2d29cSRaymond Sun /* Resistor-Capacitor Calibration */
306*3da2d29cSRaymond Sun /* count_RC_N: count RC now */
307*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
308*3da2d29cSRaymond Sun struct sensor_cal_data *cal_data = &lvts_data->cal_data;
309*3da2d29cSRaymond Sun unsigned int i, j, s_index;
310*3da2d29cSRaymond Sun uintptr_t base;
311*3da2d29cSRaymond Sun int ret;
312*3da2d29cSRaymond Sun uint32_t temp, data, rc_data;
313*3da2d29cSRaymond Sun uint32_t refine_data_idx[4] = {0};
314*3da2d29cSRaymond Sun uint32_t count_rc_delta = 0;
315*3da2d29cSRaymond Sun
316*3da2d29cSRaymond Sun lvts_write_all_device(lvts_data, SET_LVTS_MANUAL_RCK_V1);
317*3da2d29cSRaymond Sun if (lvts_data->init_done == true) {
318*3da2d29cSRaymond Sun lvts_write_all_device(lvts_data, SET_SENSOR_NO_RCK_V1);
319*3da2d29cSRaymond Sun lvts_write_all_device(lvts_data,
320*3da2d29cSRaymond Sun SET_DEVICE_LOW_POWER_SINGLE_MODE_V1);
321*3da2d29cSRaymond Sun return 0;
322*3da2d29cSRaymond Sun }
323*3da2d29cSRaymond Sun
324*3da2d29cSRaymond Sun assert(lvts_data->num_tc <= MT8189_LVTS_CTRL_NUM);
325*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++) {
326*3da2d29cSRaymond Sun if (tc[i].ctrl_on_off == CTRL_OFF)
327*3da2d29cSRaymond Sun continue;
328*3da2d29cSRaymond Sun
329*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, i);
330*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SET_LVTS_MANUAL_RCK_OPERATION_8189,
331*3da2d29cSRaymond Sun i);
332*3da2d29cSRaymond Sun
333*3da2d29cSRaymond Sun for (j = 0; j < tc[i].num_sensor; j++) {
334*3da2d29cSRaymond Sun if (j >= ALL_SENSING_POINTS)
335*3da2d29cSRaymond Sun break;
336*3da2d29cSRaymond Sun
337*3da2d29cSRaymond Sun if (tc[i].sensor_on_off[j] != SEN_ON)
338*3da2d29cSRaymond Sun continue;
339*3da2d29cSRaymond Sun
340*3da2d29cSRaymond Sun refine_data_idx[j] = 0xff;
341*3da2d29cSRaymond Sun s_index = tc[i].sensor_map[j];
342*3da2d29cSRaymond Sun
343*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SELECT_SENSOR_RCK_V1(j),
344*3da2d29cSRaymond Sun i);
345*3da2d29cSRaymond Sun lvts_write_device(lvts_data,
346*3da2d29cSRaymond Sun SET_DEVICE_SINGLE_MODE_8189, i);
347*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SET_TS_DIV_EN_8189, i);
348*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SET_VCO_RST_8189, i);
349*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SET_TS_DIV_EN_8189, i);
350*3da2d29cSRaymond Sun udelay(20);
351*3da2d29cSRaymond Sun
352*3da2d29cSRaymond Sun lvts_write_device(lvts_data, KICK_OFF_RCK_COUNTING_V1,
353*3da2d29cSRaymond Sun i);
354*3da2d29cSRaymond Sun
355*3da2d29cSRaymond Sun ret = mmio_read_32_poll_timeout(
356*3da2d29cSRaymond Sun LVTS_CONFIG_0 + base,
357*3da2d29cSRaymond Sun temp,
358*3da2d29cSRaymond Sun ((temp & DEVICE_SENSING_STATUS) == 0),
359*3da2d29cSRaymond Sun 20);
360*3da2d29cSRaymond Sun if (ret)
361*3da2d29cSRaymond Sun INFO("Error: %d DEVICE_SENSING_STATUS timeout\n"
362*3da2d29cSRaymond Sun , i);
363*3da2d29cSRaymond Sun
364*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SET_TS_DIS_8189, i);
365*3da2d29cSRaymond Sun
366*3da2d29cSRaymond Sun /* wait for sensor 0*/
367*3da2d29cSRaymond Sun udelay(50 * (j == 0));
368*3da2d29cSRaymond Sun
369*3da2d29cSRaymond Sun data = lvts_read_device(lvts_data, 0x00, i);
370*3da2d29cSRaymond Sun /* wait 5us buffer */
371*3da2d29cSRaymond Sun udelay(5);
372*3da2d29cSRaymond Sun
373*3da2d29cSRaymond Sun rc_data = (data & GENMASK(23, 0));
374*3da2d29cSRaymond Sun
375*3da2d29cSRaymond Sun if (rc_data == 0) {
376*3da2d29cSRaymond Sun refine_data_idx[j] = s_index;
377*3da2d29cSRaymond Sun } else {
378*3da2d29cSRaymond Sun if (cal_data->count_rc[i] > rc_data)
379*3da2d29cSRaymond Sun count_rc_delta = (cal_data->count_rc[i]
380*3da2d29cSRaymond Sun * 1000) / rc_data;
381*3da2d29cSRaymond Sun else
382*3da2d29cSRaymond Sun count_rc_delta = (rc_data * 1000)
383*3da2d29cSRaymond Sun / cal_data->count_rc[i];
384*3da2d29cSRaymond Sun
385*3da2d29cSRaymond Sun if (count_rc_delta > 1061) {
386*3da2d29cSRaymond Sun refine_data_idx[j] = s_index;
387*3da2d29cSRaymond Sun }
388*3da2d29cSRaymond Sun }
389*3da2d29cSRaymond Sun
390*3da2d29cSRaymond Sun ret = mmio_read_32_poll_timeout(
391*3da2d29cSRaymond Sun LVTS_CONFIG_0 + base,
392*3da2d29cSRaymond Sun temp,
393*3da2d29cSRaymond Sun ((temp & DEVICE_ACCESS_STARTUS) == 0),
394*3da2d29cSRaymond Sun 20);
395*3da2d29cSRaymond Sun if (ret)
396*3da2d29cSRaymond Sun INFO("Error: %d DEVICE_ACCESS_START timeout\n",
397*3da2d29cSRaymond Sun i);
398*3da2d29cSRaymond Sun
399*3da2d29cSRaymond Sun if (s_index < MT8189_NUM_TS) {
400*3da2d29cSRaymond Sun if (refine_data_idx[j] != 0xff) {
401*3da2d29cSRaymond Sun cal_data->count_rc_now[s_index] =
402*3da2d29cSRaymond Sun cal_data->count_rc[i];
403*3da2d29cSRaymond Sun } else {
404*3da2d29cSRaymond Sun cal_data->count_rc_now[s_index] =
405*3da2d29cSRaymond Sun rc_data & GENMASK(23, 0);
406*3da2d29cSRaymond Sun }
407*3da2d29cSRaymond Sun }
408*3da2d29cSRaymond Sun
409*3da2d29cSRaymond Sun /* count data here that want to set to efuse later */
410*3da2d29cSRaymond Sun cal_data->efuse_data[s_index] = (uint32_t)(((
411*3da2d29cSRaymond Sun (unsigned long long)
412*3da2d29cSRaymond Sun cal_data->count_rc_now[s_index]) *
413*3da2d29cSRaymond Sun cal_data->count_r[s_index]) >> 14);
414*3da2d29cSRaymond Sun lvts_write_device(lvts_data,
415*3da2d29cSRaymond Sun (0x10 | SELECT_SENSOR_RCK_V1(j)), i);
416*3da2d29cSRaymond Sun }
417*3da2d29cSRaymond Sun
418*3da2d29cSRaymond Sun /* Recover Setting for Normal Access on
419*3da2d29cSRaymond Sun * temperature fetch
420*3da2d29cSRaymond Sun */
421*3da2d29cSRaymond Sun lvts_write_device(lvts_data, SET_SENSOR_NO_RCK_V1, i);
422*3da2d29cSRaymond Sun lvts_write_device(lvts_data,
423*3da2d29cSRaymond Sun SET_DEVICE_LOW_POWER_SINGLE_MODE_V1, i);
424*3da2d29cSRaymond Sun }
425*3da2d29cSRaymond Sun
426*3da2d29cSRaymond Sun return 0;
427*3da2d29cSRaymond Sun }
428*3da2d29cSRaymond Sun
mt8189_lvts_reset(struct lvts_data * lvts_data)429*3da2d29cSRaymond Sun static void mt8189_lvts_reset(struct lvts_data *lvts_data)
430*3da2d29cSRaymond Sun {
431*3da2d29cSRaymond Sun unsigned int i;
432*3da2d29cSRaymond Sun uint32_t temp;
433*3da2d29cSRaymond Sun
434*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_domain; i++) {
435*3da2d29cSRaymond Sun if (i < MT8189_NUM_DOMAIN) {
436*3da2d29cSRaymond Sun temp = (uint32_t)BIT(
437*3da2d29cSRaymond Sun lvts_data->domain[i].reset_set_bitnum);
438*3da2d29cSRaymond Sun mmio_write_32((lvts_data->domain[i].reset_base +
439*3da2d29cSRaymond Sun lvts_data->domain[i].reset_set_offset),
440*3da2d29cSRaymond Sun temp);
441*3da2d29cSRaymond Sun
442*3da2d29cSRaymond Sun udelay(1);
443*3da2d29cSRaymond Sun
444*3da2d29cSRaymond Sun temp = (uint32_t)BIT(
445*3da2d29cSRaymond Sun lvts_data->domain[i].reset_clr_bitnum);
446*3da2d29cSRaymond Sun mmio_write_32((lvts_data->domain[i].reset_base +
447*3da2d29cSRaymond Sun lvts_data->domain[i].reset_clr_offset),
448*3da2d29cSRaymond Sun temp);
449*3da2d29cSRaymond Sun }
450*3da2d29cSRaymond Sun }
451*3da2d29cSRaymond Sun
452*3da2d29cSRaymond Sun }
453*3da2d29cSRaymond Sun
mt8189_device_identification(struct lvts_data * lvts_data)454*3da2d29cSRaymond Sun static void mt8189_device_identification(struct lvts_data *lvts_data)
455*3da2d29cSRaymond Sun {
456*3da2d29cSRaymond Sun unsigned int i;
457*3da2d29cSRaymond Sun uintptr_t base;
458*3da2d29cSRaymond Sun uint32_t data, lvts_dev_id;
459*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
460*3da2d29cSRaymond Sun
461*3da2d29cSRaymond Sun assert(lvts_data->num_tc <= MT8189_LVTS_CTRL_NUM);
462*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++) {
463*3da2d29cSRaymond Sun if (tc[i].ctrl_on_off == CTRL_OFF)
464*3da2d29cSRaymond Sun continue;
465*3da2d29cSRaymond Sun
466*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, i);
467*3da2d29cSRaymond Sun
468*3da2d29cSRaymond Sun mmio_write_32(LVTSCLKEN_0 + base, ENABLE_LVTS_CTRL_CLK);
469*3da2d29cSRaymond Sun }
470*3da2d29cSRaymond Sun
471*3da2d29cSRaymond Sun lvts_write_all_device(lvts_data, RESET_ALL_DEVICES);
472*3da2d29cSRaymond Sun lvts_write_all_device(lvts_data, READ_BACK_DEVICE_ID);
473*3da2d29cSRaymond Sun
474*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++) {
475*3da2d29cSRaymond Sun if (tc[i].ctrl_on_off == CTRL_OFF)
476*3da2d29cSRaymond Sun continue;
477*3da2d29cSRaymond Sun
478*3da2d29cSRaymond Sun base = GET_BASE_ADDR(lvts_data, i);
479*3da2d29cSRaymond Sun /* Check LVTS device ID */
480*3da2d29cSRaymond Sun data = mmio_read_32(LVTS_ID_0 + base) & GENMASK(7, 0);
481*3da2d29cSRaymond Sun
482*3da2d29cSRaymond Sun lvts_dev_id = 0x81 + i;
483*3da2d29cSRaymond Sun
484*3da2d29cSRaymond Sun if (data != lvts_dev_id) {
485*3da2d29cSRaymond Sun INFO("LVTS_TC_%d, Device ID should be 0x%x, but 0x%x\n",
486*3da2d29cSRaymond Sun i, lvts_dev_id, data);
487*3da2d29cSRaymond Sun }
488*3da2d29cSRaymond Sun }
489*3da2d29cSRaymond Sun }
490*3da2d29cSRaymond Sun
mt8189_efuse_to_cal_data(struct lvts_data * lvts_data)491*3da2d29cSRaymond Sun static void mt8189_efuse_to_cal_data(struct lvts_data *lvts_data)
492*3da2d29cSRaymond Sun {
493*3da2d29cSRaymond Sun struct sensor_cal_data *cal_data = &lvts_data->cal_data;
494*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
495*3da2d29cSRaymond Sun unsigned int i;
496*3da2d29cSRaymond Sun
497*3da2d29cSRaymond Sun cal_data->golden_temp = GET_CAL_BITMASK(lvts_data, 0, 7, 0);
498*3da2d29cSRaymond Sun
499*3da2d29cSRaymond Sun assert(lvts_data->num_tc <= MT8189_LVTS_CTRL_NUM);
500*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++)
501*3da2d29cSRaymond Sun tc[i].coeff.golden_temp = cal_data->golden_temp;
502*3da2d29cSRaymond Sun
503*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS1_0] = GET_CAL_BITMASK(lvts_data, 1, 23, 0);
504*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS1_1] = GET_CAL_BITMASK(lvts_data, 2, 23, 0);
505*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS1_2] = GET_CAL_BITMASK(lvts_data, 3, 23, 0);
506*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS1_3] = GET_CAL_BITMASK(lvts_data, 4, 23, 0);
507*3da2d29cSRaymond Sun
508*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS2_0] = GET_CAL_BITMASK(lvts_data, 6, 23, 0);
509*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS2_1] = GET_CAL_BITMASK(lvts_data, 7, 23, 0);
510*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS2_2] = GET_CAL_BITMASK(lvts_data, 8, 23, 0);
511*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS2_3] = GET_CAL_BITMASK(lvts_data, 9, 23, 0);
512*3da2d29cSRaymond Sun
513*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS3_0] = GET_CAL_BITMASK(lvts_data, 11, 23, 0);
514*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS3_1] = GET_CAL_BITMASK(lvts_data, 12, 23, 0);
515*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS3_2] = GET_CAL_BITMASK(lvts_data, 13, 23, 0);
516*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS3_3] = GET_CAL_BITMASK(lvts_data, 14, 23, 0);
517*3da2d29cSRaymond Sun
518*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS4_0] = GET_CAL_BITMASK(lvts_data, 16, 23, 0);
519*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS4_1] = GET_CAL_BITMASK(lvts_data, 17, 23, 0);
520*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS4_2] = GET_CAL_BITMASK(lvts_data, 18, 23, 0);
521*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS4_3] = GET_CAL_BITMASK(lvts_data, 19, 23, 0);
522*3da2d29cSRaymond Sun
523*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS5_0] = GET_CAL_BITMASK(lvts_data, 21, 23, 0);
524*3da2d29cSRaymond Sun cal_data->count_r[MT8189_TS5_1] = GET_CAL_BITMASK(lvts_data, 22, 23, 0);
525*3da2d29cSRaymond Sun
526*3da2d29cSRaymond Sun cal_data->count_rc[MT8189_LVTS_MCU_CTRL0] =
527*3da2d29cSRaymond Sun GET_CAL_BITMASK(lvts_data, 0, 31, 8);
528*3da2d29cSRaymond Sun cal_data->count_rc[MT8189_LVTS_MCU_CTRL1] =
529*3da2d29cSRaymond Sun GET_CAL_BITMASK(lvts_data, 5, 23, 0);
530*3da2d29cSRaymond Sun cal_data->count_rc[MT8189_LVTS_MCU_CTRL2] =
531*3da2d29cSRaymond Sun GET_CAL_BITMASK(lvts_data, 10, 23, 0);
532*3da2d29cSRaymond Sun
533*3da2d29cSRaymond Sun cal_data->count_rc[MT8189_LVTS_AP_CTRL0] =
534*3da2d29cSRaymond Sun GET_CAL_BITMASK(lvts_data, 15, 23, 0);
535*3da2d29cSRaymond Sun cal_data->count_rc[MT8189_LVTS_GPU_CTRL0] =
536*3da2d29cSRaymond Sun GET_CAL_BITMASK(lvts_data, 20, 23, 0);
537*3da2d29cSRaymond Sun }
538*3da2d29cSRaymond Sun
mt8189_check_cal_data(struct lvts_data * lvts_data)539*3da2d29cSRaymond Sun static void mt8189_check_cal_data(struct lvts_data *lvts_data)
540*3da2d29cSRaymond Sun {
541*3da2d29cSRaymond Sun struct sensor_cal_data *cal_data = &lvts_data->cal_data;
542*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
543*3da2d29cSRaymond Sun unsigned int i, j;
544*3da2d29cSRaymond Sun bool efuse_calibrated = false;
545*3da2d29cSRaymond Sun
546*3da2d29cSRaymond Sun assert(lvts_data->num_sensor <= MT8189_NUM_TS);
547*3da2d29cSRaymond Sun assert(lvts_data->num_tc <= MT8189_LVTS_CTRL_NUM);
548*3da2d29cSRaymond Sun if ((cal_data->golden_temp != 0) || (cal_data->golden_temp_ht != 0)) {
549*3da2d29cSRaymond Sun efuse_calibrated = true;
550*3da2d29cSRaymond Sun } else {
551*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_sensor; i++) {
552*3da2d29cSRaymond Sun if (cal_data->count_r[i] != 0) {
553*3da2d29cSRaymond Sun efuse_calibrated = true;
554*3da2d29cSRaymond Sun break;
555*3da2d29cSRaymond Sun }
556*3da2d29cSRaymond Sun }
557*3da2d29cSRaymond Sun if (!efuse_calibrated) {
558*3da2d29cSRaymond Sun for (j = 0; j < lvts_data->num_tc; j++) {
559*3da2d29cSRaymond Sun if (cal_data->count_rc[j] != 0) {
560*3da2d29cSRaymond Sun efuse_calibrated = true;
561*3da2d29cSRaymond Sun break;
562*3da2d29cSRaymond Sun }
563*3da2d29cSRaymond Sun }
564*3da2d29cSRaymond Sun }
565*3da2d29cSRaymond Sun }
566*3da2d29cSRaymond Sun
567*3da2d29cSRaymond Sun if (!efuse_calibrated) {
568*3da2d29cSRaymond Sun /* It means all efuse data are equal to 0 */
569*3da2d29cSRaymond Sun INFO("[lvts_cal] This sample is not calibrated, fake !!\n");
570*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_sensor; i++)
571*3da2d29cSRaymond Sun cal_data->count_r[i] = cal_data->default_count_r;
572*3da2d29cSRaymond Sun
573*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++)
574*3da2d29cSRaymond Sun cal_data->count_rc[i] = cal_data->default_count_rc;
575*3da2d29cSRaymond Sun
576*3da2d29cSRaymond Sun cal_data->golden_temp = cal_data->default_golden_temp;
577*3da2d29cSRaymond Sun
578*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++)
579*3da2d29cSRaymond Sun tc[i].coeff.golden_temp = cal_data->default_golden_temp;
580*3da2d29cSRaymond Sun }
581*3da2d29cSRaymond Sun }
582*3da2d29cSRaymond Sun
mt8189_update_coef_data(struct lvts_data * lvts_data)583*3da2d29cSRaymond Sun static void mt8189_update_coef_data(struct lvts_data *lvts_data)
584*3da2d29cSRaymond Sun {
585*3da2d29cSRaymond Sun struct sensor_cal_data *cal_data = &lvts_data->cal_data;
586*3da2d29cSRaymond Sun struct tc_settings *tc = lvts_data->tc;
587*3da2d29cSRaymond Sun unsigned int i, j, s_index;
588*3da2d29cSRaymond Sun
589*3da2d29cSRaymond Sun for (i = 0; i < lvts_data->num_tc; i++) {
590*3da2d29cSRaymond Sun if (tc[i].ctrl_on_off == CTRL_OFF)
591*3da2d29cSRaymond Sun continue;
592*3da2d29cSRaymond Sun
593*3da2d29cSRaymond Sun for (j = 0; j < tc[i].num_sensor; j++) {
594*3da2d29cSRaymond Sun if (tc[i].sensor_on_off[j] != SEN_ON)
595*3da2d29cSRaymond Sun continue;
596*3da2d29cSRaymond Sun
597*3da2d29cSRaymond Sun s_index = tc[i].sensor_map[j];
598*3da2d29cSRaymond Sun tc[i].coeff.a[j] = COF_A_OFS + (COF_A_CONST_OFS *
599*3da2d29cSRaymond Sun (int)(cal_data->count_r[s_index])
600*3da2d29cSRaymond Sun / COF_A_COUNT_R_GLD);
601*3da2d29cSRaymond Sun }
602*3da2d29cSRaymond Sun }
603*3da2d29cSRaymond Sun }
604*3da2d29cSRaymond Sun
605*3da2d29cSRaymond Sun static struct power_domain mt8189_domain_settings[MT8189_NUM_DOMAIN] = {
606*3da2d29cSRaymond Sun [MT8189_AP_DOMAIN] = {
607*3da2d29cSRaymond Sun .base = THERM_CTRL_AP_BASE,
608*3da2d29cSRaymond Sun .reset_base = INFRACFG_BASE,
609*3da2d29cSRaymond Sun .reset_set_offset = THERM_AP_RESET_SET_OFFSET,
610*3da2d29cSRaymond Sun .reset_clr_offset = THERM_AP_RESET_CLR_OFFSET,
611*3da2d29cSRaymond Sun .reset_set_bitnum = THERM_AP_RESET_SET_BITNUM,
612*3da2d29cSRaymond Sun .reset_clr_bitnum = THERM_AP_RESET_CLR_BITNUM,
613*3da2d29cSRaymond Sun },
614*3da2d29cSRaymond Sun [MT8189_MCU_DOMAIN] = {
615*3da2d29cSRaymond Sun .base = THERM_CTRL_MCU_BASE,
616*3da2d29cSRaymond Sun .reset_base = INFRACFG_BASE,
617*3da2d29cSRaymond Sun .reset_set_offset = THERM_MCU_RESET_SET_OFFSET,
618*3da2d29cSRaymond Sun .reset_clr_offset = THERM_MCU_RESET_CLR_OFFSET,
619*3da2d29cSRaymond Sun .reset_set_bitnum = THERM_MCU_RESET_SET_BITNUM,
620*3da2d29cSRaymond Sun .reset_clr_bitnum = THERM_MCU_RESET_CLR_BITNUM,
621*3da2d29cSRaymond Sun },
622*3da2d29cSRaymond Sun };
623*3da2d29cSRaymond Sun
624*3da2d29cSRaymond Sun static struct tc_settings mt8189_tc_settings[MT8189_LVTS_CTRL_NUM] = {
625*3da2d29cSRaymond Sun [MT8189_LVTS_MCU_CTRL0] = {
626*3da2d29cSRaymond Sun .domain_index = MT8189_MCU_DOMAIN,
627*3da2d29cSRaymond Sun .addr_offset = 0x0,
628*3da2d29cSRaymond Sun .num_sensor = 4,
629*3da2d29cSRaymond Sun .sensor_map = {MT8189_TS1_0, MT8189_TS1_1, MT8189_TS1_2,
630*3da2d29cSRaymond Sun MT8189_TS1_3},
631*3da2d29cSRaymond Sun .ctrl_on_off = CTRL_ON,
632*3da2d29cSRaymond Sun .sensor_on_off = {SEN_ON, SEN_ON, SEN_ON, SEN_ON},
633*3da2d29cSRaymond Sun .tc_speed = SET_TC_SPEED_IN_US(10, 2460, 10, 10),
634*3da2d29cSRaymond Sun .hw_filter = LVTS_FILTER_1,
635*3da2d29cSRaymond Sun .dominator_sensing_point = ALL_SENSING_POINTS,
636*3da2d29cSRaymond Sun .hw_reboot_trip_point = THERMAL_REBOOT_TEMPERATURE,
637*3da2d29cSRaymond Sun .irq_bit = BIT(1),
638*3da2d29cSRaymond Sun .coeff = {
639*3da2d29cSRaymond Sun .cali_mode = CALI_NT,
640*3da2d29cSRaymond Sun },
641*3da2d29cSRaymond Sun },
642*3da2d29cSRaymond Sun [MT8189_LVTS_MCU_CTRL1] = {
643*3da2d29cSRaymond Sun .domain_index = MT8189_MCU_DOMAIN,
644*3da2d29cSRaymond Sun .addr_offset = 0x100,
645*3da2d29cSRaymond Sun .num_sensor = 4,
646*3da2d29cSRaymond Sun .sensor_map = {MT8189_TS2_0, MT8189_TS2_1, MT8189_TS2_2,
647*3da2d29cSRaymond Sun MT8189_TS2_3},
648*3da2d29cSRaymond Sun .ctrl_on_off = CTRL_ON,
649*3da2d29cSRaymond Sun .sensor_on_off = {SEN_ON, SEN_ON, SEN_ON, SEN_ON},
650*3da2d29cSRaymond Sun .tc_speed = SET_TC_SPEED_IN_US(10, 2460, 10, 10),
651*3da2d29cSRaymond Sun .hw_filter = LVTS_FILTER_1,
652*3da2d29cSRaymond Sun .dominator_sensing_point = ALL_SENSING_POINTS,
653*3da2d29cSRaymond Sun .hw_reboot_trip_point = THERMAL_REBOOT_TEMPERATURE,
654*3da2d29cSRaymond Sun .irq_bit = BIT(2),
655*3da2d29cSRaymond Sun .coeff = {
656*3da2d29cSRaymond Sun .cali_mode = CALI_NT,
657*3da2d29cSRaymond Sun },
658*3da2d29cSRaymond Sun },
659*3da2d29cSRaymond Sun [MT8189_LVTS_MCU_CTRL2] = {
660*3da2d29cSRaymond Sun .domain_index = MT8189_MCU_DOMAIN,
661*3da2d29cSRaymond Sun .addr_offset = 0x200,
662*3da2d29cSRaymond Sun .num_sensor = 4,
663*3da2d29cSRaymond Sun .sensor_map = {MT8189_TS3_0, MT8189_TS3_1, MT8189_TS3_2,
664*3da2d29cSRaymond Sun MT8189_TS3_3},
665*3da2d29cSRaymond Sun .ctrl_on_off = CTRL_ON,
666*3da2d29cSRaymond Sun .sensor_on_off = {SEN_ON, SEN_ON, SEN_ON, SEN_ON},
667*3da2d29cSRaymond Sun .tc_speed = SET_TC_SPEED_IN_US(10, 4490, 10, 10),
668*3da2d29cSRaymond Sun .hw_filter = LVTS_FILTER_1,
669*3da2d29cSRaymond Sun .dominator_sensing_point = ALL_SENSING_POINTS,
670*3da2d29cSRaymond Sun .hw_reboot_trip_point = THERMAL_REBOOT_TEMPERATURE,
671*3da2d29cSRaymond Sun .irq_bit = BIT(3),
672*3da2d29cSRaymond Sun .coeff = {
673*3da2d29cSRaymond Sun .cali_mode = CALI_NT,
674*3da2d29cSRaymond Sun },
675*3da2d29cSRaymond Sun },
676*3da2d29cSRaymond Sun [MT8189_LVTS_AP_CTRL0] = {
677*3da2d29cSRaymond Sun .domain_index = MT8189_AP_DOMAIN,
678*3da2d29cSRaymond Sun .addr_offset = 0x0,
679*3da2d29cSRaymond Sun .num_sensor = 4,
680*3da2d29cSRaymond Sun .sensor_map = {MT8189_TS4_0, MT8189_TS4_1, MT8189_TS4_2,
681*3da2d29cSRaymond Sun MT8189_TS4_3},
682*3da2d29cSRaymond Sun .ctrl_on_off = CTRL_ON,
683*3da2d29cSRaymond Sun .sensor_on_off = {SEN_ON, SEN_ON, SEN_ON, SEN_ON},
684*3da2d29cSRaymond Sun .tc_speed = SET_TC_SPEED_IN_US(10, 2100, 10, 10),
685*3da2d29cSRaymond Sun .hw_filter = LVTS_FILTER_1,
686*3da2d29cSRaymond Sun .dominator_sensing_point = ALL_SENSING_POINTS,
687*3da2d29cSRaymond Sun .hw_reboot_trip_point = THERMAL_REBOOT_TEMPERATURE,
688*3da2d29cSRaymond Sun .irq_bit = BIT(1),
689*3da2d29cSRaymond Sun .coeff = {
690*3da2d29cSRaymond Sun .cali_mode = CALI_NT,
691*3da2d29cSRaymond Sun },
692*3da2d29cSRaymond Sun },
693*3da2d29cSRaymond Sun [MT8189_LVTS_GPU_CTRL0] = {
694*3da2d29cSRaymond Sun .domain_index = MT8189_AP_DOMAIN,
695*3da2d29cSRaymond Sun .addr_offset = 0x100,
696*3da2d29cSRaymond Sun .num_sensor = 2,
697*3da2d29cSRaymond Sun .sensor_map = {MT8189_TS5_0, MT8189_TS5_1},
698*3da2d29cSRaymond Sun .ctrl_on_off = CTRL_ON,
699*3da2d29cSRaymond Sun .sensor_on_off = {SEN_ON, SEN_ON},
700*3da2d29cSRaymond Sun .tc_speed = SET_TC_SPEED_IN_US(10, 1380, 10, 10),
701*3da2d29cSRaymond Sun .hw_filter = LVTS_FILTER_1,
702*3da2d29cSRaymond Sun .dominator_sensing_point = ALL_SENSING_POINTS,
703*3da2d29cSRaymond Sun .hw_reboot_trip_point = THERMAL_REBOOT_TEMPERATURE,
704*3da2d29cSRaymond Sun .irq_bit = BIT(2),
705*3da2d29cSRaymond Sun .coeff = {
706*3da2d29cSRaymond Sun .cali_mode = CALI_NT,
707*3da2d29cSRaymond Sun },
708*3da2d29cSRaymond Sun },
709*3da2d29cSRaymond Sun };
710*3da2d29cSRaymond Sun
711*3da2d29cSRaymond Sun static struct sensor_data mt8189_sensor_data[MT8189_NUM_TS];
712*3da2d29cSRaymond Sun static uint32_t mt8189_efuse[NUM_EFUSE_ADDR];
713*3da2d29cSRaymond Sun static uint32_t count_r[MT8189_NUM_TS];
714*3da2d29cSRaymond Sun static uint32_t count_rc[MT8189_LVTS_CTRL_NUM];
715*3da2d29cSRaymond Sun static uint32_t count_rc_now[MT8189_NUM_TS];
716*3da2d29cSRaymond Sun static uint32_t efuse_data[MT8189_NUM_TS];
717*3da2d29cSRaymond Sun static uint32_t irq_bitmap[MT8189_NUM_DOMAIN];
718*3da2d29cSRaymond Sun
719*3da2d29cSRaymond Sun struct lvts_data lvts_data_instance = {
720*3da2d29cSRaymond Sun .num_domain = MT8189_NUM_DOMAIN,
721*3da2d29cSRaymond Sun .domain = mt8189_domain_settings,
722*3da2d29cSRaymond Sun .num_tc = MT8189_LVTS_CTRL_NUM,
723*3da2d29cSRaymond Sun .tc = mt8189_tc_settings,
724*3da2d29cSRaymond Sun .num_sensor = MT8189_NUM_TS,
725*3da2d29cSRaymond Sun .sen_data = mt8189_sensor_data,
726*3da2d29cSRaymond Sun .ops = {
727*3da2d29cSRaymond Sun .lvts_reset = mt8189_lvts_reset,
728*3da2d29cSRaymond Sun .device_identification = mt8189_device_identification,
729*3da2d29cSRaymond Sun .get_calibration_data = mt8189_get_calibration_data,
730*3da2d29cSRaymond Sun .efuse_to_cal_data = mt8189_efuse_to_cal_data,
731*3da2d29cSRaymond Sun .device_enable_and_init = mt8189_device_enable_and_init,
732*3da2d29cSRaymond Sun .device_enable_auto_rck = NULL,
733*3da2d29cSRaymond Sun .device_read_count_rc_n = mt8189_device_read_count_rc_n,
734*3da2d29cSRaymond Sun .set_cal_data = set_calibration_data_v1,
735*3da2d29cSRaymond Sun .init_controller = init_controller_v1,
736*3da2d29cSRaymond Sun .lvts_temp_to_raw = lvts_temp_to_raw_v1,
737*3da2d29cSRaymond Sun .lvts_raw_to_temp = lvts_raw_to_temp_v1,
738*3da2d29cSRaymond Sun .check_cal_data = mt8189_check_cal_data,
739*3da2d29cSRaymond Sun .update_coef_data = mt8189_update_coef_data,
740*3da2d29cSRaymond Sun },
741*3da2d29cSRaymond Sun .feature_bitmap = 0,
742*3da2d29cSRaymond Sun .num_efuse_addr = NUM_EFUSE_ADDR,
743*3da2d29cSRaymond Sun .efuse = mt8189_efuse,
744*3da2d29cSRaymond Sun .cal_data = {
745*3da2d29cSRaymond Sun .default_golden_temp = DEFAULT_EFUSE_GOLDEN_TEMP,
746*3da2d29cSRaymond Sun .default_golden_temp_ht = DEFAULT_EFUSE_GOLDEN_TEMP_HT,
747*3da2d29cSRaymond Sun .default_count_r = DEFAULT_EFUSE_COUNT,
748*3da2d29cSRaymond Sun .default_count_rc = DEFAULT_EFUSE_COUNT_RC,
749*3da2d29cSRaymond Sun
750*3da2d29cSRaymond Sun .count_r = count_r,
751*3da2d29cSRaymond Sun .count_rc = count_rc,
752*3da2d29cSRaymond Sun .count_rc_now = count_rc_now,
753*3da2d29cSRaymond Sun .efuse_data = efuse_data,
754*3da2d29cSRaymond Sun },
755*3da2d29cSRaymond Sun .irq_bitmap = irq_bitmap,
756*3da2d29cSRaymond Sun .enable_dump_log = 0,
757*3da2d29cSRaymond Sun };
758*3da2d29cSRaymond Sun
thermal_clock_open(void)759*3da2d29cSRaymond Sun void thermal_clock_open(void)
760*3da2d29cSRaymond Sun {
761*3da2d29cSRaymond Sun mmio_setbits_32(THERM_MODULE_SW_CG_0_CLR, BIT(THERM_BIT));
762*3da2d29cSRaymond Sun dmbsy();
763*3da2d29cSRaymond Sun }
764*3da2d29cSRaymond Sun
thermal_clock_close(void)765*3da2d29cSRaymond Sun void thermal_clock_close(void)
766*3da2d29cSRaymond Sun {
767*3da2d29cSRaymond Sun mmio_setbits_32(THERM_MODULE_SW_CG_0_SET, BIT(THERM_BIT));
768*3da2d29cSRaymond Sun dmbsy();
769*3da2d29cSRaymond Sun }
770