1aeed442fSElaine Zhang // SPDX-License-Identifier: GPL-2.0
2aeed442fSElaine Zhang /*
3aeed442fSElaine Zhang * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
4aeed442fSElaine Zhang */
5aeed442fSElaine Zhang
6aeed442fSElaine Zhang #include <common.h>
7aeed442fSElaine Zhang #include <bitfield.h>
8aeed442fSElaine Zhang #include <thermal.h>
9aeed442fSElaine Zhang #include <dm.h>
10aeed442fSElaine Zhang #include <dm/pinctrl.h>
11aeed442fSElaine Zhang #include <div64.h>
12aeed442fSElaine Zhang #include <errno.h>
13aeed442fSElaine Zhang #include <syscon.h>
14aeed442fSElaine Zhang #include <asm/arch/clock.h>
15082f45b4SFinley Xiao #include <asm/arch/cpu.h>
16aeed442fSElaine Zhang #include <asm/arch/hardware.h>
17aeed442fSElaine Zhang #include <asm/io.h>
18aeed442fSElaine Zhang #include <dm/lists.h>
19aeed442fSElaine Zhang #include <clk.h>
20aeed442fSElaine Zhang #include <clk-uclass.h>
21aeed442fSElaine Zhang #include <reset.h>
22aeed442fSElaine Zhang
23aeed442fSElaine Zhang DECLARE_GLOBAL_DATA_PTR;
24aeed442fSElaine Zhang
25aeed442fSElaine Zhang /**
26aeed442fSElaine Zhang * If the temperature over a period of time High,
27aeed442fSElaine Zhang * the resulting TSHUT gave CRU module,let it reset the entire chip,
28aeed442fSElaine Zhang * or via GPIO give PMIC.
29aeed442fSElaine Zhang */
30aeed442fSElaine Zhang enum tshut_mode {
31aeed442fSElaine Zhang TSHUT_MODE_CRU = 0,
32aeed442fSElaine Zhang TSHUT_MODE_GPIO,
33aeed442fSElaine Zhang };
34aeed442fSElaine Zhang
35aeed442fSElaine Zhang /**
36aeed442fSElaine Zhang * The system Temperature Sensors tshut(tshut) polarity
37aeed442fSElaine Zhang * the bit 8 is tshut polarity.
38aeed442fSElaine Zhang * 0: low active, 1: high active
39aeed442fSElaine Zhang */
40aeed442fSElaine Zhang enum tshut_polarity {
41aeed442fSElaine Zhang TSHUT_LOW_ACTIVE = 0,
42aeed442fSElaine Zhang TSHUT_HIGH_ACTIVE,
43aeed442fSElaine Zhang };
44aeed442fSElaine Zhang
45aeed442fSElaine Zhang /**
46aeed442fSElaine Zhang * The conversion table has the adc value and temperature.
47aeed442fSElaine Zhang * ADC_DECREMENT: the adc value is of diminishing.(e.g. rk3288_code_table)
48aeed442fSElaine Zhang * ADC_INCREMENT: the adc value is incremental.(e.g. rk3368_code_table)
49aeed442fSElaine Zhang */
50aeed442fSElaine Zhang enum adc_sort_mode {
51aeed442fSElaine Zhang ADC_DECREMENT = 0,
52aeed442fSElaine Zhang ADC_INCREMENT,
53aeed442fSElaine Zhang };
54aeed442fSElaine Zhang
55198f0697SFinley Xiao #define SOC_MAX_SENSORS 7
56aeed442fSElaine Zhang
57aeed442fSElaine Zhang #define TSADCV2_USER_CON 0x00
58aeed442fSElaine Zhang #define TSADCV2_AUTO_CON 0x04
59aeed442fSElaine Zhang #define TSADCV2_INT_EN 0x08
60aeed442fSElaine Zhang #define TSADCV2_INT_PD 0x0c
61198f0697SFinley Xiao #define TSADCV3_AUTO_SRC_CON 0x0c
62198f0697SFinley Xiao #define TSADCV3_HT_INT_EN 0x14
63198f0697SFinley Xiao #define TSADCV3_HSHUT_GPIO_INT_EN 0x18
64198f0697SFinley Xiao #define TSADCV3_HSHUT_CRU_INT_EN 0x1c
65198f0697SFinley Xiao #define TSADCV3_INT_PD 0x24
66198f0697SFinley Xiao #define TSADCV3_HSHUT_PD 0x28
67aeed442fSElaine Zhang #define TSADCV2_DATA(chn) (0x20 + (chn) * 0x04)
68aeed442fSElaine Zhang #define TSADCV2_COMP_INT(chn) (0x30 + (chn) * 0x04)
69aeed442fSElaine Zhang #define TSADCV2_COMP_SHUT(chn) (0x40 + (chn) * 0x04)
70198f0697SFinley Xiao #define TSADCV3_DATA(chn) (0x2c + (chn) * 0x04)
71198f0697SFinley Xiao #define TSADCV3_COMP_INT(chn) (0x6c + (chn) * 0x04)
72198f0697SFinley Xiao #define TSADCV3_COMP_SHUT(chn) (0x10c + (chn) * 0x04)
73aeed442fSElaine Zhang #define TSADCV2_HIGHT_INT_DEBOUNCE 0x60
74aeed442fSElaine Zhang #define TSADCV2_HIGHT_TSHUT_DEBOUNCE 0x64
75198f0697SFinley Xiao #define TSADCV3_HIGHT_INT_DEBOUNCE 0x14c
76198f0697SFinley Xiao #define TSADCV3_HIGHT_TSHUT_DEBOUNCE 0x150
77aeed442fSElaine Zhang #define TSADCV2_AUTO_PERIOD 0x68
78aeed442fSElaine Zhang #define TSADCV2_AUTO_PERIOD_HT 0x6c
79198f0697SFinley Xiao #define TSADCV3_AUTO_PERIOD 0x154
80198f0697SFinley Xiao #define TSADCV3_AUTO_PERIOD_HT 0x158
8155f74c72SShaohan Yao #define TSADCV3_Q_MAX 0x210
82aeed442fSElaine Zhang
83aeed442fSElaine Zhang #define TSADCV2_AUTO_EN BIT(0)
84198f0697SFinley Xiao #define TSADCV2_AUTO_EN_MASK BIT(16)
85aeed442fSElaine Zhang #define TSADCV2_AUTO_SRC_EN(chn) BIT(4 + (chn))
86198f0697SFinley Xiao #define TSADCV3_AUTO_SRC_EN(chn) BIT(chn)
87198f0697SFinley Xiao #define TSADCV3_AUTO_SRC_EN_MASK(chn) BIT(16 + (chn))
88aeed442fSElaine Zhang #define TSADCV2_AUTO_TSHUT_POLARITY_HIGH BIT(8)
89198f0697SFinley Xiao #define TSADCV2_AUTO_TSHUT_POLARITY_MASK BIT(24)
90aeed442fSElaine Zhang
91aeed442fSElaine Zhang #define TSADCV3_AUTO_Q_SEL_EN BIT(1)
9255f74c72SShaohan Yao #define TSADCV3_AUTO_Q_SEL_EN_MASK BIT(17)
93aeed442fSElaine Zhang
94aeed442fSElaine Zhang #define TSADCV2_INT_SRC_EN(chn) BIT(chn)
95198f0697SFinley Xiao #define TSADCV2_INT_SRC_EN_MASK(chn) BIT(16 + (chn))
96aeed442fSElaine Zhang #define TSADCV2_SHUT_2GPIO_SRC_EN(chn) BIT(4 + (chn))
97aeed442fSElaine Zhang #define TSADCV2_SHUT_2CRU_SRC_EN(chn) BIT(8 + (chn))
98aeed442fSElaine Zhang
99aeed442fSElaine Zhang #define TSADCV2_INT_PD_CLEAR_MASK ~BIT(8)
100aeed442fSElaine Zhang #define TSADCV3_INT_PD_CLEAR_MASK ~BIT(16)
101198f0697SFinley Xiao #define TSADCV4_INT_PD_CLEAR_MASK 0xffffffff
102aeed442fSElaine Zhang
103aeed442fSElaine Zhang #define TSADCV2_DATA_MASK 0xfff
104aeed442fSElaine Zhang #define TSADCV3_DATA_MASK 0x3ff
105198f0697SFinley Xiao #define TSADCV4_DATA_MASK 0x1ff
10655f74c72SShaohan Yao #define TSADCV5_DATA_MASK 0x7ff
107aeed442fSElaine Zhang
108aeed442fSElaine Zhang #define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT 4
109aeed442fSElaine Zhang #define TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT 4
110aeed442fSElaine Zhang #define TSADCV2_AUTO_PERIOD_TIME 250
111aeed442fSElaine Zhang #define TSADCV2_AUTO_PERIOD_HT_TIME 50
112aeed442fSElaine Zhang #define TSADCV3_AUTO_PERIOD_TIME 1875
113aeed442fSElaine Zhang #define TSADCV3_AUTO_PERIOD_HT_TIME 1875
1142f5dff11SElaine Zhang #define TSADCV5_AUTO_PERIOD_TIME 1622 /* 2.5ms */
1152f5dff11SElaine Zhang #define TSADCV5_AUTO_PERIOD_HT_TIME 1622 /* 2.5ms */
116198f0697SFinley Xiao #define TSADCV6_AUTO_PERIOD_TIME 5000 /* 2.5ms */
117198f0697SFinley Xiao #define TSADCV6_AUTO_PERIOD_HT_TIME 5000 /* 2.5ms */
11855f74c72SShaohan Yao #define TSADCV7_AUTO_PERIOD_TIME 3000 /* 2.5ms */
11955f74c72SShaohan Yao #define TSADCV7_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */
12055f74c72SShaohan Yao #define TSADCV3_Q_MAX_VAL 0x7ff /* 11bit 2047 */
12171dcb579SElaine Zhang #define TSADCV12_AUTO_PERIOD_TIME 3000 /* 2.5ms */
12271dcb579SElaine Zhang #define TSADCV12_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */
12371dcb579SElaine Zhang #define TSADCV12_Q_MAX_VAL 0xfff /* 12bit 4095 */
12471dcb579SElaine Zhang #define TSADCV9_Q_MAX 0x210
12571dcb579SElaine Zhang #define TSADCV9_Q_MAX_VAL (0xffff0400 << 0)
126aeed442fSElaine Zhang
127aeed442fSElaine Zhang #define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */
1282f5dff11SElaine Zhang #define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */
129aeed442fSElaine Zhang
130aeed442fSElaine Zhang #define GRF_SARADC_TESTBIT 0x0e644
131aeed442fSElaine Zhang #define GRF_TSADC_TESTBIT_L 0x0e648
132aeed442fSElaine Zhang #define GRF_TSADC_TESTBIT_H 0x0e64c
133aeed442fSElaine Zhang
13431f36c58SFinley Xiao #define PX30_GRF_SOC_CON0 0x0400
135aeed442fSElaine Zhang #define PX30_GRF_SOC_CON2 0x0408
136aeed442fSElaine Zhang
13771dcb579SElaine Zhang #define RK3562_GRF_TSADC_CON 0x0580
13871dcb579SElaine Zhang
1392f5dff11SElaine Zhang #define RK3568_GRF_TSADC_CON 0x0600
14055f74c72SShaohan Yao #define RK3528_GRF_TSADC_CON 0x40030
1412f5dff11SElaine Zhang #define RK3568_GRF_TSADC_ANA_REG0 (0x10001 << 0)
1422f5dff11SElaine Zhang #define RK3568_GRF_TSADC_ANA_REG1 (0x10001 << 1)
1432f5dff11SElaine Zhang #define RK3568_GRF_TSADC_ANA_REG2 (0x10001 << 2)
1442f5dff11SElaine Zhang #define RK3568_GRF_TSADC_TSEN (0x10001 << 8)
1452f5dff11SElaine Zhang
146aeed442fSElaine Zhang #define GRF_SARADC_TESTBIT_ON (0x10001 << 2)
147aeed442fSElaine Zhang #define GRF_TSADC_TESTBIT_H_ON (0x10001 << 2)
148aeed442fSElaine Zhang #define GRF_TSADC_VCM_EN_L (0x10001 << 7)
149aeed442fSElaine Zhang #define GRF_TSADC_VCM_EN_H (0x10001 << 7)
150aeed442fSElaine Zhang
151aeed442fSElaine Zhang #define GRF_CON_TSADC_CH_INV (0x10001 << 1)
15231f36c58SFinley Xiao #define PX30S_TSADC_TDC_MODE (0x10001 << 4)
153aeed442fSElaine Zhang
154850ecf33SElaine Zhang /* -40 to 125 is reliable, outside the range existed unreliability */
155850ecf33SElaine Zhang #define MIN_TEMP (-60000)
156aeed442fSElaine Zhang #define LOWEST_TEMP (-273000)
157850ecf33SElaine Zhang #define MAX_TEMP (180000)
158aeed442fSElaine Zhang #define MAX_ENV_TEMP (85000)
159aeed442fSElaine Zhang
160aeed442fSElaine Zhang #define BASE (1024)
161aeed442fSElaine Zhang #define BASE_SHIFT (10)
162aeed442fSElaine Zhang #define START_DEBOUNCE_COUNT (100)
163aeed442fSElaine Zhang #define HIGHER_DEBOUNCE_TEMP (30000)
164aeed442fSElaine Zhang #define LOWER_DEBOUNCE_TEMP (15000)
165aeed442fSElaine Zhang
166aeed442fSElaine Zhang /**
167aeed442fSElaine Zhang * struct tsadc_table - hold information about code and temp mapping
168aeed442fSElaine Zhang * @code: raw code from tsadc ip
169aeed442fSElaine Zhang * @temp: the mapping temperature
170aeed442fSElaine Zhang */
171aeed442fSElaine Zhang
172aeed442fSElaine Zhang struct tsadc_table {
173aeed442fSElaine Zhang unsigned long code;
174aeed442fSElaine Zhang int temp;
175aeed442fSElaine Zhang };
176aeed442fSElaine Zhang
177aeed442fSElaine Zhang struct chip_tsadc_table {
178aeed442fSElaine Zhang const struct tsadc_table *id;
179aeed442fSElaine Zhang unsigned int length;
180aeed442fSElaine Zhang u32 data_mask;
181082f45b4SFinley Xiao /* Tsadc is linear, using linear parameters */
182082f45b4SFinley Xiao int knum;
183082f45b4SFinley Xiao int bnum;
184aeed442fSElaine Zhang enum adc_sort_mode mode;
185aeed442fSElaine Zhang };
186aeed442fSElaine Zhang
187aeed442fSElaine Zhang enum sensor_id {
188aeed442fSElaine Zhang SENSOR_CPU = 0,
189aeed442fSElaine Zhang SENSOR_GPU,
190aeed442fSElaine Zhang };
191aeed442fSElaine Zhang
192aeed442fSElaine Zhang struct rockchip_tsadc_chip {
193aeed442fSElaine Zhang /* The sensor id of chip correspond to the ADC channel */
194aeed442fSElaine Zhang int chn_id[SOC_MAX_SENSORS];
195aeed442fSElaine Zhang int chn_num;
196aeed442fSElaine Zhang fdt_addr_t base;
197aeed442fSElaine Zhang fdt_addr_t grf;
198aeed442fSElaine Zhang
199aeed442fSElaine Zhang /* The hardware-controlled tshut property */
200aeed442fSElaine Zhang int tshut_temp;
201aeed442fSElaine Zhang enum tshut_mode tshut_mode;
202aeed442fSElaine Zhang enum tshut_polarity tshut_polarity;
203aeed442fSElaine Zhang
204aeed442fSElaine Zhang void (*tsadc_control)(struct udevice *dev, bool enable);
205aeed442fSElaine Zhang void (*tsadc_init)(struct udevice *dev);
206aeed442fSElaine Zhang int (*tsadc_get_temp)(struct udevice *dev, int chn,
207aeed442fSElaine Zhang int *temp);
208aeed442fSElaine Zhang void (*irq_ack)(struct udevice *dev);
209aeed442fSElaine Zhang void (*set_alarm_temp)(struct udevice *dev,
210aeed442fSElaine Zhang int chn, int temp);
211aeed442fSElaine Zhang void (*set_tshut_temp)(struct udevice *dev,
212aeed442fSElaine Zhang int chn, int temp);
213aeed442fSElaine Zhang void (*set_tshut_mode)(struct udevice *dev, int chn, enum tshut_mode m);
214aeed442fSElaine Zhang struct chip_tsadc_table table;
215aeed442fSElaine Zhang };
216aeed442fSElaine Zhang
217aeed442fSElaine Zhang struct rockchip_thermal_priv {
218aeed442fSElaine Zhang void *base;
219aeed442fSElaine Zhang void *grf;
220aeed442fSElaine Zhang enum tshut_mode tshut_mode;
2214585497aSElaine Zhang enum tshut_polarity tshut_polarity;
222aeed442fSElaine Zhang const struct rockchip_tsadc_chip *data;
223aeed442fSElaine Zhang };
224aeed442fSElaine Zhang
225aeed442fSElaine Zhang static const struct tsadc_table rk1808_code_table[] = {
226850ecf33SElaine Zhang {0, MIN_TEMP},
227850ecf33SElaine Zhang {3423, MIN_TEMP},
228ba09f836SElaine Zhang {3455, -40000},
229ba09f836SElaine Zhang {3463, -35000},
230ba09f836SElaine Zhang {3471, -30000},
231ba09f836SElaine Zhang {3479, -25000},
232ba09f836SElaine Zhang {3487, -20000},
233ba09f836SElaine Zhang {3495, -15000},
234ba09f836SElaine Zhang {3503, -10000},
235ba09f836SElaine Zhang {3511, -5000},
236ba09f836SElaine Zhang {3519, 0},
237ba09f836SElaine Zhang {3527, 5000},
238ba09f836SElaine Zhang {3535, 10000},
239ba09f836SElaine Zhang {3543, 15000},
240ba09f836SElaine Zhang {3551, 20000},
241ba09f836SElaine Zhang {3559, 25000},
242ba09f836SElaine Zhang {3567, 30000},
243ba09f836SElaine Zhang {3576, 35000},
244ba09f836SElaine Zhang {3584, 40000},
245ba09f836SElaine Zhang {3592, 45000},
246ba09f836SElaine Zhang {3600, 50000},
247ba09f836SElaine Zhang {3609, 55000},
248ba09f836SElaine Zhang {3617, 60000},
249ba09f836SElaine Zhang {3625, 65000},
250ba09f836SElaine Zhang {3633, 70000},
251ba09f836SElaine Zhang {3642, 75000},
252ba09f836SElaine Zhang {3650, 80000},
253ba09f836SElaine Zhang {3659, 85000},
254ba09f836SElaine Zhang {3667, 90000},
255ba09f836SElaine Zhang {3675, 95000},
256ba09f836SElaine Zhang {3684, 100000},
257ba09f836SElaine Zhang {3692, 105000},
258ba09f836SElaine Zhang {3701, 110000},
259ba09f836SElaine Zhang {3709, 115000},
260ba09f836SElaine Zhang {3718, 120000},
261ba09f836SElaine Zhang {3726, 125000},
262850ecf33SElaine Zhang {3820, MAX_TEMP},
263850ecf33SElaine Zhang {TSADCV2_DATA_MASK, MAX_TEMP},
264aeed442fSElaine Zhang };
265aeed442fSElaine Zhang
266aeed442fSElaine Zhang static const struct tsadc_table rk3228_code_table[] = {
267850ecf33SElaine Zhang {0, MIN_TEMP},
268850ecf33SElaine Zhang {568, MIN_TEMP},
269aeed442fSElaine Zhang {588, -40000},
270aeed442fSElaine Zhang {593, -35000},
271aeed442fSElaine Zhang {598, -30000},
272aeed442fSElaine Zhang {603, -25000},
273aeed442fSElaine Zhang {608, -20000},
274aeed442fSElaine Zhang {613, -15000},
275aeed442fSElaine Zhang {618, -10000},
276aeed442fSElaine Zhang {623, -5000},
277aeed442fSElaine Zhang {629, 0},
278aeed442fSElaine Zhang {634, 5000},
279aeed442fSElaine Zhang {639, 10000},
280aeed442fSElaine Zhang {644, 15000},
281aeed442fSElaine Zhang {649, 20000},
282aeed442fSElaine Zhang {654, 25000},
283aeed442fSElaine Zhang {660, 30000},
284aeed442fSElaine Zhang {665, 35000},
285aeed442fSElaine Zhang {670, 40000},
286aeed442fSElaine Zhang {675, 45000},
287aeed442fSElaine Zhang {681, 50000},
288aeed442fSElaine Zhang {686, 55000},
289aeed442fSElaine Zhang {691, 60000},
290aeed442fSElaine Zhang {696, 65000},
291aeed442fSElaine Zhang {702, 70000},
292aeed442fSElaine Zhang {707, 75000},
293aeed442fSElaine Zhang {712, 80000},
294aeed442fSElaine Zhang {717, 85000},
295aeed442fSElaine Zhang {723, 90000},
296aeed442fSElaine Zhang {728, 95000},
297aeed442fSElaine Zhang {733, 100000},
298aeed442fSElaine Zhang {738, 105000},
299aeed442fSElaine Zhang {744, 110000},
300aeed442fSElaine Zhang {749, 115000},
301aeed442fSElaine Zhang {754, 120000},
302aeed442fSElaine Zhang {760, 125000},
303850ecf33SElaine Zhang {821, MAX_TEMP},
304850ecf33SElaine Zhang {TSADCV2_DATA_MASK, MAX_TEMP},
305aeed442fSElaine Zhang };
306aeed442fSElaine Zhang
307aeed442fSElaine Zhang static const struct tsadc_table rk3288_code_table[] = {
308850ecf33SElaine Zhang {TSADCV2_DATA_MASK, MIN_TEMP},
309850ecf33SElaine Zhang {3833, MIN_TEMP},
310aeed442fSElaine Zhang {3800, -40000},
311aeed442fSElaine Zhang {3792, -35000},
312aeed442fSElaine Zhang {3783, -30000},
313aeed442fSElaine Zhang {3774, -25000},
314aeed442fSElaine Zhang {3765, -20000},
315aeed442fSElaine Zhang {3756, -15000},
316aeed442fSElaine Zhang {3747, -10000},
317aeed442fSElaine Zhang {3737, -5000},
318aeed442fSElaine Zhang {3728, 0},
319aeed442fSElaine Zhang {3718, 5000},
320aeed442fSElaine Zhang {3708, 10000},
321aeed442fSElaine Zhang {3698, 15000},
322aeed442fSElaine Zhang {3688, 20000},
323aeed442fSElaine Zhang {3678, 25000},
324aeed442fSElaine Zhang {3667, 30000},
325aeed442fSElaine Zhang {3656, 35000},
326aeed442fSElaine Zhang {3645, 40000},
327aeed442fSElaine Zhang {3634, 45000},
328aeed442fSElaine Zhang {3623, 50000},
329aeed442fSElaine Zhang {3611, 55000},
330aeed442fSElaine Zhang {3600, 60000},
331aeed442fSElaine Zhang {3588, 65000},
332aeed442fSElaine Zhang {3575, 70000},
333aeed442fSElaine Zhang {3563, 75000},
334aeed442fSElaine Zhang {3550, 80000},
335aeed442fSElaine Zhang {3537, 85000},
336aeed442fSElaine Zhang {3524, 90000},
337aeed442fSElaine Zhang {3510, 95000},
338aeed442fSElaine Zhang {3496, 100000},
339aeed442fSElaine Zhang {3482, 105000},
340aeed442fSElaine Zhang {3467, 110000},
341aeed442fSElaine Zhang {3452, 115000},
342aeed442fSElaine Zhang {3437, 120000},
343aeed442fSElaine Zhang {3421, 125000},
344850ecf33SElaine Zhang {3350, 145000},
345850ecf33SElaine Zhang {3270, 165000},
346850ecf33SElaine Zhang {3195, MAX_TEMP},
347850ecf33SElaine Zhang {0, MAX_TEMP},
348aeed442fSElaine Zhang };
349aeed442fSElaine Zhang
350aeed442fSElaine Zhang static const struct tsadc_table rk3328_code_table[] = {
351850ecf33SElaine Zhang {0, MIN_TEMP},
352850ecf33SElaine Zhang {261, MIN_TEMP},
353aeed442fSElaine Zhang {296, -40000},
354aeed442fSElaine Zhang {304, -35000},
355aeed442fSElaine Zhang {313, -30000},
356aeed442fSElaine Zhang {331, -20000},
357aeed442fSElaine Zhang {340, -15000},
358aeed442fSElaine Zhang {349, -10000},
359aeed442fSElaine Zhang {359, -5000},
360aeed442fSElaine Zhang {368, 0},
361aeed442fSElaine Zhang {378, 5000},
362aeed442fSElaine Zhang {388, 10000},
363aeed442fSElaine Zhang {398, 15000},
364aeed442fSElaine Zhang {408, 20000},
365aeed442fSElaine Zhang {418, 25000},
366aeed442fSElaine Zhang {429, 30000},
367aeed442fSElaine Zhang {440, 35000},
368aeed442fSElaine Zhang {451, 40000},
369aeed442fSElaine Zhang {462, 45000},
370aeed442fSElaine Zhang {473, 50000},
371aeed442fSElaine Zhang {485, 55000},
372aeed442fSElaine Zhang {496, 60000},
373aeed442fSElaine Zhang {508, 65000},
374aeed442fSElaine Zhang {521, 70000},
375aeed442fSElaine Zhang {533, 75000},
376aeed442fSElaine Zhang {546, 80000},
377aeed442fSElaine Zhang {559, 85000},
378aeed442fSElaine Zhang {572, 90000},
379aeed442fSElaine Zhang {586, 95000},
380aeed442fSElaine Zhang {600, 100000},
381aeed442fSElaine Zhang {614, 105000},
382aeed442fSElaine Zhang {629, 110000},
383aeed442fSElaine Zhang {644, 115000},
384aeed442fSElaine Zhang {659, 120000},
385aeed442fSElaine Zhang {675, 125000},
386850ecf33SElaine Zhang {745, 145000},
387850ecf33SElaine Zhang {825, 165000},
388850ecf33SElaine Zhang {900, MAX_TEMP},
389850ecf33SElaine Zhang {TSADCV2_DATA_MASK, MAX_TEMP},
390aeed442fSElaine Zhang };
391aeed442fSElaine Zhang
392aeed442fSElaine Zhang static const struct tsadc_table rk3368_code_table[] = {
393850ecf33SElaine Zhang {0, MIN_TEMP},
394850ecf33SElaine Zhang {98, MIN_TEMP},
395aeed442fSElaine Zhang {106, -40000},
396aeed442fSElaine Zhang {108, -35000},
397aeed442fSElaine Zhang {110, -30000},
398aeed442fSElaine Zhang {112, -25000},
399aeed442fSElaine Zhang {114, -20000},
400aeed442fSElaine Zhang {116, -15000},
401aeed442fSElaine Zhang {118, -10000},
402aeed442fSElaine Zhang {120, -5000},
403aeed442fSElaine Zhang {122, 0},
404aeed442fSElaine Zhang {124, 5000},
405aeed442fSElaine Zhang {126, 10000},
406aeed442fSElaine Zhang {128, 15000},
407aeed442fSElaine Zhang {130, 20000},
408aeed442fSElaine Zhang {132, 25000},
409aeed442fSElaine Zhang {134, 30000},
410aeed442fSElaine Zhang {136, 35000},
411aeed442fSElaine Zhang {138, 40000},
412aeed442fSElaine Zhang {140, 45000},
413aeed442fSElaine Zhang {142, 50000},
414aeed442fSElaine Zhang {144, 55000},
415aeed442fSElaine Zhang {146, 60000},
416aeed442fSElaine Zhang {148, 65000},
417aeed442fSElaine Zhang {150, 70000},
418aeed442fSElaine Zhang {152, 75000},
419aeed442fSElaine Zhang {154, 80000},
420aeed442fSElaine Zhang {156, 85000},
421aeed442fSElaine Zhang {158, 90000},
422aeed442fSElaine Zhang {160, 95000},
423aeed442fSElaine Zhang {162, 100000},
424aeed442fSElaine Zhang {163, 105000},
425aeed442fSElaine Zhang {165, 110000},
426aeed442fSElaine Zhang {167, 115000},
427aeed442fSElaine Zhang {169, 120000},
428aeed442fSElaine Zhang {171, 125000},
429850ecf33SElaine Zhang {193, MAX_TEMP},
430850ecf33SElaine Zhang {TSADCV3_DATA_MASK, MAX_TEMP},
431aeed442fSElaine Zhang };
432aeed442fSElaine Zhang
433aeed442fSElaine Zhang static const struct tsadc_table rk3399_code_table[] = {
434850ecf33SElaine Zhang {0, MIN_TEMP},
435850ecf33SElaine Zhang {368, MIN_TEMP},
436aeed442fSElaine Zhang {402, -40000},
437aeed442fSElaine Zhang {410, -35000},
438aeed442fSElaine Zhang {419, -30000},
439aeed442fSElaine Zhang {427, -25000},
440aeed442fSElaine Zhang {436, -20000},
441aeed442fSElaine Zhang {444, -15000},
442aeed442fSElaine Zhang {453, -10000},
443aeed442fSElaine Zhang {461, -5000},
444aeed442fSElaine Zhang {470, 0},
445aeed442fSElaine Zhang {478, 5000},
446aeed442fSElaine Zhang {487, 10000},
447aeed442fSElaine Zhang {496, 15000},
448aeed442fSElaine Zhang {504, 20000},
449aeed442fSElaine Zhang {513, 25000},
450aeed442fSElaine Zhang {521, 30000},
451aeed442fSElaine Zhang {530, 35000},
452aeed442fSElaine Zhang {538, 40000},
453aeed442fSElaine Zhang {547, 45000},
454aeed442fSElaine Zhang {555, 50000},
455aeed442fSElaine Zhang {564, 55000},
456aeed442fSElaine Zhang {573, 60000},
457aeed442fSElaine Zhang {581, 65000},
458aeed442fSElaine Zhang {590, 70000},
459aeed442fSElaine Zhang {599, 75000},
460aeed442fSElaine Zhang {607, 80000},
461aeed442fSElaine Zhang {616, 85000},
462aeed442fSElaine Zhang {624, 90000},
463aeed442fSElaine Zhang {633, 95000},
464aeed442fSElaine Zhang {642, 100000},
465aeed442fSElaine Zhang {650, 105000},
466aeed442fSElaine Zhang {659, 110000},
467aeed442fSElaine Zhang {668, 115000},
468aeed442fSElaine Zhang {677, 120000},
469aeed442fSElaine Zhang {685, 125000},
470850ecf33SElaine Zhang {782, MAX_TEMP},
471850ecf33SElaine Zhang {TSADCV3_DATA_MASK, MAX_TEMP},
472aeed442fSElaine Zhang };
473aeed442fSElaine Zhang
47455f74c72SShaohan Yao static const struct tsadc_table rk3528_code_table[] = {
475850ecf33SElaine Zhang {0, MIN_TEMP},
476850ecf33SElaine Zhang {1386, MIN_TEMP},
47755f74c72SShaohan Yao {1419, -40000},
47855f74c72SShaohan Yao {1427, -35000},
47955f74c72SShaohan Yao {1435, -30000},
48055f74c72SShaohan Yao {1443, -25000},
48155f74c72SShaohan Yao {1452, -20000},
48255f74c72SShaohan Yao {1460, -15000},
48355f74c72SShaohan Yao {1468, -10000},
48455f74c72SShaohan Yao {1477, -5000},
48555f74c72SShaohan Yao {1486, 0},
48655f74c72SShaohan Yao {1494, 5000},
48755f74c72SShaohan Yao {1502, 10000},
48855f74c72SShaohan Yao {1510, 15000},
48955f74c72SShaohan Yao {1519, 20000},
49055f74c72SShaohan Yao {1527, 25000},
49155f74c72SShaohan Yao {1535, 30000},
49255f74c72SShaohan Yao {1544, 35000},
49355f74c72SShaohan Yao {1552, 40000},
49455f74c72SShaohan Yao {1561, 45000},
49555f74c72SShaohan Yao {1569, 50000},
49655f74c72SShaohan Yao {1578, 55000},
49755f74c72SShaohan Yao {1586, 60000},
49855f74c72SShaohan Yao {1594, 65000},
49955f74c72SShaohan Yao {1603, 70000},
50055f74c72SShaohan Yao {1612, 75000},
50155f74c72SShaohan Yao {1620, 80000},
50255f74c72SShaohan Yao {1628, 85000},
50355f74c72SShaohan Yao {1637, 90000},
50455f74c72SShaohan Yao {1646, 95000},
50555f74c72SShaohan Yao {1654, 100000},
50655f74c72SShaohan Yao {1662, 105000},
50755f74c72SShaohan Yao {1671, 110000},
50855f74c72SShaohan Yao {1679, 115000},
50955f74c72SShaohan Yao {1688, 120000},
51055f74c72SShaohan Yao {1696, 125000},
511850ecf33SElaine Zhang {1790, MAX_TEMP},
512850ecf33SElaine Zhang {TSADCV5_DATA_MASK, MAX_TEMP},
51355f74c72SShaohan Yao };
51455f74c72SShaohan Yao
51571dcb579SElaine Zhang static const struct tsadc_table rk3562_code_table[] = {
516850ecf33SElaine Zhang {0, MIN_TEMP},
517850ecf33SElaine Zhang {1385, MIN_TEMP},
51871dcb579SElaine Zhang {1419, -40000},
51971dcb579SElaine Zhang {1428, -35000},
52071dcb579SElaine Zhang {1436, -30000},
52171dcb579SElaine Zhang {1445, -25000},
52271dcb579SElaine Zhang {1453, -20000},
52371dcb579SElaine Zhang {1462, -15000},
52471dcb579SElaine Zhang {1470, -10000},
52571dcb579SElaine Zhang {1479, -5000},
52671dcb579SElaine Zhang {1487, 0},
52771dcb579SElaine Zhang {1496, 5000},
52871dcb579SElaine Zhang {1504, 10000},
52971dcb579SElaine Zhang {1512, 15000},
53071dcb579SElaine Zhang {1521, 20000},
53171dcb579SElaine Zhang {1529, 25000},
53271dcb579SElaine Zhang {1538, 30000},
53371dcb579SElaine Zhang {1546, 35000},
53471dcb579SElaine Zhang {1555, 40000},
53571dcb579SElaine Zhang {1563, 45000},
53671dcb579SElaine Zhang {1572, 50000},
53771dcb579SElaine Zhang {1580, 55000},
53871dcb579SElaine Zhang {1589, 60000},
53971dcb579SElaine Zhang {1598, 65000},
54071dcb579SElaine Zhang {1606, 70000},
54171dcb579SElaine Zhang {1615, 75000},
54271dcb579SElaine Zhang {1623, 80000},
54371dcb579SElaine Zhang {1632, 85000},
54471dcb579SElaine Zhang {1640, 90000},
54571dcb579SElaine Zhang {1648, 95000},
54671dcb579SElaine Zhang {1657, 100000},
54771dcb579SElaine Zhang {1666, 105000},
54871dcb579SElaine Zhang {1674, 110000},
54971dcb579SElaine Zhang {1682, 115000},
55071dcb579SElaine Zhang {1691, 120000},
55171dcb579SElaine Zhang {1699, 125000},
552850ecf33SElaine Zhang {1793, MAX_TEMP},
553850ecf33SElaine Zhang {TSADCV2_DATA_MASK, MAX_TEMP},
55471dcb579SElaine Zhang };
55571dcb579SElaine Zhang
5562f5dff11SElaine Zhang static const struct tsadc_table rk3568_code_table[] = {
557850ecf33SElaine Zhang {0, MIN_TEMP},
558850ecf33SElaine Zhang {1448, MIN_TEMP},
5592f5dff11SElaine Zhang {1584, -40000},
5602f5dff11SElaine Zhang {1620, -35000},
5612f5dff11SElaine Zhang {1652, -30000},
5622f5dff11SElaine Zhang {1688, -25000},
5632f5dff11SElaine Zhang {1720, -20000},
5642f5dff11SElaine Zhang {1756, -15000},
5652f5dff11SElaine Zhang {1788, -10000},
5662f5dff11SElaine Zhang {1824, -5000},
5672f5dff11SElaine Zhang {1856, 0},
5682f5dff11SElaine Zhang {1892, 5000},
5692f5dff11SElaine Zhang {1924, 10000},
5702f5dff11SElaine Zhang {1956, 15000},
5712f5dff11SElaine Zhang {1992, 20000},
5722f5dff11SElaine Zhang {2024, 25000},
5732f5dff11SElaine Zhang {2060, 30000},
5742f5dff11SElaine Zhang {2092, 35000},
5752f5dff11SElaine Zhang {2128, 40000},
5762f5dff11SElaine Zhang {2160, 45000},
5772f5dff11SElaine Zhang {2196, 50000},
5782f5dff11SElaine Zhang {2228, 55000},
5792f5dff11SElaine Zhang {2264, 60000},
5802f5dff11SElaine Zhang {2300, 65000},
5812f5dff11SElaine Zhang {2332, 70000},
5822f5dff11SElaine Zhang {2368, 75000},
5832f5dff11SElaine Zhang {2400, 80000},
5842f5dff11SElaine Zhang {2436, 85000},
5852f5dff11SElaine Zhang {2468, 90000},
5862f5dff11SElaine Zhang {2500, 95000},
5872f5dff11SElaine Zhang {2536, 100000},
5882f5dff11SElaine Zhang {2572, 105000},
5892f5dff11SElaine Zhang {2604, 110000},
5902f5dff11SElaine Zhang {2636, 115000},
5912f5dff11SElaine Zhang {2672, 120000},
5922f5dff11SElaine Zhang {2704, 125000},
593850ecf33SElaine Zhang {3076, MAX_TEMP},
594850ecf33SElaine Zhang {TSADCV2_DATA_MASK, MAX_TEMP},
5952f5dff11SElaine Zhang };
5962f5dff11SElaine Zhang
597198f0697SFinley Xiao static const struct tsadc_table rk3588_code_table[] = {
598850ecf33SElaine Zhang {0, MIN_TEMP},
599850ecf33SElaine Zhang {194, MIN_TEMP},
600198f0697SFinley Xiao {215, -40000},
601198f0697SFinley Xiao {285, 25000},
602198f0697SFinley Xiao {350, 85000},
603198f0697SFinley Xiao {395, 125000},
604850ecf33SElaine Zhang {455, MAX_TEMP},
605850ecf33SElaine Zhang {TSADCV4_DATA_MASK, MAX_TEMP},
606198f0697SFinley Xiao };
607198f0697SFinley Xiao
608aeed442fSElaine Zhang /*
609aeed442fSElaine Zhang * Struct used for matching a device
610aeed442fSElaine Zhang */
611aeed442fSElaine Zhang struct of_device_id {
612aeed442fSElaine Zhang char compatible[32];
613aeed442fSElaine Zhang const void *data;
614aeed442fSElaine Zhang };
615aeed442fSElaine Zhang
tsadc_code_to_temp(struct chip_tsadc_table * table,u32 code,int * temp)616aeed442fSElaine Zhang static int tsadc_code_to_temp(struct chip_tsadc_table *table, u32 code,
617aeed442fSElaine Zhang int *temp)
618aeed442fSElaine Zhang {
619aeed442fSElaine Zhang unsigned int low = 1;
620aeed442fSElaine Zhang unsigned int high = table->length - 1;
621aeed442fSElaine Zhang unsigned int mid = (low + high) / 2;
622aeed442fSElaine Zhang unsigned int num;
623aeed442fSElaine Zhang unsigned long denom;
624aeed442fSElaine Zhang
625082f45b4SFinley Xiao if (table->knum) {
626082f45b4SFinley Xiao *temp = (((int)code - table->bnum) * 10000 / table->knum) * 100;
627082f45b4SFinley Xiao if (*temp < MIN_TEMP || *temp > MAX_TEMP)
628082f45b4SFinley Xiao return -EAGAIN;
629082f45b4SFinley Xiao return 0;
630082f45b4SFinley Xiao }
631082f45b4SFinley Xiao
632aeed442fSElaine Zhang switch (table->mode) {
633aeed442fSElaine Zhang case ADC_DECREMENT:
634aeed442fSElaine Zhang code &= table->data_mask;
635aeed442fSElaine Zhang if (code < table->id[high].code)
636aeed442fSElaine Zhang return -EAGAIN; /* Incorrect reading */
637aeed442fSElaine Zhang
638aeed442fSElaine Zhang while (low <= high) {
639aeed442fSElaine Zhang if (code >= table->id[mid].code &&
640aeed442fSElaine Zhang code < table->id[mid - 1].code)
641aeed442fSElaine Zhang break;
642aeed442fSElaine Zhang else if (code < table->id[mid].code)
643aeed442fSElaine Zhang low = mid + 1;
644aeed442fSElaine Zhang else
645aeed442fSElaine Zhang high = mid - 1;
646aeed442fSElaine Zhang
647aeed442fSElaine Zhang mid = (low + high) / 2;
648aeed442fSElaine Zhang }
649aeed442fSElaine Zhang break;
650aeed442fSElaine Zhang case ADC_INCREMENT:
651aeed442fSElaine Zhang code &= table->data_mask;
652aeed442fSElaine Zhang if (code < table->id[low].code)
653aeed442fSElaine Zhang return -EAGAIN; /* Incorrect reading */
654aeed442fSElaine Zhang
655aeed442fSElaine Zhang while (low <= high) {
656aeed442fSElaine Zhang if (code <= table->id[mid].code &&
657aeed442fSElaine Zhang code > table->id[mid - 1].code)
658aeed442fSElaine Zhang break;
659aeed442fSElaine Zhang else if (code > table->id[mid].code)
660aeed442fSElaine Zhang low = mid + 1;
661aeed442fSElaine Zhang else
662aeed442fSElaine Zhang high = mid - 1;
663aeed442fSElaine Zhang
664aeed442fSElaine Zhang mid = (low + high) / 2;
665aeed442fSElaine Zhang }
666aeed442fSElaine Zhang break;
667aeed442fSElaine Zhang default:
668aeed442fSElaine Zhang printf("%s: Invalid the conversion table mode=%d\n",
669aeed442fSElaine Zhang __func__, table->mode);
670aeed442fSElaine Zhang return -EINVAL;
671aeed442fSElaine Zhang }
672aeed442fSElaine Zhang
673aeed442fSElaine Zhang /*
674aeed442fSElaine Zhang * The 5C granularity provided by the table is too much. Let's
675aeed442fSElaine Zhang * assume that the relationship between sensor readings and
676aeed442fSElaine Zhang * temperature between 2 table entries is linear and interpolate
677aeed442fSElaine Zhang * to produce less granular result.
678aeed442fSElaine Zhang */
679aeed442fSElaine Zhang num = table->id[mid].temp - table->id[mid - 1].temp;
680aeed442fSElaine Zhang num *= abs(table->id[mid - 1].code - code);
681aeed442fSElaine Zhang denom = abs(table->id[mid - 1].code - table->id[mid].code);
682aeed442fSElaine Zhang *temp = table->id[mid - 1].temp + (num / denom);
683aeed442fSElaine Zhang
684aeed442fSElaine Zhang return 0;
685aeed442fSElaine Zhang }
686aeed442fSElaine Zhang
tsadc_temp_to_code_v2(struct chip_tsadc_table table,int temp)687aeed442fSElaine Zhang static u32 tsadc_temp_to_code_v2(struct chip_tsadc_table table,
688aeed442fSElaine Zhang int temp)
689aeed442fSElaine Zhang {
690aeed442fSElaine Zhang int high, low, mid;
691198f0697SFinley Xiao unsigned long num;
692198f0697SFinley Xiao unsigned int denom;
693aeed442fSElaine Zhang u32 error = table.data_mask;
694aeed442fSElaine Zhang
695082f45b4SFinley Xiao if (table.knum)
696082f45b4SFinley Xiao return (((temp / 1000) * table.knum) / 1000 + table.bnum);
697082f45b4SFinley Xiao
698aeed442fSElaine Zhang low = 0;
699aeed442fSElaine Zhang high = table.length - 1;
700aeed442fSElaine Zhang mid = (high + low) / 2;
701aeed442fSElaine Zhang
702aeed442fSElaine Zhang /* Return mask code data when the temp is over table range */
703aeed442fSElaine Zhang if (temp < table.id[low].temp || temp > table.id[high].temp)
704aeed442fSElaine Zhang goto exit;
705aeed442fSElaine Zhang
706aeed442fSElaine Zhang while (low <= high) {
707aeed442fSElaine Zhang if (temp == table.id[mid].temp)
708aeed442fSElaine Zhang return table.id[mid].code;
709aeed442fSElaine Zhang else if (temp < table.id[mid].temp)
710aeed442fSElaine Zhang high = mid - 1;
711aeed442fSElaine Zhang else
712aeed442fSElaine Zhang low = mid + 1;
713aeed442fSElaine Zhang mid = (low + high) / 2;
714aeed442fSElaine Zhang }
715aeed442fSElaine Zhang
716198f0697SFinley Xiao num = abs(table.id[mid + 1].code - table.id[mid].code);
717198f0697SFinley Xiao num *= temp - table.id[mid].temp;
718198f0697SFinley Xiao denom = table.id[mid + 1].temp - table.id[mid].temp;
719198f0697SFinley Xiao
720198f0697SFinley Xiao switch (table.mode) {
721198f0697SFinley Xiao case ADC_DECREMENT:
722198f0697SFinley Xiao return table.id[mid].code - (num / denom);
723198f0697SFinley Xiao case ADC_INCREMENT:
724198f0697SFinley Xiao return table.id[mid].code + (num / denom);
725198f0697SFinley Xiao default:
726198f0697SFinley Xiao pr_err("%s: unknown table mode: %d\n", __func__, table.mode);
727198f0697SFinley Xiao return error;
728198f0697SFinley Xiao }
729198f0697SFinley Xiao
730aeed442fSElaine Zhang exit:
731aeed442fSElaine Zhang pr_err("%s: Invalid conversion table: code=%d, temperature=%d\n",
732aeed442fSElaine Zhang __func__, error, temp);
733aeed442fSElaine Zhang
734aeed442fSElaine Zhang return error;
735aeed442fSElaine Zhang }
736aeed442fSElaine Zhang
tsadc_irq_ack_v2(struct udevice * dev)737aeed442fSElaine Zhang static void tsadc_irq_ack_v2(struct udevice *dev)
738aeed442fSElaine Zhang {
739aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
740aeed442fSElaine Zhang u32 val;
741aeed442fSElaine Zhang
742aeed442fSElaine Zhang val = readl(priv->base + TSADCV2_INT_PD);
743aeed442fSElaine Zhang writel(val & TSADCV2_INT_PD_CLEAR_MASK, priv->base + TSADCV2_INT_PD);
744aeed442fSElaine Zhang }
745aeed442fSElaine Zhang
tsadc_irq_ack_v3(struct udevice * dev)746aeed442fSElaine Zhang static void tsadc_irq_ack_v3(struct udevice *dev)
747aeed442fSElaine Zhang {
748aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
749aeed442fSElaine Zhang u32 val;
750aeed442fSElaine Zhang
751aeed442fSElaine Zhang val = readl(priv->base + TSADCV2_INT_PD);
752aeed442fSElaine Zhang writel(val & TSADCV3_INT_PD_CLEAR_MASK, priv->base + TSADCV2_INT_PD);
753aeed442fSElaine Zhang }
754aeed442fSElaine Zhang
tsadc_irq_ack_v4(struct udevice * dev)755198f0697SFinley Xiao static void tsadc_irq_ack_v4(struct udevice *dev)
756198f0697SFinley Xiao {
757198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
758198f0697SFinley Xiao u32 val;
759198f0697SFinley Xiao
760198f0697SFinley Xiao val = readl(priv->base + TSADCV3_INT_PD);
761198f0697SFinley Xiao writel(val & TSADCV4_INT_PD_CLEAR_MASK, priv->base + TSADCV3_INT_PD);
762198f0697SFinley Xiao val = readl(priv->base + TSADCV3_HSHUT_PD);
763198f0697SFinley Xiao writel(val & TSADCV3_INT_PD_CLEAR_MASK, priv->base + TSADCV3_HSHUT_PD);
764198f0697SFinley Xiao }
765198f0697SFinley Xiao
tsadc_control_v2(struct udevice * dev,bool enable)766198f0697SFinley Xiao static void tsadc_control_v2(struct udevice *dev, bool enable)
767198f0697SFinley Xiao {
768198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
769198f0697SFinley Xiao u32 val;
770198f0697SFinley Xiao
771198f0697SFinley Xiao val = readl(priv->base + TSADCV2_AUTO_CON);
772198f0697SFinley Xiao if (enable)
773198f0697SFinley Xiao val |= TSADCV2_AUTO_EN;
774198f0697SFinley Xiao else
775198f0697SFinley Xiao val &= ~TSADCV2_AUTO_EN;
776198f0697SFinley Xiao
777198f0697SFinley Xiao writel(val, priv->base + TSADCV2_AUTO_CON);
778198f0697SFinley Xiao }
779198f0697SFinley Xiao
tsadc_control_v3(struct udevice * dev,bool enable)780aeed442fSElaine Zhang static void tsadc_control_v3(struct udevice *dev, bool enable)
781aeed442fSElaine Zhang {
782aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
783aeed442fSElaine Zhang u32 val;
784aeed442fSElaine Zhang
785aeed442fSElaine Zhang val = readl(priv->base + TSADCV2_AUTO_CON);
786aeed442fSElaine Zhang if (enable)
787aeed442fSElaine Zhang val |= TSADCV2_AUTO_EN | TSADCV3_AUTO_Q_SEL_EN;
788aeed442fSElaine Zhang else
789aeed442fSElaine Zhang val &= ~TSADCV2_AUTO_EN;
790aeed442fSElaine Zhang
791aeed442fSElaine Zhang writel(val, priv->base + TSADCV2_AUTO_CON);
792aeed442fSElaine Zhang }
793aeed442fSElaine Zhang
tsadc_control_v4(struct udevice * dev,bool enable)794198f0697SFinley Xiao static void tsadc_control_v4(struct udevice *dev, bool enable)
795aeed442fSElaine Zhang {
796aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
797aeed442fSElaine Zhang u32 val;
798aeed442fSElaine Zhang
799aeed442fSElaine Zhang if (enable)
800198f0697SFinley Xiao val = TSADCV2_AUTO_EN | TSADCV2_AUTO_EN_MASK;
801aeed442fSElaine Zhang else
802198f0697SFinley Xiao val = TSADCV2_AUTO_EN_MASK;
803aeed442fSElaine Zhang
804aeed442fSElaine Zhang writel(val, priv->base + TSADCV2_AUTO_CON);
805aeed442fSElaine Zhang }
806aeed442fSElaine Zhang
tsadc_init_v2(struct udevice * dev)807aeed442fSElaine Zhang static void tsadc_init_v2(struct udevice *dev)
808aeed442fSElaine Zhang {
809aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
810aeed442fSElaine Zhang
811aeed442fSElaine Zhang writel(TSADCV2_AUTO_PERIOD_TIME,
812aeed442fSElaine Zhang priv->base + TSADCV2_AUTO_PERIOD);
813aeed442fSElaine Zhang writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
814aeed442fSElaine Zhang priv->base + TSADCV2_HIGHT_INT_DEBOUNCE);
815aeed442fSElaine Zhang writel(TSADCV2_AUTO_PERIOD_HT_TIME,
816aeed442fSElaine Zhang priv->base + TSADCV2_AUTO_PERIOD_HT);
817aeed442fSElaine Zhang writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
818aeed442fSElaine Zhang priv->base + TSADCV2_HIGHT_TSHUT_DEBOUNCE);
819aeed442fSElaine Zhang
8204585497aSElaine Zhang if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
821aeed442fSElaine Zhang writel(0U | TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
822aeed442fSElaine Zhang priv->base + TSADCV2_AUTO_CON);
823aeed442fSElaine Zhang else
824aeed442fSElaine Zhang writel(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
825aeed442fSElaine Zhang priv->base + TSADCV2_AUTO_CON);
826aeed442fSElaine Zhang }
827aeed442fSElaine Zhang
tsadc_init_v3(struct udevice * dev)828aeed442fSElaine Zhang static void tsadc_init_v3(struct udevice *dev)
829aeed442fSElaine Zhang {
830aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
831aeed442fSElaine Zhang
832aeed442fSElaine Zhang if (!IS_ERR(priv->grf)) {
833aeed442fSElaine Zhang writel(GRF_TSADC_VCM_EN_L, priv->grf + GRF_TSADC_TESTBIT_L);
834aeed442fSElaine Zhang writel(GRF_TSADC_VCM_EN_H, priv->grf + GRF_TSADC_TESTBIT_H);
835aeed442fSElaine Zhang
836aeed442fSElaine Zhang udelay(100);/* The spec note says at least 15 us */
837aeed442fSElaine Zhang writel(GRF_SARADC_TESTBIT_ON, priv->grf + GRF_SARADC_TESTBIT);
838aeed442fSElaine Zhang writel(GRF_TSADC_TESTBIT_H_ON, priv->grf + GRF_TSADC_TESTBIT_H);
839aeed442fSElaine Zhang udelay(200);/* The spec note says at least 90 us */
840aeed442fSElaine Zhang }
841aeed442fSElaine Zhang tsadc_init_v2(dev);
842aeed442fSElaine Zhang }
843aeed442fSElaine Zhang
tsadc_init_v5(struct udevice * dev)844aeed442fSElaine Zhang static void __maybe_unused tsadc_init_v5(struct udevice *dev)
845aeed442fSElaine Zhang {
846aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
847aeed442fSElaine Zhang
848aeed442fSElaine Zhang /* Set interleave value to workround ic time sync issue */
849aeed442fSElaine Zhang writel(TSADCV2_USER_INTER_PD_SOC, priv->base +
850aeed442fSElaine Zhang TSADCV2_USER_CON);
851aeed442fSElaine Zhang tsadc_init_v2(dev);
852aeed442fSElaine Zhang }
853aeed442fSElaine Zhang
tsadc_init_v4(struct udevice * dev)854aeed442fSElaine Zhang static void tsadc_init_v4(struct udevice *dev)
855aeed442fSElaine Zhang {
856aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
857aeed442fSElaine Zhang
858aeed442fSElaine Zhang tsadc_init_v2(dev);
859aeed442fSElaine Zhang if (!IS_ERR(priv->grf))
860aeed442fSElaine Zhang writel(GRF_CON_TSADC_CH_INV, priv->grf + PX30_GRF_SOC_CON2);
861aeed442fSElaine Zhang }
862aeed442fSElaine Zhang
tsadc_init_v7(struct udevice * dev)8632f5dff11SElaine Zhang static void tsadc_init_v7(struct udevice *dev)
8642f5dff11SElaine Zhang {
8652f5dff11SElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
8662f5dff11SElaine Zhang
8672f5dff11SElaine Zhang writel(TSADCV5_USER_INTER_PD_SOC,
8682f5dff11SElaine Zhang priv->base + TSADCV2_USER_CON);
8692f5dff11SElaine Zhang writel(TSADCV5_AUTO_PERIOD_TIME,
8702f5dff11SElaine Zhang priv->base + TSADCV2_AUTO_PERIOD);
8712f5dff11SElaine Zhang writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
8722f5dff11SElaine Zhang priv->base + TSADCV2_HIGHT_INT_DEBOUNCE);
8732f5dff11SElaine Zhang writel(TSADCV5_AUTO_PERIOD_HT_TIME,
8742f5dff11SElaine Zhang priv->base + TSADCV2_AUTO_PERIOD_HT);
8752f5dff11SElaine Zhang writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
8762f5dff11SElaine Zhang priv->base + TSADCV2_HIGHT_TSHUT_DEBOUNCE);
8772f5dff11SElaine Zhang
8782f5dff11SElaine Zhang if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
8792f5dff11SElaine Zhang writel(0U | TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
8802f5dff11SElaine Zhang priv->base + TSADCV2_AUTO_CON);
8812f5dff11SElaine Zhang else
8822f5dff11SElaine Zhang writel(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
8832f5dff11SElaine Zhang priv->base + TSADCV2_AUTO_CON);
8842f5dff11SElaine Zhang
8852f5dff11SElaine Zhang if (!IS_ERR(priv->grf)) {
8862f5dff11SElaine Zhang writel(RK3568_GRF_TSADC_TSEN,
8872f5dff11SElaine Zhang priv->grf + RK3568_GRF_TSADC_CON);
8882f5dff11SElaine Zhang udelay(15);
8892f5dff11SElaine Zhang writel(RK3568_GRF_TSADC_ANA_REG0,
8902f5dff11SElaine Zhang priv->grf + RK3568_GRF_TSADC_CON);
8912f5dff11SElaine Zhang writel(RK3568_GRF_TSADC_ANA_REG1,
8922f5dff11SElaine Zhang priv->grf + RK3568_GRF_TSADC_CON);
8932f5dff11SElaine Zhang writel(RK3568_GRF_TSADC_ANA_REG2,
8942f5dff11SElaine Zhang priv->grf + RK3568_GRF_TSADC_CON);
8952f5dff11SElaine Zhang udelay(200);
8962f5dff11SElaine Zhang }
8972f5dff11SElaine Zhang }
8982f5dff11SElaine Zhang
tsadc_init_v8(struct udevice * dev)899198f0697SFinley Xiao static void tsadc_init_v8(struct udevice *dev)
900198f0697SFinley Xiao {
901198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
902198f0697SFinley Xiao
903198f0697SFinley Xiao writel(TSADCV6_AUTO_PERIOD_TIME, priv->base + TSADCV3_AUTO_PERIOD);
904198f0697SFinley Xiao writel(TSADCV6_AUTO_PERIOD_HT_TIME,
905198f0697SFinley Xiao priv->base + TSADCV3_AUTO_PERIOD_HT);
906198f0697SFinley Xiao writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
907198f0697SFinley Xiao priv->base + TSADCV3_HIGHT_INT_DEBOUNCE);
908198f0697SFinley Xiao writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
909198f0697SFinley Xiao priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
910198f0697SFinley Xiao
911198f0697SFinley Xiao if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
912198f0697SFinley Xiao writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
913198f0697SFinley Xiao TSADCV2_AUTO_TSHUT_POLARITY_MASK,
914198f0697SFinley Xiao priv->base + TSADCV2_AUTO_CON);
915198f0697SFinley Xiao else
916198f0697SFinley Xiao writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
917198f0697SFinley Xiao priv->base + TSADCV2_AUTO_CON);
91831f36c58SFinley Xiao };
91931f36c58SFinley Xiao
tsadc_init_v9(struct udevice * dev)92031f36c58SFinley Xiao static void tsadc_init_v9(struct udevice *dev)
92131f36c58SFinley Xiao {
92231f36c58SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
92331f36c58SFinley Xiao
92431f36c58SFinley Xiao tsadc_init_v2(dev);
92531f36c58SFinley Xiao if (!IS_ERR(priv->grf))
92631f36c58SFinley Xiao writel(PX30S_TSADC_TDC_MODE, priv->grf + PX30_GRF_SOC_CON0);
927198f0697SFinley Xiao }
928198f0697SFinley Xiao
tsadc_init_v11(struct udevice * dev)92955f74c72SShaohan Yao static void tsadc_init_v11(struct udevice *dev)
93055f74c72SShaohan Yao {
93155f74c72SShaohan Yao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
93255f74c72SShaohan Yao
93355f74c72SShaohan Yao writel(TSADCV7_AUTO_PERIOD_TIME, priv->base + TSADCV3_AUTO_PERIOD);
93455f74c72SShaohan Yao writel(TSADCV7_AUTO_PERIOD_HT_TIME,
93555f74c72SShaohan Yao priv->base + TSADCV3_AUTO_PERIOD_HT);
93655f74c72SShaohan Yao writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
93755f74c72SShaohan Yao priv->base + TSADCV3_HIGHT_INT_DEBOUNCE);
93855f74c72SShaohan Yao writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
93955f74c72SShaohan Yao priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
94055f74c72SShaohan Yao writel(TSADCV3_Q_MAX_VAL, priv->base + TSADCV3_Q_MAX);
94155f74c72SShaohan Yao writel(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
94255f74c72SShaohan Yao priv->base + TSADCV2_AUTO_CON);
94355f74c72SShaohan Yao
94455f74c72SShaohan Yao if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
94555f74c72SShaohan Yao writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
94655f74c72SShaohan Yao TSADCV2_AUTO_TSHUT_POLARITY_MASK,
94755f74c72SShaohan Yao priv->base + TSADCV2_AUTO_CON);
94855f74c72SShaohan Yao else
94955f74c72SShaohan Yao writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
95055f74c72SShaohan Yao priv->base + TSADCV2_AUTO_CON);
95155f74c72SShaohan Yao
95255f74c72SShaohan Yao if (!IS_ERR(priv->grf)) {
95355f74c72SShaohan Yao writel(RK3568_GRF_TSADC_TSEN,
95455f74c72SShaohan Yao priv->grf + RK3528_GRF_TSADC_CON);
95555f74c72SShaohan Yao udelay(15);
95655f74c72SShaohan Yao writel(RK3568_GRF_TSADC_ANA_REG0,
95755f74c72SShaohan Yao priv->grf + RK3528_GRF_TSADC_CON);
95855f74c72SShaohan Yao writel(RK3568_GRF_TSADC_ANA_REG1,
95955f74c72SShaohan Yao priv->grf + RK3528_GRF_TSADC_CON);
96055f74c72SShaohan Yao writel(RK3568_GRF_TSADC_ANA_REG2,
96155f74c72SShaohan Yao priv->grf + RK3528_GRF_TSADC_CON);
96255f74c72SShaohan Yao udelay(200);
96355f74c72SShaohan Yao }
96455f74c72SShaohan Yao }
96555f74c72SShaohan Yao
tsadc_init_v12(struct udevice * dev)96671dcb579SElaine Zhang static void tsadc_init_v12(struct udevice *dev)
96771dcb579SElaine Zhang {
96871dcb579SElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
96971dcb579SElaine Zhang
97071dcb579SElaine Zhang writel(TSADCV12_AUTO_PERIOD_TIME,
97171dcb579SElaine Zhang priv->base + TSADCV3_AUTO_PERIOD);
97271dcb579SElaine Zhang writel(TSADCV12_AUTO_PERIOD_HT_TIME,
97371dcb579SElaine Zhang priv->base + TSADCV3_AUTO_PERIOD_HT);
97471dcb579SElaine Zhang writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
97571dcb579SElaine Zhang priv->base + TSADCV3_HIGHT_INT_DEBOUNCE);
97671dcb579SElaine Zhang writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
97771dcb579SElaine Zhang priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
97871dcb579SElaine Zhang writel(TSADCV12_Q_MAX_VAL,
97971dcb579SElaine Zhang priv->base + TSADCV9_Q_MAX);
98071dcb579SElaine Zhang writel(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
98171dcb579SElaine Zhang priv->base + TSADCV2_AUTO_CON);
98271dcb579SElaine Zhang if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
98371dcb579SElaine Zhang writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
98471dcb579SElaine Zhang TSADCV2_AUTO_TSHUT_POLARITY_MASK,
98571dcb579SElaine Zhang priv->base + TSADCV2_AUTO_CON);
98671dcb579SElaine Zhang else
98771dcb579SElaine Zhang writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
98871dcb579SElaine Zhang priv->base + TSADCV2_AUTO_CON);
98971dcb579SElaine Zhang
99071dcb579SElaine Zhang if (!IS_ERR(priv->grf)) {
99171dcb579SElaine Zhang writel(RK3568_GRF_TSADC_TSEN,
99271dcb579SElaine Zhang priv->grf + RK3562_GRF_TSADC_CON);
99371dcb579SElaine Zhang udelay(15);
99471dcb579SElaine Zhang writel(RK3568_GRF_TSADC_ANA_REG0,
99571dcb579SElaine Zhang priv->grf + RK3562_GRF_TSADC_CON);
99671dcb579SElaine Zhang writel(RK3568_GRF_TSADC_ANA_REG1,
99771dcb579SElaine Zhang priv->grf + RK3562_GRF_TSADC_CON);
99871dcb579SElaine Zhang writel(RK3568_GRF_TSADC_ANA_REG2,
99971dcb579SElaine Zhang priv->grf + RK3562_GRF_TSADC_CON);
100071dcb579SElaine Zhang udelay(200);
100171dcb579SElaine Zhang }
100271dcb579SElaine Zhang }
100371dcb579SElaine Zhang
tsadc_get_temp_v2(struct udevice * dev,int chn,int * temp)1004aeed442fSElaine Zhang static int tsadc_get_temp_v2(struct udevice *dev,
1005aeed442fSElaine Zhang int chn, int *temp)
1006aeed442fSElaine Zhang {
1007aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1008aeed442fSElaine Zhang struct chip_tsadc_table table = priv->data->table;
1009aeed442fSElaine Zhang u32 val;
1010aeed442fSElaine Zhang
1011aeed442fSElaine Zhang val = readl(priv->base + TSADCV2_DATA(chn));
1012aeed442fSElaine Zhang
1013aeed442fSElaine Zhang return tsadc_code_to_temp(&table, val, temp);
1014aeed442fSElaine Zhang }
1015aeed442fSElaine Zhang
predict_temp(int temp)1016aeed442fSElaine Zhang static int predict_temp(int temp)
1017aeed442fSElaine Zhang {
1018aeed442fSElaine Zhang /*
1019aeed442fSElaine Zhang * The deviation of prediction. the temperature will not change rapidly,
1020aeed442fSElaine Zhang * so this cov_q is small
1021aeed442fSElaine Zhang */
1022aeed442fSElaine Zhang int cov_q = 18;
1023aeed442fSElaine Zhang /*
1024aeed442fSElaine Zhang * The deviation of tsadc's reading, deviation of tsadc is very big when
1025aeed442fSElaine Zhang * abnormal temperature is get
1026aeed442fSElaine Zhang */
1027aeed442fSElaine Zhang int cov_r = 542;
1028aeed442fSElaine Zhang
1029aeed442fSElaine Zhang int gain;
1030aeed442fSElaine Zhang int temp_mid;
1031aeed442fSElaine Zhang int temp_now;
1032aeed442fSElaine Zhang int prob_mid;
1033aeed442fSElaine Zhang int prob_now;
1034aeed442fSElaine Zhang static int temp_last = LOWEST_TEMP;
1035aeed442fSElaine Zhang static int prob_last = 160;
1036aeed442fSElaine Zhang static int bounding_cnt;
1037aeed442fSElaine Zhang
1038aeed442fSElaine Zhang /*
1039aeed442fSElaine Zhang * init temp_last with a more suitable value, which mostly equals to
1040aeed442fSElaine Zhang * temp reading from tsadc, but not higher than MAX_ENV_TEMP. If the
1041aeed442fSElaine Zhang * temp is higher than MAX_ENV_TEMP, it is assumed to be abnormal
1042aeed442fSElaine Zhang * value and temp_last is adjusted to MAX_ENV_TEMP.
1043aeed442fSElaine Zhang */
1044aeed442fSElaine Zhang if (temp_last == LOWEST_TEMP)
1045aeed442fSElaine Zhang temp_last = min(temp, MAX_ENV_TEMP);
1046aeed442fSElaine Zhang
1047aeed442fSElaine Zhang /*
1048aeed442fSElaine Zhang * Before START_DEBOUNCE_COUNT's samples of temperature, we consider
1049aeed442fSElaine Zhang * tsadc is stable, i.e. after that, the temperature may be not stable
1050aeed442fSElaine Zhang * and may have abnormal reading, so we set a bounding temperature. If
1051aeed442fSElaine Zhang * the reading from tsadc is too big, we set the delta temperature of
1052aeed442fSElaine Zhang * DEBOUNCE_TEMP/3 comparing to the last temperature.
1053aeed442fSElaine Zhang */
1054aeed442fSElaine Zhang
1055aeed442fSElaine Zhang if (bounding_cnt++ > START_DEBOUNCE_COUNT) {
1056aeed442fSElaine Zhang bounding_cnt = START_DEBOUNCE_COUNT;
1057aeed442fSElaine Zhang if (temp - temp_last > HIGHER_DEBOUNCE_TEMP)
1058aeed442fSElaine Zhang temp = temp_last + HIGHER_DEBOUNCE_TEMP / 3;
1059aeed442fSElaine Zhang if (temp_last - temp > LOWER_DEBOUNCE_TEMP)
1060aeed442fSElaine Zhang temp = temp_last - LOWER_DEBOUNCE_TEMP / 3;
1061aeed442fSElaine Zhang }
1062aeed442fSElaine Zhang
1063aeed442fSElaine Zhang temp_mid = temp_last;
1064aeed442fSElaine Zhang
1065aeed442fSElaine Zhang /* calculate the probability of this time's prediction */
1066aeed442fSElaine Zhang prob_mid = prob_last + cov_q;
1067aeed442fSElaine Zhang
1068aeed442fSElaine Zhang /* calculate the Kalman Gain */
1069aeed442fSElaine Zhang gain = (prob_mid * BASE) / (prob_mid + cov_r);
1070aeed442fSElaine Zhang
1071aeed442fSElaine Zhang /* calculate the prediction of temperature */
1072aeed442fSElaine Zhang temp_now = (temp_mid * BASE + gain * (temp - temp_mid)) >> BASE_SHIFT;
1073aeed442fSElaine Zhang
1074aeed442fSElaine Zhang /*
1075aeed442fSElaine Zhang * Base on this time's Kalman Gain, ajust our probability of prediction
1076aeed442fSElaine Zhang * for next time calculation
1077aeed442fSElaine Zhang */
1078aeed442fSElaine Zhang prob_now = ((BASE - gain) * prob_mid) >> BASE_SHIFT;
1079aeed442fSElaine Zhang
1080aeed442fSElaine Zhang prob_last = prob_now;
1081aeed442fSElaine Zhang temp_last = temp_now;
1082aeed442fSElaine Zhang
1083aeed442fSElaine Zhang return temp_last;
1084aeed442fSElaine Zhang }
1085aeed442fSElaine Zhang
tsadc_get_temp_v3(struct udevice * dev,int chn,int * temp)1086aeed442fSElaine Zhang static int tsadc_get_temp_v3(struct udevice *dev,
1087aeed442fSElaine Zhang int chn, int *temp)
1088aeed442fSElaine Zhang {
1089aeed442fSElaine Zhang int ret;
1090aeed442fSElaine Zhang
1091aeed442fSElaine Zhang ret = tsadc_get_temp_v2(dev, chn, temp);
1092aeed442fSElaine Zhang if (!ret)
1093aeed442fSElaine Zhang *temp = predict_temp(*temp);
1094aeed442fSElaine Zhang
1095aeed442fSElaine Zhang return ret;
1096aeed442fSElaine Zhang }
1097aeed442fSElaine Zhang
tsadc_get_temp_v4(struct udevice * dev,int chn,int * temp)1098198f0697SFinley Xiao static int tsadc_get_temp_v4(struct udevice *dev, int chn, int *temp)
1099198f0697SFinley Xiao {
1100198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1101198f0697SFinley Xiao struct chip_tsadc_table table = priv->data->table;
1102198f0697SFinley Xiao u32 val;
1103198f0697SFinley Xiao
1104198f0697SFinley Xiao val = readl(priv->base + TSADCV3_DATA(chn));
1105198f0697SFinley Xiao
1106198f0697SFinley Xiao return tsadc_code_to_temp(&table, val, temp);
1107198f0697SFinley Xiao }
1108198f0697SFinley Xiao
tsadc_alarm_temp_v2(struct udevice * dev,int chn,int temp)1109aeed442fSElaine Zhang static void tsadc_alarm_temp_v2(struct udevice *dev,
1110aeed442fSElaine Zhang int chn, int temp)
1111aeed442fSElaine Zhang {
1112aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1113aeed442fSElaine Zhang struct chip_tsadc_table table = priv->data->table;
1114aeed442fSElaine Zhang u32 alarm_value, int_en;
1115aeed442fSElaine Zhang
1116aeed442fSElaine Zhang alarm_value = tsadc_temp_to_code_v2(table, temp);
1117aeed442fSElaine Zhang if (alarm_value == table.data_mask)
1118aeed442fSElaine Zhang return;
1119aeed442fSElaine Zhang
1120aeed442fSElaine Zhang writel(alarm_value, priv->base + TSADCV2_COMP_INT(chn));
1121aeed442fSElaine Zhang
1122aeed442fSElaine Zhang int_en = readl(priv->base + TSADCV2_INT_EN);
1123aeed442fSElaine Zhang int_en |= TSADCV2_INT_SRC_EN(chn);
1124aeed442fSElaine Zhang writel(int_en, priv->base + TSADCV2_INT_EN);
1125aeed442fSElaine Zhang }
1126aeed442fSElaine Zhang
tsadc_alarm_temp_v3(struct udevice * dev,int chn,int temp)1127198f0697SFinley Xiao static void tsadc_alarm_temp_v3(struct udevice *dev, int chn, int temp)
1128198f0697SFinley Xiao {
1129198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1130198f0697SFinley Xiao struct chip_tsadc_table table = priv->data->table;
1131198f0697SFinley Xiao u32 alarm_value;
1132198f0697SFinley Xiao
1133198f0697SFinley Xiao alarm_value = tsadc_temp_to_code_v2(table, temp);
1134198f0697SFinley Xiao if (alarm_value == table.data_mask)
1135198f0697SFinley Xiao return;
1136198f0697SFinley Xiao
1137198f0697SFinley Xiao writel(alarm_value, priv->base + TSADCV3_COMP_INT(chn));
1138198f0697SFinley Xiao writel(TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn),
1139198f0697SFinley Xiao priv->base + TSADCV3_HT_INT_EN);
1140198f0697SFinley Xiao }
1141198f0697SFinley Xiao
tsadc_tshut_temp_v2(struct udevice * dev,int chn,int temp)1142aeed442fSElaine Zhang static void tsadc_tshut_temp_v2(struct udevice *dev,
1143aeed442fSElaine Zhang int chn, int temp)
1144aeed442fSElaine Zhang {
1145aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1146aeed442fSElaine Zhang struct chip_tsadc_table table = priv->data->table;
1147aeed442fSElaine Zhang u32 tshut_value, val;
1148aeed442fSElaine Zhang
1149aeed442fSElaine Zhang tshut_value = tsadc_temp_to_code_v2(table, temp);
1150aeed442fSElaine Zhang if (tshut_value == table.data_mask)
1151aeed442fSElaine Zhang return;
1152aeed442fSElaine Zhang
1153aeed442fSElaine Zhang writel(tshut_value, priv->base + TSADCV2_COMP_SHUT(chn));
1154aeed442fSElaine Zhang
1155aeed442fSElaine Zhang /* TSHUT will be valid */
1156aeed442fSElaine Zhang val = readl(priv->base + TSADCV2_AUTO_CON);
1157aeed442fSElaine Zhang writel(val | TSADCV2_AUTO_SRC_EN(chn), priv->base + TSADCV2_AUTO_CON);
1158aeed442fSElaine Zhang }
1159aeed442fSElaine Zhang
tsadc_tshut_temp_v3(struct udevice * dev,int chn,int temp)1160198f0697SFinley Xiao static void tsadc_tshut_temp_v3(struct udevice *dev, int chn, int temp)
1161198f0697SFinley Xiao {
1162198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1163198f0697SFinley Xiao struct chip_tsadc_table table = priv->data->table;
1164198f0697SFinley Xiao u32 tshut_value;
1165198f0697SFinley Xiao
1166198f0697SFinley Xiao tshut_value = tsadc_temp_to_code_v2(table, temp);
1167198f0697SFinley Xiao if (tshut_value == table.data_mask)
1168198f0697SFinley Xiao return;
1169198f0697SFinley Xiao
1170198f0697SFinley Xiao writel(tshut_value, priv->base + TSADCV3_COMP_SHUT(chn));
1171198f0697SFinley Xiao writel(TSADCV3_AUTO_SRC_EN(chn) | TSADCV3_AUTO_SRC_EN_MASK(chn),
1172198f0697SFinley Xiao priv->base + TSADCV3_AUTO_SRC_CON);
1173198f0697SFinley Xiao }
1174198f0697SFinley Xiao
tsadc_tshut_mode_v2(struct udevice * dev,int chn,enum tshut_mode mode)1175aeed442fSElaine Zhang static void tsadc_tshut_mode_v2(struct udevice *dev, int chn,
1176aeed442fSElaine Zhang enum tshut_mode mode)
1177aeed442fSElaine Zhang {
1178aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1179aeed442fSElaine Zhang u32 val;
1180aeed442fSElaine Zhang
1181aeed442fSElaine Zhang val = readl(priv->base + TSADCV2_INT_EN);
1182aeed442fSElaine Zhang if (mode == TSHUT_MODE_GPIO) {
1183aeed442fSElaine Zhang val &= ~TSADCV2_SHUT_2CRU_SRC_EN(chn);
1184aeed442fSElaine Zhang val |= TSADCV2_SHUT_2GPIO_SRC_EN(chn);
1185aeed442fSElaine Zhang } else {
1186aeed442fSElaine Zhang val &= ~TSADCV2_SHUT_2GPIO_SRC_EN(chn);
1187aeed442fSElaine Zhang val |= TSADCV2_SHUT_2CRU_SRC_EN(chn);
1188aeed442fSElaine Zhang }
1189aeed442fSElaine Zhang
1190aeed442fSElaine Zhang writel(val, priv->base + TSADCV2_INT_EN);
1191aeed442fSElaine Zhang }
1192aeed442fSElaine Zhang
tsadc_tshut_mode_v4(struct udevice * dev,int chn,enum tshut_mode mode)1193198f0697SFinley Xiao static void tsadc_tshut_mode_v4(struct udevice *dev, int chn,
1194198f0697SFinley Xiao enum tshut_mode mode)
1195198f0697SFinley Xiao {
1196198f0697SFinley Xiao struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1197198f0697SFinley Xiao u32 val_gpio, val_cru;
1198198f0697SFinley Xiao
1199198f0697SFinley Xiao if (mode == TSHUT_MODE_GPIO) {
1200198f0697SFinley Xiao val_gpio = TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn);
1201198f0697SFinley Xiao val_cru = TSADCV2_INT_SRC_EN_MASK(chn);
1202198f0697SFinley Xiao } else {
1203198f0697SFinley Xiao val_cru = TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn);
1204198f0697SFinley Xiao val_gpio = TSADCV2_INT_SRC_EN_MASK(chn);
1205198f0697SFinley Xiao }
1206198f0697SFinley Xiao writel(val_gpio, priv->base + TSADCV3_HSHUT_GPIO_INT_EN);
1207198f0697SFinley Xiao writel(val_cru, priv->base + TSADCV3_HSHUT_CRU_INT_EN);
1208198f0697SFinley Xiao }
1209198f0697SFinley Xiao
rockchip_thermal_get_temp(struct udevice * dev,int * temp)1210aeed442fSElaine Zhang int rockchip_thermal_get_temp(struct udevice *dev, int *temp)
1211aeed442fSElaine Zhang {
1212aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1213aeed442fSElaine Zhang
1214aeed442fSElaine Zhang priv->data->tsadc_get_temp(dev, 0, temp);
1215aeed442fSElaine Zhang
1216aeed442fSElaine Zhang return 0;
1217aeed442fSElaine Zhang }
1218aeed442fSElaine Zhang
1219aeed442fSElaine Zhang static const struct dm_thermal_ops rockchip_thermal_ops = {
1220aeed442fSElaine Zhang .get_temp = rockchip_thermal_get_temp,
1221aeed442fSElaine Zhang };
1222aeed442fSElaine Zhang
122331f36c58SFinley Xiao static const struct rockchip_tsadc_chip px30s_tsadc_data = {
122431f36c58SFinley Xiao .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
122531f36c58SFinley Xiao .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
122631f36c58SFinley Xiao .chn_num = 2, /* 2 channels for tsadc */
122731f36c58SFinley Xiao
122831f36c58SFinley Xiao .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
122931f36c58SFinley Xiao .tshut_temp = 95000,
123031f36c58SFinley Xiao
123131f36c58SFinley Xiao .tsadc_init = tsadc_init_v9,
123231f36c58SFinley Xiao .tsadc_control = tsadc_control_v2,
123331f36c58SFinley Xiao .tsadc_get_temp = tsadc_get_temp_v2,
123431f36c58SFinley Xiao .irq_ack = tsadc_irq_ack_v3,
123531f36c58SFinley Xiao .set_alarm_temp = tsadc_alarm_temp_v2,
123631f36c58SFinley Xiao .set_tshut_temp = tsadc_tshut_temp_v2,
123731f36c58SFinley Xiao .set_tshut_mode = tsadc_tshut_mode_v2,
123831f36c58SFinley Xiao
123931f36c58SFinley Xiao .table = {
124031f36c58SFinley Xiao .knum = 2699,
124131f36c58SFinley Xiao .bnum = 2796,
124231f36c58SFinley Xiao .data_mask = TSADCV2_DATA_MASK,
124331f36c58SFinley Xiao .mode = ADC_INCREMENT,
124431f36c58SFinley Xiao },
124531f36c58SFinley Xiao };
124631f36c58SFinley Xiao
1247082f45b4SFinley Xiao static const struct rockchip_tsadc_chip rk3308bs_tsadc_data = {
1248082f45b4SFinley Xiao .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1249082f45b4SFinley Xiao .chn_num = 1, /* 1 channels for tsadc */
1250082f45b4SFinley Xiao
1251082f45b4SFinley Xiao .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1252082f45b4SFinley Xiao .tshut_temp = 95000,
1253082f45b4SFinley Xiao
1254082f45b4SFinley Xiao .tsadc_init = tsadc_init_v2,
1255082f45b4SFinley Xiao .tsadc_control = tsadc_control_v2,
1256082f45b4SFinley Xiao .tsadc_get_temp = tsadc_get_temp_v2,
1257082f45b4SFinley Xiao .irq_ack = tsadc_irq_ack_v3,
1258082f45b4SFinley Xiao .set_alarm_temp = tsadc_alarm_temp_v2,
1259082f45b4SFinley Xiao .set_tshut_temp = tsadc_tshut_temp_v2,
1260082f45b4SFinley Xiao .set_tshut_mode = tsadc_tshut_mode_v2,
1261082f45b4SFinley Xiao
1262082f45b4SFinley Xiao .table = {
1263082f45b4SFinley Xiao .knum = 2699,
1264082f45b4SFinley Xiao .bnum = 2796,
1265082f45b4SFinley Xiao .data_mask = TSADCV2_DATA_MASK,
1266082f45b4SFinley Xiao .mode = ADC_INCREMENT,
1267082f45b4SFinley Xiao },
1268082f45b4SFinley Xiao };
1269082f45b4SFinley Xiao
rockchip_thermal_probe(struct udevice * dev)1270aeed442fSElaine Zhang static int rockchip_thermal_probe(struct udevice *dev)
1271aeed442fSElaine Zhang {
1272aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1273aeed442fSElaine Zhang struct rockchip_tsadc_chip *tsadc;
1274082f45b4SFinley Xiao struct clk clk;
1275aeed442fSElaine Zhang int ret, i, shut_temp;
1276aeed442fSElaine Zhang
1277aeed442fSElaine Zhang /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
1278aeed442fSElaine Zhang ret = clk_set_defaults(dev);
1279aeed442fSElaine Zhang if (ret)
1280aeed442fSElaine Zhang printf("%s clk_set_defaults failed %d\n", __func__, ret);
1281aeed442fSElaine Zhang
128231f36c58SFinley Xiao if (soc_is_rk3308bs() || soc_is_px30s()) {
1283082f45b4SFinley Xiao ret = clk_get_by_name(dev, "tsadc", &clk);
1284082f45b4SFinley Xiao if (ret) {
1285082f45b4SFinley Xiao printf("%s get tsadc clk fail\n", __func__);
1286082f45b4SFinley Xiao return -EINVAL;
1287082f45b4SFinley Xiao }
1288082f45b4SFinley Xiao ret = clk_set_rate(&clk, 4000000);
1289082f45b4SFinley Xiao if (ret < 0) {
1290082f45b4SFinley Xiao printf("%s: failed to set tsadc clk rate for %s\n",
1291082f45b4SFinley Xiao __func__, dev_read_name(dev));
1292082f45b4SFinley Xiao return -EINVAL;
1293082f45b4SFinley Xiao }
1294082f45b4SFinley Xiao }
129531f36c58SFinley Xiao if (soc_is_rk3308bs())
129631f36c58SFinley Xiao tsadc = (struct rockchip_tsadc_chip *)&rk3308bs_tsadc_data;
129731f36c58SFinley Xiao else if (soc_is_px30s())
129831f36c58SFinley Xiao tsadc = (struct rockchip_tsadc_chip *)&px30s_tsadc_data;
129931f36c58SFinley Xiao else
130031f36c58SFinley Xiao tsadc = (struct rockchip_tsadc_chip *)dev_get_driver_data(dev);
130131f36c58SFinley Xiao
1302aeed442fSElaine Zhang priv->data = tsadc;
1303aeed442fSElaine Zhang
1304aeed442fSElaine Zhang priv->tshut_mode = dev_read_u32_default(dev,
1305aeed442fSElaine Zhang "rockchip,hw-tshut-mode",
1306aeed442fSElaine Zhang -1);
1307aeed442fSElaine Zhang if (priv->tshut_mode < 0)
1308aeed442fSElaine Zhang priv->tshut_mode = priv->data->tshut_mode;
1309aeed442fSElaine Zhang
13104585497aSElaine Zhang priv->tshut_polarity = dev_read_u32_default(dev,
13114585497aSElaine Zhang "rockchip,hw-tshut-polarity",
13124585497aSElaine Zhang -1);
13134585497aSElaine Zhang if (priv->tshut_polarity < 0)
13144585497aSElaine Zhang priv->tshut_polarity = tsadc->tshut_polarity;
13154585497aSElaine Zhang
1316aeed442fSElaine Zhang if (priv->tshut_mode == TSHUT_MODE_GPIO)
1317aeed442fSElaine Zhang pinctrl_select_state(dev, "otpout");
13181e168e01SElaine Zhang else if (soc_is_rk3308())
1319aeed442fSElaine Zhang pinctrl_select_state(dev, "gpio");
1320aeed442fSElaine Zhang
1321aeed442fSElaine Zhang tsadc->tsadc_init(dev);
1322aeed442fSElaine Zhang tsadc->irq_ack(dev);
1323aeed442fSElaine Zhang
1324aeed442fSElaine Zhang shut_temp = dev_read_u32_default(dev, "rockchip,hw-tshut-temp", -1);
1325aeed442fSElaine Zhang if (shut_temp < 0)
1326aeed442fSElaine Zhang shut_temp = 120000;
1327aeed442fSElaine Zhang
1328aeed442fSElaine Zhang for (i = 0; i < tsadc->chn_num; i++) {
1329aeed442fSElaine Zhang tsadc->set_alarm_temp(dev, i, tsadc->tshut_temp);
1330aeed442fSElaine Zhang tsadc->set_tshut_temp(dev, i, shut_temp);
1331aeed442fSElaine Zhang if (priv->tshut_mode == TSHUT_MODE_GPIO)
1332aeed442fSElaine Zhang tsadc->set_tshut_mode(dev, i, TSHUT_MODE_GPIO);
1333aeed442fSElaine Zhang else
1334aeed442fSElaine Zhang tsadc->set_tshut_mode(dev, i, TSHUT_MODE_CRU);
1335aeed442fSElaine Zhang }
1336aeed442fSElaine Zhang
1337aeed442fSElaine Zhang tsadc->tsadc_control(dev, true);
133831f36c58SFinley Xiao if (soc_is_rk3308bs() || soc_is_px30s())
1339082f45b4SFinley Xiao mdelay(3);
1340082f45b4SFinley Xiao else
1341aeed442fSElaine Zhang udelay(1000);
1342aeed442fSElaine Zhang
1343aeed442fSElaine Zhang debug("tsadc probed successfully\n");
1344aeed442fSElaine Zhang
1345aeed442fSElaine Zhang return 0;
1346aeed442fSElaine Zhang }
1347aeed442fSElaine Zhang
rockchip_thermal_ofdata_to_platdata(struct udevice * dev)1348aeed442fSElaine Zhang static int rockchip_thermal_ofdata_to_platdata(struct udevice *dev)
1349aeed442fSElaine Zhang {
1350aeed442fSElaine Zhang struct rockchip_thermal_priv *priv = dev_get_priv(dev);
1351aeed442fSElaine Zhang
1352aeed442fSElaine Zhang priv->base = dev_read_addr_ptr(dev);
1353aeed442fSElaine Zhang priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
1354aeed442fSElaine Zhang
1355aeed442fSElaine Zhang return 0;
1356aeed442fSElaine Zhang }
1357aeed442fSElaine Zhang
1358aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk1808_tsadc_data = {
1359aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1360aeed442fSElaine Zhang .chn_num = 1, /* one channel for tsadc */
1361aeed442fSElaine Zhang
1362aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1363aeed442fSElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1364aeed442fSElaine Zhang .tshut_temp = 95000,
1365aeed442fSElaine Zhang
1366aeed442fSElaine Zhang .tsadc_init = tsadc_init_v2,
1367aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1368aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1369aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1370aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1371aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1372aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1373aeed442fSElaine Zhang
1374aeed442fSElaine Zhang .table = {
1375aeed442fSElaine Zhang .id = rk1808_code_table,
1376aeed442fSElaine Zhang .length = ARRAY_SIZE(rk1808_code_table),
1377aeed442fSElaine Zhang .data_mask = TSADCV2_DATA_MASK,
1378ba09f836SElaine Zhang .mode = ADC_INCREMENT,
1379aeed442fSElaine Zhang },
1380aeed442fSElaine Zhang };
1381aeed442fSElaine Zhang
1382aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3228_tsadc_data = {
1383aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1384aeed442fSElaine Zhang .chn_num = 1, /* one channel for tsadc */
1385aeed442fSElaine Zhang
1386aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1387aeed442fSElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1388aeed442fSElaine Zhang .tshut_temp = 95000,
1389aeed442fSElaine Zhang
1390aeed442fSElaine Zhang .tsadc_init = tsadc_init_v2,
1391aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1392aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1393aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1394aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1395aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1396aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1397aeed442fSElaine Zhang
1398aeed442fSElaine Zhang .table = {
1399aeed442fSElaine Zhang .id = rk3228_code_table,
1400aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3228_code_table),
1401aeed442fSElaine Zhang .data_mask = TSADCV3_DATA_MASK,
1402aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1403aeed442fSElaine Zhang },
1404aeed442fSElaine Zhang };
1405aeed442fSElaine Zhang
1406aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
1407aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 1, /* cpu sensor is channel 1 */
1408aeed442fSElaine Zhang .chn_id[SENSOR_GPU] = 2, /* gpu sensor is channel 2 */
1409aeed442fSElaine Zhang .chn_num = 2, /* two channels for tsadc */
1410aeed442fSElaine Zhang
1411aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1412aeed442fSElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1413aeed442fSElaine Zhang .tshut_temp = 95000,
1414aeed442fSElaine Zhang
1415aeed442fSElaine Zhang .tsadc_init = tsadc_init_v2,
1416aeed442fSElaine Zhang .tsadc_control = tsadc_control_v2,
1417aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v3,
1418aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v2,
1419aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1420aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1421aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1422aeed442fSElaine Zhang
1423aeed442fSElaine Zhang .table = {
1424aeed442fSElaine Zhang .id = rk3288_code_table,
1425aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3288_code_table),
1426aeed442fSElaine Zhang .data_mask = TSADCV2_DATA_MASK,
1427aeed442fSElaine Zhang .mode = ADC_DECREMENT,
1428aeed442fSElaine Zhang },
1429aeed442fSElaine Zhang };
1430aeed442fSElaine Zhang
1431aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3308_tsadc_data = {
1432aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1433aeed442fSElaine Zhang .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1434aeed442fSElaine Zhang .chn_num = 2, /* 2 channels for tsadc */
1435aeed442fSElaine Zhang
1436aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1437aeed442fSElaine Zhang .tshut_temp = 95000,
1438aeed442fSElaine Zhang
1439aeed442fSElaine Zhang .tsadc_init = tsadc_init_v4,
1440aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1441aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1442aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1443aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1444aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1445aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1446aeed442fSElaine Zhang
1447aeed442fSElaine Zhang .table = {
1448aeed442fSElaine Zhang .id = rk3328_code_table,
1449aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3328_code_table),
1450aeed442fSElaine Zhang .data_mask = TSADCV2_DATA_MASK,
1451aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1452aeed442fSElaine Zhang },
1453aeed442fSElaine Zhang };
1454aeed442fSElaine Zhang
1455aeed442fSElaine Zhang static const struct rockchip_tsadc_chip px30_tsadc_data = {
1456aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1457aeed442fSElaine Zhang .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1458aeed442fSElaine Zhang .chn_num = 2, /* 2 channels for tsadc */
1459aeed442fSElaine Zhang
1460aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1461aeed442fSElaine Zhang .tshut_temp = 95000,
1462aeed442fSElaine Zhang
1463aeed442fSElaine Zhang .tsadc_init = tsadc_init_v4,
1464aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1465aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1466aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1467aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1468aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1469aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1470aeed442fSElaine Zhang
1471aeed442fSElaine Zhang .table = {
1472aeed442fSElaine Zhang .id = rk3328_code_table,
1473aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3328_code_table),
1474aeed442fSElaine Zhang .data_mask = TSADCV2_DATA_MASK,
1475aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1476aeed442fSElaine Zhang },
1477aeed442fSElaine Zhang };
1478aeed442fSElaine Zhang
1479aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
1480aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1481aeed442fSElaine Zhang .chn_num = 1, /* one channels for tsadc */
1482aeed442fSElaine Zhang
1483aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1484aeed442fSElaine Zhang .tshut_temp = 95000,
1485aeed442fSElaine Zhang
1486aeed442fSElaine Zhang .tsadc_init = tsadc_init_v2,
1487aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1488aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1489aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1490aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1491aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1492aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1493aeed442fSElaine Zhang
1494aeed442fSElaine Zhang .table = {
1495aeed442fSElaine Zhang .id = rk3328_code_table,
1496aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3328_code_table),
1497aeed442fSElaine Zhang .data_mask = TSADCV2_DATA_MASK,
1498aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1499aeed442fSElaine Zhang },
1500aeed442fSElaine Zhang };
1501aeed442fSElaine Zhang
1502aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
1503aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1504aeed442fSElaine Zhang .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1505aeed442fSElaine Zhang .chn_num = 2, /* two channels for tsadc */
1506aeed442fSElaine Zhang
1507aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1508aeed442fSElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1509aeed442fSElaine Zhang .tshut_temp = 95000,
1510aeed442fSElaine Zhang
1511aeed442fSElaine Zhang .tsadc_init = tsadc_init_v3,
1512aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1513aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1514aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1515aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1516aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1517aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1518aeed442fSElaine Zhang
1519aeed442fSElaine Zhang .table = {
1520aeed442fSElaine Zhang .id = rk3228_code_table,
1521aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3228_code_table),
1522aeed442fSElaine Zhang .data_mask = TSADCV3_DATA_MASK,
1523aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1524aeed442fSElaine Zhang },
1525aeed442fSElaine Zhang };
1526aeed442fSElaine Zhang
1527aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3368_tsadc_data = {
1528aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1529aeed442fSElaine Zhang .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1530aeed442fSElaine Zhang .chn_num = 2, /* two channels for tsadc */
1531aeed442fSElaine Zhang
1532aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1533aeed442fSElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1534aeed442fSElaine Zhang .tshut_temp = 95000,
1535aeed442fSElaine Zhang
1536aeed442fSElaine Zhang .tsadc_init = tsadc_init_v2,
1537aeed442fSElaine Zhang .tsadc_control = tsadc_control_v2,
1538aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1539aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v2,
1540aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1541aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1542aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1543aeed442fSElaine Zhang
1544aeed442fSElaine Zhang .table = {
1545aeed442fSElaine Zhang .id = rk3368_code_table,
1546aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3368_code_table),
1547aeed442fSElaine Zhang .data_mask = TSADCV3_DATA_MASK,
1548aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1549aeed442fSElaine Zhang },
1550aeed442fSElaine Zhang };
1551aeed442fSElaine Zhang
1552aeed442fSElaine Zhang static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
1553aeed442fSElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1554aeed442fSElaine Zhang .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1555aeed442fSElaine Zhang .chn_num = 2, /* two channels for tsadc */
1556aeed442fSElaine Zhang
1557aeed442fSElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1558aeed442fSElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1559aeed442fSElaine Zhang .tshut_temp = 95000,
1560aeed442fSElaine Zhang
1561aeed442fSElaine Zhang .tsadc_init = tsadc_init_v3,
1562aeed442fSElaine Zhang .tsadc_control = tsadc_control_v3,
1563aeed442fSElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
1564aeed442fSElaine Zhang .irq_ack = tsadc_irq_ack_v3,
1565aeed442fSElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
1566aeed442fSElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
1567aeed442fSElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
1568aeed442fSElaine Zhang
1569aeed442fSElaine Zhang .table = {
1570aeed442fSElaine Zhang .id = rk3399_code_table,
1571aeed442fSElaine Zhang .length = ARRAY_SIZE(rk3399_code_table),
1572aeed442fSElaine Zhang .data_mask = TSADCV3_DATA_MASK,
1573aeed442fSElaine Zhang .mode = ADC_INCREMENT,
1574aeed442fSElaine Zhang },
1575aeed442fSElaine Zhang };
1576aeed442fSElaine Zhang
157755f74c72SShaohan Yao static const struct rockchip_tsadc_chip rk3528_tsadc_data = {
157855f74c72SShaohan Yao .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
157955f74c72SShaohan Yao .chn_num = 1, /* one channels for tsadc */
158055f74c72SShaohan Yao
158155f74c72SShaohan Yao .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via GPIO give PMIC */
158255f74c72SShaohan Yao .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
158355f74c72SShaohan Yao .tshut_temp = 95000,
158455f74c72SShaohan Yao
158555f74c72SShaohan Yao .tsadc_init = tsadc_init_v11,
158655f74c72SShaohan Yao .tsadc_control = tsadc_control_v4,
158755f74c72SShaohan Yao .tsadc_get_temp = tsadc_get_temp_v4,
158855f74c72SShaohan Yao .irq_ack = tsadc_irq_ack_v4,
158955f74c72SShaohan Yao .set_alarm_temp = tsadc_alarm_temp_v3,
159055f74c72SShaohan Yao .set_tshut_temp = tsadc_tshut_temp_v3,
159155f74c72SShaohan Yao .set_tshut_mode = tsadc_tshut_mode_v4,
159255f74c72SShaohan Yao
159355f74c72SShaohan Yao .table = {
159455f74c72SShaohan Yao .id = rk3528_code_table,
159555f74c72SShaohan Yao .length = ARRAY_SIZE(rk3528_code_table),
159655f74c72SShaohan Yao .data_mask = TSADCV2_DATA_MASK,
159755f74c72SShaohan Yao .mode = ADC_INCREMENT,
159855f74c72SShaohan Yao },
159955f74c72SShaohan Yao };
160055f74c72SShaohan Yao
160171dcb579SElaine Zhang static const struct rockchip_tsadc_chip rk3562_tsadc_data = {
160271dcb579SElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
160371dcb579SElaine Zhang .chn_num = 1, /* one channels for tsadc */
160471dcb579SElaine Zhang
160571dcb579SElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
160671dcb579SElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
160771dcb579SElaine Zhang .tshut_temp = 95000,
160871dcb579SElaine Zhang
160971dcb579SElaine Zhang .tsadc_init = tsadc_init_v12,
161071dcb579SElaine Zhang .tsadc_control = tsadc_control_v4,
161171dcb579SElaine Zhang .tsadc_get_temp = tsadc_get_temp_v4,
161271dcb579SElaine Zhang .irq_ack = tsadc_irq_ack_v4,
161371dcb579SElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v3,
161471dcb579SElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v3,
161571dcb579SElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v4,
161671dcb579SElaine Zhang
161771dcb579SElaine Zhang .table = {
161871dcb579SElaine Zhang .id = rk3562_code_table,
161971dcb579SElaine Zhang .length = ARRAY_SIZE(rk3562_code_table),
162071dcb579SElaine Zhang .data_mask = TSADCV2_DATA_MASK,
162171dcb579SElaine Zhang .mode = ADC_INCREMENT,
162271dcb579SElaine Zhang },
162371dcb579SElaine Zhang };
162471dcb579SElaine Zhang
16252f5dff11SElaine Zhang static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
16262f5dff11SElaine Zhang .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
16272f5dff11SElaine Zhang .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
16282f5dff11SElaine Zhang .chn_num = 2, /* two channels for tsadc */
16292f5dff11SElaine Zhang
16302f5dff11SElaine Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
16312f5dff11SElaine Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
16322f5dff11SElaine Zhang .tshut_temp = 95000,
16332f5dff11SElaine Zhang
16342f5dff11SElaine Zhang .tsadc_init = tsadc_init_v7,
16352f5dff11SElaine Zhang .tsadc_control = tsadc_control_v3,
16362f5dff11SElaine Zhang .tsadc_get_temp = tsadc_get_temp_v2,
16372f5dff11SElaine Zhang .irq_ack = tsadc_irq_ack_v3,
16382f5dff11SElaine Zhang .set_alarm_temp = tsadc_alarm_temp_v2,
16392f5dff11SElaine Zhang .set_tshut_temp = tsadc_tshut_temp_v2,
16402f5dff11SElaine Zhang .set_tshut_mode = tsadc_tshut_mode_v2,
16412f5dff11SElaine Zhang
16422f5dff11SElaine Zhang .table = {
16432f5dff11SElaine Zhang .id = rk3568_code_table,
16442f5dff11SElaine Zhang .length = ARRAY_SIZE(rk3568_code_table),
16452f5dff11SElaine Zhang .data_mask = TSADCV2_DATA_MASK,
16462f5dff11SElaine Zhang .mode = ADC_INCREMENT,
16472f5dff11SElaine Zhang },
16482f5dff11SElaine Zhang };
16492f5dff11SElaine Zhang
1650198f0697SFinley Xiao static const struct rockchip_tsadc_chip rk3588_tsadc_data = {
1651198f0697SFinley Xiao /* top, big_core0, big_core1, little_core, center, gpu, npu */
1652198f0697SFinley Xiao .chn_id = {0, 1, 2, 3, 4, 5, 6},
1653198f0697SFinley Xiao .chn_num = 7, /* seven channels for tsadc */
1654198f0697SFinley Xiao
1655198f0697SFinley Xiao .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1656198f0697SFinley Xiao .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1657198f0697SFinley Xiao .tshut_temp = 95000,
1658198f0697SFinley Xiao
1659198f0697SFinley Xiao .tsadc_init = tsadc_init_v8,
1660198f0697SFinley Xiao .tsadc_control = tsadc_control_v4,
1661198f0697SFinley Xiao .tsadc_get_temp = tsadc_get_temp_v4,
1662198f0697SFinley Xiao .irq_ack = tsadc_irq_ack_v4,
1663198f0697SFinley Xiao .set_alarm_temp = tsadc_alarm_temp_v3,
1664198f0697SFinley Xiao .set_tshut_temp = tsadc_tshut_temp_v3,
1665198f0697SFinley Xiao .set_tshut_mode = tsadc_tshut_mode_v4,
1666198f0697SFinley Xiao
1667198f0697SFinley Xiao .table = {
1668198f0697SFinley Xiao .id = rk3588_code_table,
1669198f0697SFinley Xiao .length = ARRAY_SIZE(rk3588_code_table),
1670198f0697SFinley Xiao .data_mask = TSADCV4_DATA_MASK,
1671198f0697SFinley Xiao .mode = ADC_INCREMENT,
1672198f0697SFinley Xiao },
1673198f0697SFinley Xiao };
1674198f0697SFinley Xiao
1675*08c89849SYe Zhang static const struct rockchip_tsadc_chip rk3576_tsadc_data = {
1676*08c89849SYe Zhang /* top, big_core, little_core, ddr, npu, gpu */
1677*08c89849SYe Zhang .chn_id = {0, 1, 2, 3, 4, 5},
1678*08c89849SYe Zhang .chn_num = 6, /* six channels for tsadc */
1679*08c89849SYe Zhang
1680*08c89849SYe Zhang .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1681*08c89849SYe Zhang .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1682*08c89849SYe Zhang .tshut_temp = 95000,
1683*08c89849SYe Zhang
1684*08c89849SYe Zhang .tsadc_init = tsadc_init_v8,
1685*08c89849SYe Zhang .tsadc_control = tsadc_control_v4,
1686*08c89849SYe Zhang .tsadc_get_temp = tsadc_get_temp_v4,
1687*08c89849SYe Zhang .irq_ack = tsadc_irq_ack_v4,
1688*08c89849SYe Zhang .set_alarm_temp = tsadc_alarm_temp_v3,
1689*08c89849SYe Zhang .set_tshut_temp = tsadc_tshut_temp_v3,
1690*08c89849SYe Zhang .set_tshut_mode = tsadc_tshut_mode_v4,
1691*08c89849SYe Zhang
1692*08c89849SYe Zhang .table = {
1693*08c89849SYe Zhang .id = rk3588_code_table,
1694*08c89849SYe Zhang .length = ARRAY_SIZE(rk3588_code_table),
1695*08c89849SYe Zhang .data_mask = TSADCV4_DATA_MASK,
1696*08c89849SYe Zhang .mode = ADC_INCREMENT,
1697*08c89849SYe Zhang },
1698*08c89849SYe Zhang };
1699*08c89849SYe Zhang
1700aeed442fSElaine Zhang static const struct udevice_id rockchip_thermal_match[] = {
1701aeed442fSElaine Zhang {
1702aeed442fSElaine Zhang .compatible = "rockchip,px30-tsadc",
1703aeed442fSElaine Zhang .data = (ulong)&px30_tsadc_data,
1704aeed442fSElaine Zhang },
1705aeed442fSElaine Zhang {
170631f36c58SFinley Xiao .compatible = "rockchip,px30s-tsadc",
170731f36c58SFinley Xiao .data = (ulong)&px30s_tsadc_data,
170831f36c58SFinley Xiao },
170931f36c58SFinley Xiao {
1710aeed442fSElaine Zhang .compatible = "rockchip,rk1808-tsadc",
1711aeed442fSElaine Zhang .data = (ulong)&rk1808_tsadc_data,
1712aeed442fSElaine Zhang },
1713aeed442fSElaine Zhang {
1714aeed442fSElaine Zhang .compatible = "rockchip,rk3228-tsadc",
1715aeed442fSElaine Zhang .data = (ulong)&rk3228_tsadc_data,
1716aeed442fSElaine Zhang },
1717aeed442fSElaine Zhang {
1718aeed442fSElaine Zhang .compatible = "rockchip,rk3288-tsadc",
1719aeed442fSElaine Zhang .data = (ulong)&rk3288_tsadc_data,
1720aeed442fSElaine Zhang },
1721aeed442fSElaine Zhang {
1722aeed442fSElaine Zhang .compatible = "rockchip,rk3308-tsadc",
1723aeed442fSElaine Zhang .data = (ulong)&rk3308_tsadc_data,
1724aeed442fSElaine Zhang },
1725aeed442fSElaine Zhang {
1726082f45b4SFinley Xiao .compatible = "rockchip,rk3308bs-tsadc",
1727082f45b4SFinley Xiao .data = (ulong)&rk3308bs_tsadc_data,
1728082f45b4SFinley Xiao },
1729082f45b4SFinley Xiao {
1730aeed442fSElaine Zhang .compatible = "rockchip,rk3328-tsadc",
1731aeed442fSElaine Zhang .data = (ulong)&rk3328_tsadc_data,
1732aeed442fSElaine Zhang },
1733aeed442fSElaine Zhang {
1734aeed442fSElaine Zhang .compatible = "rockchip,rk3366-tsadc",
1735aeed442fSElaine Zhang .data = (ulong)&rk3366_tsadc_data,
1736aeed442fSElaine Zhang },
1737aeed442fSElaine Zhang {
1738aeed442fSElaine Zhang .compatible = "rockchip,rk3368-tsadc",
1739aeed442fSElaine Zhang .data = (ulong)&rk3368_tsadc_data,
1740aeed442fSElaine Zhang },
1741aeed442fSElaine Zhang {
1742aeed442fSElaine Zhang .compatible = "rockchip,rk3399-tsadc",
1743aeed442fSElaine Zhang .data = (ulong)&rk3399_tsadc_data,
1744aeed442fSElaine Zhang },
17452f5dff11SElaine Zhang {
174655f74c72SShaohan Yao .compatible = "rockchip,rk3528-tsadc",
174755f74c72SShaohan Yao .data = (ulong)&rk3528_tsadc_data,
174855f74c72SShaohan Yao },
174955f74c72SShaohan Yao {
175071dcb579SElaine Zhang .compatible = "rockchip,rk3562-tsadc",
175171dcb579SElaine Zhang .data = (ulong)&rk3562_tsadc_data,
175271dcb579SElaine Zhang },
175371dcb579SElaine Zhang {
17542f5dff11SElaine Zhang .compatible = "rockchip,rk3568-tsadc",
17552f5dff11SElaine Zhang .data = (ulong)&rk3568_tsadc_data,
17562f5dff11SElaine Zhang },
1757198f0697SFinley Xiao {
1758198f0697SFinley Xiao .compatible = "rockchip,rk3588-tsadc",
1759198f0697SFinley Xiao .data = (ulong)&rk3588_tsadc_data,
1760198f0697SFinley Xiao },
1761*08c89849SYe Zhang {
1762*08c89849SYe Zhang .compatible = "rockchip,rk3576-tsadc",
1763*08c89849SYe Zhang .data = (ulong)&rk3576_tsadc_data,
1764*08c89849SYe Zhang },
1765aeed442fSElaine Zhang { /* end */ },
1766aeed442fSElaine Zhang };
1767aeed442fSElaine Zhang
1768aeed442fSElaine Zhang U_BOOT_DRIVER(rockchip_thermal) = {
1769aeed442fSElaine Zhang .name = "rockchip_thermal",
1770aeed442fSElaine Zhang .id = UCLASS_THERMAL,
1771aeed442fSElaine Zhang .of_match = rockchip_thermal_match,
1772aeed442fSElaine Zhang .priv_auto_alloc_size = sizeof(struct rockchip_thermal_priv),
1773aeed442fSElaine Zhang .ofdata_to_platdata = rockchip_thermal_ofdata_to_platdata,
1774aeed442fSElaine Zhang .ops = &rockchip_thermal_ops,
1775aeed442fSElaine Zhang .probe = rockchip_thermal_probe,
1776aeed442fSElaine Zhang };
1777