xref: /rk3399_rockchip-uboot/drivers/thermal/rockchip_thermal.c (revision 08c89849fae175f91126d5bb91b25d2f8a04b32e)
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