1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (c) 2014-2016, Fuzhou Rockchip Electronics Co., Ltd
4 * Caesar Wang <wxt@rock-chips.com>
5 */
6
7#include <linux/clk.h>
8#include <linux/delay.h>
9#include <linux/interrupt.h>
10#include <linux/io.h>
11#include <linux/module.h>
12#include <linux/of.h>
13#include <linux/of_address.h>
14#include <linux/of_irq.h>
15#include <linux/platform_device.h>
16#include <linux/regmap.h>
17#include <linux/reset.h>
18#include <linux/thermal.h>
19#include <linux/mfd/syscon.h>
20#include <linux/pinctrl/consumer.h>
21
22/*
23 * If the temperature over a period of time High,
24 * the resulting TSHUT gave CRU module,let it reset the entire chip,
25 * or via GPIO give PMIC.
26 */
27enum tshut_mode {
28	TSHUT_MODE_CRU = 0,
29	TSHUT_MODE_GPIO,
30};
31
32/*
33 * The system Temperature Sensors tshut(tshut) polarity
34 * the bit 8 is tshut polarity.
35 * 0: low active, 1: high active
36 */
37enum tshut_polarity {
38	TSHUT_LOW_ACTIVE = 0,
39	TSHUT_HIGH_ACTIVE,
40};
41
42/*
43 * The conversion table has the adc value and temperature.
44 * ADC_DECREMENT: the adc value is of diminishing.(e.g. rk3288_code_table)
45 * ADC_INCREMENT: the adc value is incremental.(e.g. rk3368_code_table)
46 */
47enum adc_sort_mode {
48	ADC_DECREMENT = 0,
49	ADC_INCREMENT,
50};
51
52#include "thermal_hwmon.h"
53
54/**
55 * struct chip_tsadc_table - hold information about chip-specific differences
56 * @id: conversion table
57 * @length: size of conversion table
58 * @data_mask: mask to apply on data inputs
59 * @mode: sort mode of this adc variant (incrementing or decrementing)
60 */
61struct chip_tsadc_table {
62	const struct tsadc_table *id;
63	unsigned int length;
64	u32 data_mask;
65	enum adc_sort_mode mode;
66};
67
68/**
69 * struct rockchip_tsadc_chip - hold the private data of tsadc chip
70 * @chn_offset: the channel offset of the first channel
71 * @chn_num: the channel number of tsadc chip
72 * @tshut_temp: the hardware-controlled shutdown temperature value
73 * @tshut_mode: the hardware-controlled shutdown mode (0:CRU 1:GPIO)
74 * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
75 * @initialize: SoC special initialize tsadc controller method
76 * @irq_ack: clear the interrupt
77 * @control: enable/disable method for the tsadc controller
78 * @get_temp: get the temperature
79 * @set_alarm_temp: set the high temperature interrupt
80 * @set_tshut_temp: set the hardware-controlled shutdown temperature
81 * @set_tshut_mode: set the hardware-controlled shutdown mode
82 * @table: the chip-specific conversion table
83 */
84struct rockchip_tsadc_chip {
85	/* The sensor id of chip correspond to the ADC channel */
86	int chn_offset;
87	int chn_num;
88
89	/* The hardware-controlled tshut property */
90	int tshut_temp;
91	enum tshut_mode tshut_mode;
92	enum tshut_polarity tshut_polarity;
93
94	/* Chip-wide methods */
95	void (*initialize)(struct regmap *grf,
96			   void __iomem *reg, enum tshut_polarity p);
97	void (*irq_ack)(void __iomem *reg);
98	void (*control)(void __iomem *reg, bool on);
99
100	/* Per-sensor methods */
101	int (*get_temp)(const struct chip_tsadc_table *table,
102			int chn, void __iomem *reg, int *temp);
103	int (*set_alarm_temp)(const struct chip_tsadc_table *table,
104			      int chn, void __iomem *reg, int temp);
105	int (*set_tshut_temp)(const struct chip_tsadc_table *table,
106			      int chn, void __iomem *reg, int temp);
107	void (*set_tshut_mode)(int chn, void __iomem *reg, enum tshut_mode m);
108
109	/* Per-table methods */
110	struct chip_tsadc_table table;
111};
112
113/**
114 * struct rockchip_thermal_sensor - hold the information of thermal sensor
115 * @thermal:  pointer to the platform/configuration data
116 * @tzd: pointer to a thermal zone
117 * @id: identifier of the thermal sensor
118 */
119struct rockchip_thermal_sensor {
120	struct rockchip_thermal_data *thermal;
121	struct thermal_zone_device *tzd;
122	int id;
123};
124
125/**
126 * struct rockchip_thermal_data - hold the private data of thermal driver
127 * @chip: pointer to the platform/configuration data
128 * @pdev: platform device of thermal
129 * @reset: the reset controller of tsadc
130 * @sensors: array of thermal sensors
131 * @clk: the controller clock is divided by the exteral 24MHz
132 * @pclk: the advanced peripherals bus clock
133 * @grf: the general register file will be used to do static set by software
134 * @regs: the base address of tsadc controller
135 * @tshut_temp: the hardware-controlled shutdown temperature value
136 * @tshut_mode: the hardware-controlled shutdown mode (0:CRU 1:GPIO)
137 * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
138 */
139struct rockchip_thermal_data {
140	const struct rockchip_tsadc_chip *chip;
141	struct platform_device *pdev;
142	struct reset_control *reset;
143
144	struct rockchip_thermal_sensor *sensors;
145
146	struct clk *clk;
147	struct clk *pclk;
148
149	struct regmap *grf;
150	void __iomem *regs;
151
152	int tshut_temp;
153	enum tshut_mode tshut_mode;
154	enum tshut_polarity tshut_polarity;
155};
156
157/*
158 * TSADC Sensor Register description:
159 *
160 * TSADCV2_* are used for RK3288 SoCs, the other chips can reuse it.
161 * TSADCV3_* are used for newer SoCs than RK3288. (e.g: RK3228, RK3399)
162 *
163 */
164#define TSADCV2_USER_CON			0x00
165#define TSADCV2_AUTO_CON			0x04
166#define TSADCV2_INT_EN				0x08
167#define TSADCV2_INT_PD				0x0c
168#define TSADCV3_AUTO_SRC_CON			0x0c
169#define TSADCV3_HT_INT_EN			0x14
170#define TSADCV3_HSHUT_GPIO_INT_EN		0x18
171#define TSADCV3_HSHUT_CRU_INT_EN		0x1c
172#define TSADCV3_INT_PD				0x24
173#define TSADCV3_HSHUT_PD			0x28
174#define TSADCV2_DATA(chn)			(0x20 + (chn) * 0x04)
175#define TSADCV2_COMP_INT(chn)		        (0x30 + (chn) * 0x04)
176#define TSADCV2_COMP_SHUT(chn)		        (0x40 + (chn) * 0x04)
177#define TSADCV3_DATA(chn)			(0x2c + (chn) * 0x04)
178#define TSADCV3_COMP_INT(chn)		        (0x6c + (chn) * 0x04)
179#define TSADCV3_COMP_SHUT(chn)		        (0x10c + (chn) * 0x04)
180#define TSADCV2_HIGHT_INT_DEBOUNCE		0x60
181#define TSADCV2_HIGHT_TSHUT_DEBOUNCE		0x64
182#define TSADCV3_HIGHT_INT_DEBOUNCE		0x14c
183#define TSADCV3_HIGHT_TSHUT_DEBOUNCE		0x150
184#define TSADCV2_AUTO_PERIOD			0x68
185#define TSADCV2_AUTO_PERIOD_HT			0x6c
186#define TSADCV3_AUTO_PERIOD			0x154
187#define TSADCV3_AUTO_PERIOD_HT			0x158
188
189#define TSADCV2_AUTO_EN				BIT(0)
190#define TSADCV2_AUTO_EN_MASK			BIT(16)
191#define TSADCV2_AUTO_SRC_EN(chn)		BIT(4 + (chn))
192#define TSADCV3_AUTO_SRC_EN(chn)		BIT(chn)
193#define TSADCV3_AUTO_SRC_EN_MASK(chn)		BIT(16 + chn)
194#define TSADCV2_AUTO_TSHUT_POLARITY_HIGH	BIT(8)
195#define TSADCV2_AUTO_TSHUT_POLARITY_MASK	BIT(24)
196
197#define TSADCV3_AUTO_Q_SEL_EN			BIT(1)
198
199#define TSADCV2_INT_SRC_EN(chn)			BIT(chn)
200#define TSADCV2_INT_SRC_EN_MASK(chn)		BIT(16 + (chn))
201#define TSADCV2_SHUT_2GPIO_SRC_EN(chn)		BIT(4 + (chn))
202#define TSADCV2_SHUT_2CRU_SRC_EN(chn)		BIT(8 + (chn))
203
204#define TSADCV2_INT_PD_CLEAR_MASK		~BIT(8)
205#define TSADCV3_INT_PD_CLEAR_MASK		~BIT(16)
206#define TSADCV4_INT_PD_CLEAR_MASK		0xffffffff
207
208#define TSADCV2_DATA_MASK			0xfff
209#define TSADCV3_DATA_MASK			0x3ff
210#define TSADCV4_DATA_MASK			0x1ff
211
212#define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT	4
213#define TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT	4
214#define TSADCV2_AUTO_PERIOD_TIME		250 /* 250ms */
215#define TSADCV2_AUTO_PERIOD_HT_TIME		50  /* 50ms */
216#define TSADCV3_AUTO_PERIOD_TIME		1875 /* 2.5ms */
217#define TSADCV3_AUTO_PERIOD_HT_TIME		1875 /* 2.5ms */
218
219#define TSADCV5_AUTO_PERIOD_TIME		1622 /* 2.5ms */
220#define TSADCV5_AUTO_PERIOD_HT_TIME		1622 /* 2.5ms */
221#define TSADCV6_AUTO_PERIOD_TIME		5000 /* 2.5ms */
222#define TSADCV6_AUTO_PERIOD_HT_TIME		5000 /* 2.5ms */
223
224#define TSADCV2_USER_INTER_PD_SOC		0x340 /* 13 clocks */
225#define TSADCV5_USER_INTER_PD_SOC		0xfc0 /* 97us, at least 90us */
226
227#define GRF_SARADC_TESTBIT			0x0e644
228#define GRF_TSADC_TESTBIT_L			0x0e648
229#define GRF_TSADC_TESTBIT_H			0x0e64c
230
231#define PX30_GRF_SOC_CON2			0x0408
232
233#define RK3568_GRF_TSADC_CON			0x0600
234#define RK3568_GRF_TSADC_ANA_REG0		(0x10001 << 0)
235#define RK3568_GRF_TSADC_ANA_REG1		(0x10001 << 1)
236#define RK3568_GRF_TSADC_ANA_REG2		(0x10001 << 2)
237#define RK3568_GRF_TSADC_TSEN			(0x10001 << 8)
238
239#define RK3588_GRF0_TSADC_CON			0x0100
240
241#define RK3588_GRF0_TSADC_TRM			(0xff0077 << 0)
242#define RK3588_GRF0_TSADC_SHUT_2CRU		(0x30003 << 10)
243#define RK3588_GRF0_TSADC_SHUT_2GPIO		(0x70007 << 12)
244
245#define GRF_SARADC_TESTBIT_ON			(0x10001 << 2)
246#define GRF_TSADC_TESTBIT_H_ON			(0x10001 << 2)
247#define GRF_TSADC_VCM_EN_L			(0x10001 << 7)
248#define GRF_TSADC_VCM_EN_H			(0x10001 << 7)
249
250#define GRF_CON_TSADC_CH_INV			(0x10001 << 1)
251
252/**
253 * struct tsadc_table - code to temperature conversion table
254 * @code: the value of adc channel
255 * @temp: the temperature
256 * Note:
257 * code to temperature mapping of the temperature sensor is a piece wise linear
258 * curve.Any temperature, code faling between to 2 give temperatures can be
259 * linearly interpolated.
260 * Code to Temperature mapping should be updated based on manufacturer results.
261 */
262struct tsadc_table {
263	u32 code;
264	int temp;
265};
266
267static const struct tsadc_table rv1108_table[] = {
268	{0, -40000},
269	{374, -40000},
270	{382, -35000},
271	{389, -30000},
272	{397, -25000},
273	{405, -20000},
274	{413, -15000},
275	{421, -10000},
276	{429, -5000},
277	{436, 0},
278	{444, 5000},
279	{452, 10000},
280	{460, 15000},
281	{468, 20000},
282	{476, 25000},
283	{483, 30000},
284	{491, 35000},
285	{499, 40000},
286	{507, 45000},
287	{515, 50000},
288	{523, 55000},
289	{531, 60000},
290	{539, 65000},
291	{547, 70000},
292	{555, 75000},
293	{562, 80000},
294	{570, 85000},
295	{578, 90000},
296	{586, 95000},
297	{594, 100000},
298	{602, 105000},
299	{610, 110000},
300	{618, 115000},
301	{626, 120000},
302	{634, 125000},
303	{TSADCV2_DATA_MASK, 125000},
304};
305
306static const struct tsadc_table rk3228_code_table[] = {
307	{0, -40000},
308	{588, -40000},
309	{593, -35000},
310	{598, -30000},
311	{603, -25000},
312	{608, -20000},
313	{613, -15000},
314	{618, -10000},
315	{623, -5000},
316	{629, 0},
317	{634, 5000},
318	{639, 10000},
319	{644, 15000},
320	{649, 20000},
321	{654, 25000},
322	{660, 30000},
323	{665, 35000},
324	{670, 40000},
325	{675, 45000},
326	{681, 50000},
327	{686, 55000},
328	{691, 60000},
329	{696, 65000},
330	{702, 70000},
331	{707, 75000},
332	{712, 80000},
333	{717, 85000},
334	{723, 90000},
335	{728, 95000},
336	{733, 100000},
337	{738, 105000},
338	{744, 110000},
339	{749, 115000},
340	{754, 120000},
341	{760, 125000},
342	{TSADCV2_DATA_MASK, 125000},
343};
344
345static const struct tsadc_table rk3288_code_table[] = {
346	{TSADCV2_DATA_MASK, -40000},
347	{3800, -40000},
348	{3792, -35000},
349	{3783, -30000},
350	{3774, -25000},
351	{3765, -20000},
352	{3756, -15000},
353	{3747, -10000},
354	{3737, -5000},
355	{3728, 0},
356	{3718, 5000},
357	{3708, 10000},
358	{3698, 15000},
359	{3688, 20000},
360	{3678, 25000},
361	{3667, 30000},
362	{3656, 35000},
363	{3645, 40000},
364	{3634, 45000},
365	{3623, 50000},
366	{3611, 55000},
367	{3600, 60000},
368	{3588, 65000},
369	{3575, 70000},
370	{3563, 75000},
371	{3550, 80000},
372	{3537, 85000},
373	{3524, 90000},
374	{3510, 95000},
375	{3496, 100000},
376	{3482, 105000},
377	{3467, 110000},
378	{3452, 115000},
379	{3437, 120000},
380	{3421, 125000},
381	{0, 125000},
382};
383
384static const struct tsadc_table rk3328_code_table[] = {
385	{0, -40000},
386	{296, -40000},
387	{304, -35000},
388	{313, -30000},
389	{331, -20000},
390	{340, -15000},
391	{349, -10000},
392	{359, -5000},
393	{368, 0},
394	{378, 5000},
395	{388, 10000},
396	{398, 15000},
397	{408, 20000},
398	{418, 25000},
399	{429, 30000},
400	{440, 35000},
401	{451, 40000},
402	{462, 45000},
403	{473, 50000},
404	{485, 55000},
405	{496, 60000},
406	{508, 65000},
407	{521, 70000},
408	{533, 75000},
409	{546, 80000},
410	{559, 85000},
411	{572, 90000},
412	{586, 95000},
413	{600, 100000},
414	{614, 105000},
415	{629, 110000},
416	{644, 115000},
417	{659, 120000},
418	{675, 125000},
419	{TSADCV2_DATA_MASK, 125000},
420};
421
422static const struct tsadc_table rk3368_code_table[] = {
423	{0, -40000},
424	{106, -40000},
425	{108, -35000},
426	{110, -30000},
427	{112, -25000},
428	{114, -20000},
429	{116, -15000},
430	{118, -10000},
431	{120, -5000},
432	{122, 0},
433	{124, 5000},
434	{126, 10000},
435	{128, 15000},
436	{130, 20000},
437	{132, 25000},
438	{134, 30000},
439	{136, 35000},
440	{138, 40000},
441	{140, 45000},
442	{142, 50000},
443	{144, 55000},
444	{146, 60000},
445	{148, 65000},
446	{150, 70000},
447	{152, 75000},
448	{154, 80000},
449	{156, 85000},
450	{158, 90000},
451	{160, 95000},
452	{162, 100000},
453	{163, 105000},
454	{165, 110000},
455	{167, 115000},
456	{169, 120000},
457	{171, 125000},
458	{TSADCV3_DATA_MASK, 125000},
459};
460
461static const struct tsadc_table rk3399_code_table[] = {
462	{0, -40000},
463	{402, -40000},
464	{410, -35000},
465	{419, -30000},
466	{427, -25000},
467	{436, -20000},
468	{444, -15000},
469	{453, -10000},
470	{461, -5000},
471	{470, 0},
472	{478, 5000},
473	{487, 10000},
474	{496, 15000},
475	{504, 20000},
476	{513, 25000},
477	{521, 30000},
478	{530, 35000},
479	{538, 40000},
480	{547, 45000},
481	{555, 50000},
482	{564, 55000},
483	{573, 60000},
484	{581, 65000},
485	{590, 70000},
486	{599, 75000},
487	{607, 80000},
488	{616, 85000},
489	{624, 90000},
490	{633, 95000},
491	{642, 100000},
492	{650, 105000},
493	{659, 110000},
494	{668, 115000},
495	{677, 120000},
496	{685, 125000},
497	{TSADCV3_DATA_MASK, 125000},
498};
499
500static const struct tsadc_table rk3568_code_table[] = {
501	{0, -40000},
502	{1584, -40000},
503	{1620, -35000},
504	{1652, -30000},
505	{1688, -25000},
506	{1720, -20000},
507	{1756, -15000},
508	{1788, -10000},
509	{1824, -5000},
510	{1856, 0},
511	{1892, 5000},
512	{1924, 10000},
513	{1956, 15000},
514	{1992, 20000},
515	{2024, 25000},
516	{2060, 30000},
517	{2092, 35000},
518	{2128, 40000},
519	{2160, 45000},
520	{2196, 50000},
521	{2228, 55000},
522	{2264, 60000},
523	{2300, 65000},
524	{2332, 70000},
525	{2368, 75000},
526	{2400, 80000},
527	{2436, 85000},
528	{2468, 90000},
529	{2500, 95000},
530	{2536, 100000},
531	{2572, 105000},
532	{2604, 110000},
533	{2636, 115000},
534	{2672, 120000},
535	{2704, 125000},
536	{TSADCV2_DATA_MASK, 125000},
537};
538
539static const struct tsadc_table rk3588_code_table[] = {
540	{0, -40000},
541	{215, -40000},
542	{285, 25000},
543	{350, 85000},
544	{395, 125000},
545	{TSADCV4_DATA_MASK, 125000},
546};
547
548static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table,
549				   int temp)
550{
551	int high, low, mid;
552	unsigned long num;
553	unsigned int denom;
554	u32 error = table->data_mask;
555
556	low = 0;
557	high = (table->length - 1) - 1; /* ignore the last check for table */
558	mid = (high + low) / 2;
559
560	/* Return mask code data when the temp is over table range */
561	if (temp < table->id[low].temp || temp > table->id[high].temp)
562		goto exit;
563
564	while (low <= high) {
565		if (temp == table->id[mid].temp)
566			return table->id[mid].code;
567		else if (temp < table->id[mid].temp)
568			high = mid - 1;
569		else
570			low = mid + 1;
571		mid = (low + high) / 2;
572	}
573
574	/*
575	 * The conversion code granularity provided by the table. Let's
576	 * assume that the relationship between temperature and
577	 * analog value between 2 table entries is linear and interpolate
578	 * to produce less granular result.
579	 */
580	num = abs(table->id[mid + 1].code - table->id[mid].code);
581	num *= temp - table->id[mid].temp;
582	denom = table->id[mid + 1].temp - table->id[mid].temp;
583
584	switch (table->mode) {
585	case ADC_DECREMENT:
586		return table->id[mid].code - (num / denom);
587	case ADC_INCREMENT:
588		return table->id[mid].code + (num / denom);
589	default:
590		pr_err("%s: unknown table mode: %d\n", __func__, table->mode);
591		return error;
592	}
593
594exit:
595	pr_err("%s: invalid temperature, temp=%d error=%d\n",
596	       __func__, temp, error);
597	return error;
598}
599
600static int rk_tsadcv2_code_to_temp(const struct chip_tsadc_table *table,
601				   u32 code, int *temp)
602{
603	unsigned int low = 1;
604	unsigned int high = table->length - 1;
605	unsigned int mid = (low + high) / 2;
606	unsigned int num;
607	unsigned long denom;
608
609	WARN_ON(table->length < 2);
610
611	switch (table->mode) {
612	case ADC_DECREMENT:
613		code &= table->data_mask;
614		if (code <= table->id[high].code)
615			return -EAGAIN;		/* Incorrect reading */
616
617		while (low <= high) {
618			if (code >= table->id[mid].code &&
619			    code < table->id[mid - 1].code)
620				break;
621			else if (code < table->id[mid].code)
622				low = mid + 1;
623			else
624				high = mid - 1;
625
626			mid = (low + high) / 2;
627		}
628		break;
629	case ADC_INCREMENT:
630		code &= table->data_mask;
631		if (code < table->id[low].code)
632			return -EAGAIN;		/* Incorrect reading */
633
634		while (low <= high) {
635			if (code <= table->id[mid].code &&
636			    code > table->id[mid - 1].code)
637				break;
638			else if (code > table->id[mid].code)
639				low = mid + 1;
640			else
641				high = mid - 1;
642
643			mid = (low + high) / 2;
644		}
645		break;
646	default:
647		pr_err("%s: unknown table mode: %d\n", __func__, table->mode);
648		return -EINVAL;
649	}
650
651	/*
652	 * The 5C granularity provided by the table is too much. Let's
653	 * assume that the relationship between sensor readings and
654	 * temperature between 2 table entries is linear and interpolate
655	 * to produce less granular result.
656	 */
657	num = table->id[mid].temp - table->id[mid - 1].temp;
658	num *= abs(table->id[mid - 1].code - code);
659	denom = abs(table->id[mid - 1].code - table->id[mid].code);
660	*temp = table->id[mid - 1].temp + (num / denom);
661
662	return 0;
663}
664
665/**
666 * rk_tsadcv2_initialize - initialize TASDC Controller.
667 * @grf: the general register file will be used to do static set by software
668 * @regs: the base address of tsadc controller
669 * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
670 *
671 * (1) Set TSADC_V2_AUTO_PERIOD:
672 *     Configure the interleave between every two accessing of
673 *     TSADC in normal operation.
674 *
675 * (2) Set TSADCV2_AUTO_PERIOD_HT:
676 *     Configure the interleave between every two accessing of
677 *     TSADC after the temperature is higher than COM_SHUT or COM_INT.
678 *
679 * (3) Set TSADCV2_HIGH_INT_DEBOUNCE and TSADC_HIGHT_TSHUT_DEBOUNCE:
680 *     If the temperature is higher than COMP_INT or COMP_SHUT for
681 *     "debounce" times, TSADC controller will generate interrupt or TSHUT.
682 */
683static void rk_tsadcv2_initialize(struct regmap *grf, void __iomem *regs,
684				  enum tshut_polarity tshut_polarity)
685{
686	if (tshut_polarity == TSHUT_HIGH_ACTIVE)
687		writel_relaxed(0U | TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
688			       regs + TSADCV2_AUTO_CON);
689	else
690		writel_relaxed(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
691			       regs + TSADCV2_AUTO_CON);
692
693	writel_relaxed(TSADCV2_AUTO_PERIOD_TIME, regs + TSADCV2_AUTO_PERIOD);
694	writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
695		       regs + TSADCV2_HIGHT_INT_DEBOUNCE);
696	writel_relaxed(TSADCV2_AUTO_PERIOD_HT_TIME,
697		       regs + TSADCV2_AUTO_PERIOD_HT);
698	writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
699		       regs + TSADCV2_HIGHT_TSHUT_DEBOUNCE);
700}
701
702/**
703 * rk_tsadcv3_initialize - initialize TASDC Controller.
704 * @grf: the general register file will be used to do static set by software
705 * @regs: the base address of tsadc controller
706 * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
707 *
708 * (1) The tsadc control power sequence.
709 *
710 * (2) Set TSADC_V2_AUTO_PERIOD:
711 *     Configure the interleave between every two accessing of
712 *     TSADC in normal operation.
713 *
714 * (2) Set TSADCV2_AUTO_PERIOD_HT:
715 *     Configure the interleave between every two accessing of
716 *     TSADC after the temperature is higher than COM_SHUT or COM_INT.
717 *
718 * (3) Set TSADCV2_HIGH_INT_DEBOUNCE and TSADC_HIGHT_TSHUT_DEBOUNCE:
719 *     If the temperature is higher than COMP_INT or COMP_SHUT for
720 *     "debounce" times, TSADC controller will generate interrupt or TSHUT.
721 */
722static void rk_tsadcv3_initialize(struct regmap *grf, void __iomem *regs,
723				  enum tshut_polarity tshut_polarity)
724{
725	/* The tsadc control power sequence */
726	if (IS_ERR(grf)) {
727		/* Set interleave value to workround ic time sync issue */
728		writel_relaxed(TSADCV2_USER_INTER_PD_SOC, regs +
729			       TSADCV2_USER_CON);
730
731		writel_relaxed(TSADCV2_AUTO_PERIOD_TIME,
732			       regs + TSADCV2_AUTO_PERIOD);
733		writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
734			       regs + TSADCV2_HIGHT_INT_DEBOUNCE);
735		writel_relaxed(TSADCV2_AUTO_PERIOD_HT_TIME,
736			       regs + TSADCV2_AUTO_PERIOD_HT);
737		writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
738			       regs + TSADCV2_HIGHT_TSHUT_DEBOUNCE);
739
740	} else {
741		/* Enable the voltage common mode feature */
742		regmap_write(grf, GRF_TSADC_TESTBIT_L, GRF_TSADC_VCM_EN_L);
743		regmap_write(grf, GRF_TSADC_TESTBIT_H, GRF_TSADC_VCM_EN_H);
744
745		usleep_range(15, 100); /* The spec note says at least 15 us */
746		regmap_write(grf, GRF_SARADC_TESTBIT, GRF_SARADC_TESTBIT_ON);
747		regmap_write(grf, GRF_TSADC_TESTBIT_H, GRF_TSADC_TESTBIT_H_ON);
748		usleep_range(90, 200); /* The spec note says at least 90 us */
749
750		writel_relaxed(TSADCV3_AUTO_PERIOD_TIME,
751			       regs + TSADCV2_AUTO_PERIOD);
752		writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
753			       regs + TSADCV2_HIGHT_INT_DEBOUNCE);
754		writel_relaxed(TSADCV3_AUTO_PERIOD_HT_TIME,
755			       regs + TSADCV2_AUTO_PERIOD_HT);
756		writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
757			       regs + TSADCV2_HIGHT_TSHUT_DEBOUNCE);
758	}
759
760	if (tshut_polarity == TSHUT_HIGH_ACTIVE)
761		writel_relaxed(0U | TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
762			       regs + TSADCV2_AUTO_CON);
763	else
764		writel_relaxed(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
765			       regs + TSADCV2_AUTO_CON);
766}
767
768static void rk_tsadcv4_initialize(struct regmap *grf, void __iomem *regs,
769				  enum tshut_polarity tshut_polarity)
770{
771	rk_tsadcv2_initialize(grf, regs, tshut_polarity);
772	regmap_write(grf, PX30_GRF_SOC_CON2, GRF_CON_TSADC_CH_INV);
773}
774
775static void rk_tsadcv7_initialize(struct regmap *grf, void __iomem *regs,
776				  enum tshut_polarity tshut_polarity)
777{
778	writel_relaxed(TSADCV5_USER_INTER_PD_SOC, regs + TSADCV2_USER_CON);
779	writel_relaxed(TSADCV5_AUTO_PERIOD_TIME, regs + TSADCV2_AUTO_PERIOD);
780	writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
781		       regs + TSADCV2_HIGHT_INT_DEBOUNCE);
782	writel_relaxed(TSADCV5_AUTO_PERIOD_HT_TIME,
783		       regs + TSADCV2_AUTO_PERIOD_HT);
784	writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
785		       regs + TSADCV2_HIGHT_TSHUT_DEBOUNCE);
786
787	if (tshut_polarity == TSHUT_HIGH_ACTIVE)
788		writel_relaxed(0U | TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
789			       regs + TSADCV2_AUTO_CON);
790	else
791		writel_relaxed(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
792			       regs + TSADCV2_AUTO_CON);
793
794	/*
795	 * The general register file will is optional
796	 * and might not be available.
797	 */
798	if (!IS_ERR(grf)) {
799		regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN);
800		/*
801		 * RK3568 TRM, section 18.5. requires a delay no less
802		 * than 10us between the rising edge of tsadc_tsen_en
803		 * and the rising edge of tsadc_ana_reg_0/1/2.
804		 */
805		udelay(15);
806		regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0);
807		regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1);
808		regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2);
809
810		/*
811		 * RK3568 TRM, section 18.5. requires a delay no less
812		 * than 90us after the rising edge of tsadc_ana_reg_0/1/2.
813		 */
814		usleep_range(100, 200);
815	}
816}
817
818static void rk_tsadcv8_initialize(struct regmap *grf, void __iomem *regs,
819				  enum tshut_polarity tshut_polarity)
820{
821	writel_relaxed(TSADCV6_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD);
822	writel_relaxed(TSADCV6_AUTO_PERIOD_HT_TIME,
823		       regs + TSADCV3_AUTO_PERIOD_HT);
824	writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
825		       regs + TSADCV3_HIGHT_INT_DEBOUNCE);
826	writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
827		       regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
828	if (tshut_polarity == TSHUT_HIGH_ACTIVE)
829		writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
830			       TSADCV2_AUTO_TSHUT_POLARITY_MASK,
831			       regs + TSADCV2_AUTO_CON);
832	else
833		writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
834			       regs + TSADCV2_AUTO_CON);
835}
836
837static void rk_tsadcv2_irq_ack(void __iomem *regs)
838{
839	u32 val;
840
841	val = readl_relaxed(regs + TSADCV2_INT_PD);
842	writel_relaxed(val & TSADCV2_INT_PD_CLEAR_MASK, regs + TSADCV2_INT_PD);
843}
844
845static void rk_tsadcv3_irq_ack(void __iomem *regs)
846{
847	u32 val;
848
849	val = readl_relaxed(regs + TSADCV2_INT_PD);
850	writel_relaxed(val & TSADCV3_INT_PD_CLEAR_MASK, regs + TSADCV2_INT_PD);
851}
852
853static void rk_tsadcv4_irq_ack(void __iomem *regs)
854{
855	u32 val;
856
857	val = readl_relaxed(regs + TSADCV3_INT_PD);
858	writel_relaxed(val & TSADCV4_INT_PD_CLEAR_MASK, regs + TSADCV3_INT_PD);
859	val = readl_relaxed(regs + TSADCV3_HSHUT_PD);
860	writel_relaxed(val & TSADCV3_INT_PD_CLEAR_MASK,
861		       regs + TSADCV3_HSHUT_PD);
862}
863
864static void rk_tsadcv2_control(void __iomem *regs, bool enable)
865{
866	u32 val;
867
868	val = readl_relaxed(regs + TSADCV2_AUTO_CON);
869	if (enable)
870		val |= TSADCV2_AUTO_EN;
871	else
872		val &= ~TSADCV2_AUTO_EN;
873
874	writel_relaxed(val, regs + TSADCV2_AUTO_CON);
875}
876
877/**
878 * rk_tsadcv3_control - the tsadc controller is enabled or disabled.
879 * @regs: the base address of tsadc controller
880 * @enable: boolean flag to enable the controller
881 *
882 * NOTE: TSADC controller works at auto mode, and some SoCs need set the
883 * tsadc_q_sel bit on TSADCV2_AUTO_CON[1]. The (1024 - tsadc_q) as output
884 * adc value if setting this bit to enable.
885 */
886static void rk_tsadcv3_control(void __iomem *regs, bool enable)
887{
888	u32 val;
889
890	val = readl_relaxed(regs + TSADCV2_AUTO_CON);
891	if (enable)
892		val |= TSADCV2_AUTO_EN | TSADCV3_AUTO_Q_SEL_EN;
893	else
894		val &= ~TSADCV2_AUTO_EN;
895
896	writel_relaxed(val, regs + TSADCV2_AUTO_CON);
897}
898
899static void rk_tsadcv4_control(void __iomem *regs, bool enable)
900{
901	u32 val;
902
903	if (enable)
904		val = TSADCV2_AUTO_EN | TSADCV2_AUTO_EN_MASK;
905	else
906		val = TSADCV2_AUTO_EN_MASK;
907
908	writel_relaxed(val, regs + TSADCV2_AUTO_CON);
909}
910
911static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table,
912			       int chn, void __iomem *regs, int *temp)
913{
914	u32 val;
915
916	val = readl_relaxed(regs + TSADCV2_DATA(chn));
917
918	return rk_tsadcv2_code_to_temp(table, val, temp);
919}
920
921static int rk_tsadcv4_get_temp(const struct chip_tsadc_table *table,
922			       int chn, void __iomem *regs, int *temp)
923{
924	u32 val;
925
926	val = readl_relaxed(regs + TSADCV3_DATA(chn));
927
928	return rk_tsadcv2_code_to_temp(table, val, temp);
929}
930
931static int rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table,
932				 int chn, void __iomem *regs, int temp)
933{
934	u32 alarm_value;
935	u32 int_en, int_clr;
936
937	/*
938	 * In some cases, some sensors didn't need the trip points, the
939	 * set_trips will pass {-INT_MAX, INT_MAX} to trigger tsadc alarm
940	 * in the end, ignore this case and disable the high temperature
941	 * interrupt.
942	 */
943	if (temp == INT_MAX) {
944		int_clr = readl_relaxed(regs + TSADCV2_INT_EN);
945		int_clr &= ~TSADCV2_INT_SRC_EN(chn);
946		writel_relaxed(int_clr, regs + TSADCV2_INT_EN);
947		return 0;
948	}
949
950	/* Make sure the value is valid */
951	alarm_value = rk_tsadcv2_temp_to_code(table, temp);
952	if (alarm_value == table->data_mask)
953		return -ERANGE;
954
955	writel_relaxed(alarm_value & table->data_mask,
956		       regs + TSADCV2_COMP_INT(chn));
957
958	int_en = readl_relaxed(regs + TSADCV2_INT_EN);
959	int_en |= TSADCV2_INT_SRC_EN(chn);
960	writel_relaxed(int_en, regs + TSADCV2_INT_EN);
961
962	return 0;
963}
964
965static int rk_tsadcv3_alarm_temp(const struct chip_tsadc_table *table,
966				 int chn, void __iomem *regs, int temp)
967{
968	u32 alarm_value;
969
970	/*
971	 * In some cases, some sensors didn't need the trip points, the
972	 * set_trips will pass {-INT_MAX, INT_MAX} to trigger tsadc alarm
973	 * in the end, ignore this case and disable the high temperature
974	 * interrupt.
975	 */
976	if (temp == INT_MAX) {
977		writel_relaxed(TSADCV2_INT_SRC_EN_MASK(chn),
978			       regs + TSADCV3_HT_INT_EN);
979		return 0;
980	}
981	/* Make sure the value is valid */
982	alarm_value = rk_tsadcv2_temp_to_code(table, temp);
983	if (alarm_value == table->data_mask)
984		return -ERANGE;
985	writel_relaxed(alarm_value & table->data_mask,
986		       regs + TSADCV3_COMP_INT(chn));
987	writel_relaxed(TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn),
988		       regs + TSADCV3_HT_INT_EN);
989	return 0;
990}
991
992static int rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table,
993				 int chn, void __iomem *regs, int temp)
994{
995	u32 tshut_value, val;
996
997	/* Make sure the value is valid */
998	tshut_value = rk_tsadcv2_temp_to_code(table, temp);
999	if (tshut_value == table->data_mask)
1000		return -ERANGE;
1001
1002	writel_relaxed(tshut_value, regs + TSADCV2_COMP_SHUT(chn));
1003
1004	/* TSHUT will be valid */
1005	val = readl_relaxed(regs + TSADCV2_AUTO_CON);
1006	writel_relaxed(val | TSADCV2_AUTO_SRC_EN(chn), regs + TSADCV2_AUTO_CON);
1007
1008	return 0;
1009}
1010
1011static int rk_tsadcv3_tshut_temp(const struct chip_tsadc_table *table,
1012				 int chn, void __iomem *regs, int temp)
1013{
1014	u32 tshut_value;
1015
1016	/* Make sure the value is valid */
1017	tshut_value = rk_tsadcv2_temp_to_code(table, temp);
1018	if (tshut_value == table->data_mask)
1019		return -ERANGE;
1020
1021	writel_relaxed(tshut_value, regs + TSADCV3_COMP_SHUT(chn));
1022
1023	/* TSHUT will be valid */
1024	writel_relaxed(TSADCV3_AUTO_SRC_EN(chn) | TSADCV3_AUTO_SRC_EN_MASK(chn),
1025		       regs + TSADCV3_AUTO_SRC_CON);
1026
1027	return 0;
1028}
1029
1030static void rk_tsadcv2_tshut_mode(int chn, void __iomem *regs,
1031				  enum tshut_mode mode)
1032{
1033	u32 val;
1034
1035	val = readl_relaxed(regs + TSADCV2_INT_EN);
1036	if (mode == TSHUT_MODE_GPIO) {
1037		val &= ~TSADCV2_SHUT_2CRU_SRC_EN(chn);
1038		val |= TSADCV2_SHUT_2GPIO_SRC_EN(chn);
1039	} else {
1040		val &= ~TSADCV2_SHUT_2GPIO_SRC_EN(chn);
1041		val |= TSADCV2_SHUT_2CRU_SRC_EN(chn);
1042	}
1043
1044	writel_relaxed(val, regs + TSADCV2_INT_EN);
1045}
1046
1047static void rk_tsadcv3_tshut_mode(int chn, void __iomem *regs,
1048				  enum tshut_mode mode)
1049{
1050	u32 val_gpio, val_cru;
1051
1052	if (mode == TSHUT_MODE_GPIO) {
1053		val_gpio = TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn);
1054		val_cru = TSADCV2_INT_SRC_EN_MASK(chn);
1055	} else {
1056		val_cru = TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn);
1057		val_gpio = TSADCV2_INT_SRC_EN_MASK(chn);
1058	}
1059	writel_relaxed(val_gpio, regs + TSADCV3_HSHUT_GPIO_INT_EN);
1060	writel_relaxed(val_cru, regs + TSADCV3_HSHUT_CRU_INT_EN);
1061}
1062
1063static const struct rockchip_tsadc_chip px30_tsadc_data = {
1064	/* cpu, gpu */
1065	.chn_offset = 0,
1066	.chn_num = 2, /* 2 channels for tsadc */
1067
1068	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1069	.tshut_temp = 95000,
1070
1071	.initialize = rk_tsadcv4_initialize,
1072	.irq_ack = rk_tsadcv3_irq_ack,
1073	.control = rk_tsadcv3_control,
1074	.get_temp = rk_tsadcv2_get_temp,
1075	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1076	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1077	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1078
1079	.table = {
1080		.id = rk3328_code_table,
1081		.length = ARRAY_SIZE(rk3328_code_table),
1082		.data_mask = TSADCV2_DATA_MASK,
1083		.mode = ADC_INCREMENT,
1084	},
1085};
1086
1087static const struct rockchip_tsadc_chip rv1108_tsadc_data = {
1088	/* cpu */
1089	.chn_offset = 0,
1090	.chn_num = 1, /* one channel for tsadc */
1091
1092	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1093	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1094	.tshut_temp = 95000,
1095
1096	.initialize = rk_tsadcv2_initialize,
1097	.irq_ack = rk_tsadcv3_irq_ack,
1098	.control = rk_tsadcv3_control,
1099	.get_temp = rk_tsadcv2_get_temp,
1100	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1101	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1102	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1103
1104	.table = {
1105		.id = rv1108_table,
1106		.length = ARRAY_SIZE(rv1108_table),
1107		.data_mask = TSADCV2_DATA_MASK,
1108		.mode = ADC_INCREMENT,
1109	},
1110};
1111
1112static const struct rockchip_tsadc_chip rk3228_tsadc_data = {
1113	/* cpu */
1114	.chn_offset = 0,
1115	.chn_num = 1, /* one channel for tsadc */
1116
1117	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1118	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1119	.tshut_temp = 95000,
1120
1121	.initialize = rk_tsadcv2_initialize,
1122	.irq_ack = rk_tsadcv3_irq_ack,
1123	.control = rk_tsadcv3_control,
1124	.get_temp = rk_tsadcv2_get_temp,
1125	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1126	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1127	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1128
1129	.table = {
1130		.id = rk3228_code_table,
1131		.length = ARRAY_SIZE(rk3228_code_table),
1132		.data_mask = TSADCV3_DATA_MASK,
1133		.mode = ADC_INCREMENT,
1134	},
1135};
1136
1137static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
1138	/* cpu, gpu */
1139	.chn_offset = 1,
1140	.chn_num = 2, /* two channels for tsadc */
1141
1142	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1143	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1144	.tshut_temp = 95000,
1145
1146	.initialize = rk_tsadcv2_initialize,
1147	.irq_ack = rk_tsadcv2_irq_ack,
1148	.control = rk_tsadcv2_control,
1149	.get_temp = rk_tsadcv2_get_temp,
1150	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1151	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1152	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1153
1154	.table = {
1155		.id = rk3288_code_table,
1156		.length = ARRAY_SIZE(rk3288_code_table),
1157		.data_mask = TSADCV2_DATA_MASK,
1158		.mode = ADC_DECREMENT,
1159	},
1160};
1161
1162static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
1163	/* cpu */
1164	.chn_offset = 0,
1165	.chn_num = 1, /* one channels for tsadc */
1166
1167	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1168	.tshut_temp = 95000,
1169
1170	.initialize = rk_tsadcv2_initialize,
1171	.irq_ack = rk_tsadcv3_irq_ack,
1172	.control = rk_tsadcv3_control,
1173	.get_temp = rk_tsadcv2_get_temp,
1174	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1175	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1176	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1177
1178	.table = {
1179		.id = rk3328_code_table,
1180		.length = ARRAY_SIZE(rk3328_code_table),
1181		.data_mask = TSADCV2_DATA_MASK,
1182		.mode = ADC_INCREMENT,
1183	},
1184};
1185
1186static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
1187	/* cpu, gpu */
1188	.chn_offset = 0,
1189	.chn_num = 2, /* two channels for tsadc */
1190
1191	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1192	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1193	.tshut_temp = 95000,
1194
1195	.initialize = rk_tsadcv3_initialize,
1196	.irq_ack = rk_tsadcv3_irq_ack,
1197	.control = rk_tsadcv3_control,
1198	.get_temp = rk_tsadcv2_get_temp,
1199	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1200	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1201	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1202
1203	.table = {
1204		.id = rk3228_code_table,
1205		.length = ARRAY_SIZE(rk3228_code_table),
1206		.data_mask = TSADCV3_DATA_MASK,
1207		.mode = ADC_INCREMENT,
1208	},
1209};
1210
1211static const struct rockchip_tsadc_chip rk3368_tsadc_data = {
1212	/* cpu, gpu */
1213	.chn_offset = 0,
1214	.chn_num = 2, /* two channels for tsadc */
1215
1216	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1217	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1218	.tshut_temp = 95000,
1219
1220	.initialize = rk_tsadcv2_initialize,
1221	.irq_ack = rk_tsadcv2_irq_ack,
1222	.control = rk_tsadcv2_control,
1223	.get_temp = rk_tsadcv2_get_temp,
1224	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1225	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1226	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1227
1228	.table = {
1229		.id = rk3368_code_table,
1230		.length = ARRAY_SIZE(rk3368_code_table),
1231		.data_mask = TSADCV3_DATA_MASK,
1232		.mode = ADC_INCREMENT,
1233	},
1234};
1235
1236static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
1237	/* cpu, gpu */
1238	.chn_offset = 0,
1239	.chn_num = 2, /* two channels for tsadc */
1240
1241	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1242	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1243	.tshut_temp = 95000,
1244
1245	.initialize = rk_tsadcv3_initialize,
1246	.irq_ack = rk_tsadcv3_irq_ack,
1247	.control = rk_tsadcv3_control,
1248	.get_temp = rk_tsadcv2_get_temp,
1249	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1250	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1251	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1252
1253	.table = {
1254		.id = rk3399_code_table,
1255		.length = ARRAY_SIZE(rk3399_code_table),
1256		.data_mask = TSADCV3_DATA_MASK,
1257		.mode = ADC_INCREMENT,
1258	},
1259};
1260
1261static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
1262	/* cpu, gpu */
1263	.chn_offset = 0,
1264	.chn_num = 2, /* two channels for tsadc */
1265
1266	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1267	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1268	.tshut_temp = 95000,
1269
1270	.initialize = rk_tsadcv7_initialize,
1271	.irq_ack = rk_tsadcv3_irq_ack,
1272	.control = rk_tsadcv3_control,
1273	.get_temp = rk_tsadcv2_get_temp,
1274	.set_alarm_temp = rk_tsadcv2_alarm_temp,
1275	.set_tshut_temp = rk_tsadcv2_tshut_temp,
1276	.set_tshut_mode = rk_tsadcv2_tshut_mode,
1277
1278	.table = {
1279		.id = rk3568_code_table,
1280		.length = ARRAY_SIZE(rk3568_code_table),
1281		.data_mask = TSADCV2_DATA_MASK,
1282		.mode = ADC_INCREMENT,
1283	},
1284};
1285
1286static const struct rockchip_tsadc_chip rk3588_tsadc_data = {
1287	/* top, big_core0, big_core1, little_core, center, gpu, npu */
1288	.chn_offset = 0,
1289	.chn_num = 7, /* seven channels for tsadc */
1290	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
1291	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1292	.tshut_temp = 95000,
1293	.initialize = rk_tsadcv8_initialize,
1294	.irq_ack = rk_tsadcv4_irq_ack,
1295	.control = rk_tsadcv4_control,
1296	.get_temp = rk_tsadcv4_get_temp,
1297	.set_alarm_temp = rk_tsadcv3_alarm_temp,
1298	.set_tshut_temp = rk_tsadcv3_tshut_temp,
1299	.set_tshut_mode = rk_tsadcv3_tshut_mode,
1300	.table = {
1301		.id = rk3588_code_table,
1302		.length = ARRAY_SIZE(rk3588_code_table),
1303		.data_mask = TSADCV4_DATA_MASK,
1304		.mode = ADC_INCREMENT,
1305	},
1306};
1307
1308static const struct of_device_id of_rockchip_thermal_match[] = {
1309	{	.compatible = "rockchip,px30-tsadc",
1310		.data = (void *)&px30_tsadc_data,
1311	},
1312	{
1313		.compatible = "rockchip,rv1108-tsadc",
1314		.data = (void *)&rv1108_tsadc_data,
1315	},
1316	{
1317		.compatible = "rockchip,rk3228-tsadc",
1318		.data = (void *)&rk3228_tsadc_data,
1319	},
1320	{
1321		.compatible = "rockchip,rk3288-tsadc",
1322		.data = (void *)&rk3288_tsadc_data,
1323	},
1324	{
1325		.compatible = "rockchip,rk3328-tsadc",
1326		.data = (void *)&rk3328_tsadc_data,
1327	},
1328	{
1329		.compatible = "rockchip,rk3366-tsadc",
1330		.data = (void *)&rk3366_tsadc_data,
1331	},
1332	{
1333		.compatible = "rockchip,rk3368-tsadc",
1334		.data = (void *)&rk3368_tsadc_data,
1335	},
1336	{
1337		.compatible = "rockchip,rk3399-tsadc",
1338		.data = (void *)&rk3399_tsadc_data,
1339	},
1340	{
1341		.compatible = "rockchip,rk3568-tsadc",
1342		.data = (void *)&rk3568_tsadc_data,
1343	},
1344	{
1345		.compatible = "rockchip,rk3588-tsadc",
1346		.data = (void *)&rk3588_tsadc_data,
1347	},
1348	{ /* end */ },
1349};
1350MODULE_DEVICE_TABLE(of, of_rockchip_thermal_match);
1351
1352static void
1353rockchip_thermal_toggle_sensor(struct rockchip_thermal_sensor *sensor, bool on)
1354{
1355	struct thermal_zone_device *tzd = sensor->tzd;
1356
1357	if (on)
1358		thermal_zone_device_enable(tzd);
1359	else
1360		thermal_zone_device_disable(tzd);
1361}
1362
1363static irqreturn_t rockchip_thermal_alarm_irq_thread(int irq, void *dev)
1364{
1365	struct rockchip_thermal_data *thermal = dev;
1366	int i;
1367
1368	dev_dbg(&thermal->pdev->dev, "thermal alarm\n");
1369
1370	thermal->chip->irq_ack(thermal->regs);
1371
1372	for (i = 0; i < thermal->chip->chn_num; i++)
1373		thermal_zone_device_update(thermal->sensors[i].tzd,
1374					   THERMAL_EVENT_UNSPECIFIED);
1375
1376	return IRQ_HANDLED;
1377}
1378
1379static int rockchip_thermal_set_trips(struct thermal_zone_device *tz, int low, int high)
1380{
1381	struct rockchip_thermal_sensor *sensor = thermal_zone_device_priv(tz);
1382	struct rockchip_thermal_data *thermal = sensor->thermal;
1383	const struct rockchip_tsadc_chip *tsadc = thermal->chip;
1384
1385	dev_dbg(&thermal->pdev->dev, "%s: sensor %d: low: %d, high %d\n",
1386		__func__, sensor->id, low, high);
1387
1388	return tsadc->set_alarm_temp(&tsadc->table,
1389				     sensor->id, thermal->regs, high);
1390}
1391
1392static int rockchip_thermal_get_temp(struct thermal_zone_device *tz, int *out_temp)
1393{
1394	struct rockchip_thermal_sensor *sensor = thermal_zone_device_priv(tz);
1395	struct rockchip_thermal_data *thermal = sensor->thermal;
1396	const struct rockchip_tsadc_chip *tsadc = sensor->thermal->chip;
1397	int retval;
1398
1399	retval = tsadc->get_temp(&tsadc->table,
1400				 sensor->id, thermal->regs, out_temp);
1401	return retval;
1402}
1403
1404static const struct thermal_zone_device_ops rockchip_of_thermal_ops = {
1405	.get_temp = rockchip_thermal_get_temp,
1406	.set_trips = rockchip_thermal_set_trips,
1407};
1408
1409static int rockchip_configure_from_dt(struct device *dev,
1410				      struct device_node *np,
1411				      struct rockchip_thermal_data *thermal)
1412{
1413	u32 shut_temp, tshut_mode, tshut_polarity;
1414
1415	if (of_property_read_u32(np, "rockchip,hw-tshut-temp", &shut_temp)) {
1416		dev_warn(dev,
1417			 "Missing tshut temp property, using default %d\n",
1418			 thermal->chip->tshut_temp);
1419		thermal->tshut_temp = thermal->chip->tshut_temp;
1420	} else {
1421		if (shut_temp > INT_MAX) {
1422			dev_err(dev, "Invalid tshut temperature specified: %d\n",
1423				shut_temp);
1424			return -ERANGE;
1425		}
1426		thermal->tshut_temp = shut_temp;
1427	}
1428
1429	if (of_property_read_u32(np, "rockchip,hw-tshut-mode", &tshut_mode)) {
1430		dev_warn(dev,
1431			 "Missing tshut mode property, using default (%s)\n",
1432			 thermal->chip->tshut_mode == TSHUT_MODE_GPIO ?
1433				"gpio" : "cru");
1434		thermal->tshut_mode = thermal->chip->tshut_mode;
1435	} else {
1436		thermal->tshut_mode = tshut_mode;
1437	}
1438
1439	if (thermal->tshut_mode > 1) {
1440		dev_err(dev, "Invalid tshut mode specified: %d\n",
1441			thermal->tshut_mode);
1442		return -EINVAL;
1443	}
1444
1445	if (of_property_read_u32(np, "rockchip,hw-tshut-polarity",
1446				 &tshut_polarity)) {
1447		dev_warn(dev,
1448			 "Missing tshut-polarity property, using default (%s)\n",
1449			 thermal->chip->tshut_polarity == TSHUT_LOW_ACTIVE ?
1450				"low" : "high");
1451		thermal->tshut_polarity = thermal->chip->tshut_polarity;
1452	} else {
1453		thermal->tshut_polarity = tshut_polarity;
1454	}
1455
1456	if (thermal->tshut_polarity > 1) {
1457		dev_err(dev, "Invalid tshut-polarity specified: %d\n",
1458			thermal->tshut_polarity);
1459		return -EINVAL;
1460	}
1461
1462	/* The tsadc wont to handle the error in here since some SoCs didn't
1463	 * need this property.
1464	 */
1465	thermal->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1466	if (IS_ERR(thermal->grf))
1467		dev_warn(dev, "Missing rockchip,grf property\n");
1468
1469	return 0;
1470}
1471
1472static int
1473rockchip_thermal_register_sensor(struct platform_device *pdev,
1474				 struct rockchip_thermal_data *thermal,
1475				 struct rockchip_thermal_sensor *sensor,
1476				 int id)
1477{
1478	const struct rockchip_tsadc_chip *tsadc = thermal->chip;
1479	int error;
1480
1481	tsadc->set_tshut_mode(id, thermal->regs, thermal->tshut_mode);
1482
1483	error = tsadc->set_tshut_temp(&tsadc->table, id, thermal->regs,
1484			      thermal->tshut_temp);
1485	if (error)
1486		dev_err(&pdev->dev, "%s: invalid tshut=%d, error=%d\n",
1487			__func__, thermal->tshut_temp, error);
1488
1489	sensor->thermal = thermal;
1490	sensor->id = id;
1491	sensor->tzd = devm_thermal_of_zone_register(&pdev->dev, id, sensor,
1492						    &rockchip_of_thermal_ops);
1493	if (IS_ERR(sensor->tzd)) {
1494		error = PTR_ERR(sensor->tzd);
1495		dev_err(&pdev->dev, "failed to register sensor %d: %d\n",
1496			id, error);
1497		return error;
1498	}
1499
1500	return 0;
1501}
1502
1503/**
1504 * rockchip_thermal_reset_controller - Reset TSADC Controller, reset all tsadc registers.
1505 * @reset: the reset controller of tsadc
1506 */
1507static void rockchip_thermal_reset_controller(struct reset_control *reset)
1508{
1509	reset_control_assert(reset);
1510	usleep_range(10, 20);
1511	reset_control_deassert(reset);
1512}
1513
1514static int rockchip_thermal_probe(struct platform_device *pdev)
1515{
1516	struct device_node *np = pdev->dev.of_node;
1517	struct rockchip_thermal_data *thermal;
1518	int irq;
1519	int i;
1520	int error;
1521
1522	irq = platform_get_irq(pdev, 0);
1523	if (irq < 0)
1524		return -EINVAL;
1525
1526	thermal = devm_kzalloc(&pdev->dev, sizeof(struct rockchip_thermal_data),
1527			       GFP_KERNEL);
1528	if (!thermal)
1529		return -ENOMEM;
1530
1531	thermal->pdev = pdev;
1532
1533	thermal->chip = device_get_match_data(&pdev->dev);
1534	if (!thermal->chip)
1535		return -EINVAL;
1536
1537	thermal->sensors = devm_kcalloc(&pdev->dev, thermal->chip->chn_num,
1538					sizeof(*thermal->sensors), GFP_KERNEL);
1539	if (!thermal->sensors)
1540		return -ENOMEM;
1541
1542	thermal->regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
1543	if (IS_ERR(thermal->regs))
1544		return PTR_ERR(thermal->regs);
1545
1546	thermal->reset = devm_reset_control_array_get_exclusive(&pdev->dev);
1547	if (IS_ERR(thermal->reset))
1548		return dev_err_probe(&pdev->dev, PTR_ERR(thermal->reset),
1549				     "failed to get tsadc reset.\n");
1550
1551	thermal->clk = devm_clk_get_enabled(&pdev->dev, "tsadc");
1552	if (IS_ERR(thermal->clk))
1553		return dev_err_probe(&pdev->dev, PTR_ERR(thermal->clk),
1554				     "failed to get tsadc clock.\n");
1555
1556	thermal->pclk = devm_clk_get_enabled(&pdev->dev, "apb_pclk");
1557	if (IS_ERR(thermal->pclk))
1558		return dev_err_probe(&pdev->dev, PTR_ERR(thermal->pclk),
1559				     "failed to get apb_pclk clock.\n");
1560
1561	rockchip_thermal_reset_controller(thermal->reset);
1562
1563	error = rockchip_configure_from_dt(&pdev->dev, np, thermal);
1564	if (error)
1565		return dev_err_probe(&pdev->dev, error,
1566				"failed to parse device tree data\n");
1567
1568	thermal->chip->initialize(thermal->grf, thermal->regs,
1569				  thermal->tshut_polarity);
1570
1571	for (i = 0; i < thermal->chip->chn_num; i++) {
1572		error = rockchip_thermal_register_sensor(pdev, thermal,
1573						&thermal->sensors[i],
1574						thermal->chip->chn_offset + i);
1575		if (error)
1576			return dev_err_probe(&pdev->dev, error,
1577				"failed to register sensor[%d].\n", i);
1578	}
1579
1580	error = devm_request_threaded_irq(&pdev->dev, irq, NULL,
1581					  &rockchip_thermal_alarm_irq_thread,
1582					  IRQF_ONESHOT,
1583					  "rockchip_thermal", thermal);
1584	if (error)
1585		return dev_err_probe(&pdev->dev, error,
1586				     "failed to request tsadc irq.\n");
1587
1588	thermal->chip->control(thermal->regs, true);
1589
1590	for (i = 0; i < thermal->chip->chn_num; i++) {
1591		rockchip_thermal_toggle_sensor(&thermal->sensors[i], true);
1592		error = thermal_add_hwmon_sysfs(thermal->sensors[i].tzd);
1593		if (error)
1594			dev_warn(&pdev->dev,
1595				 "failed to register sensor %d with hwmon: %d\n",
1596				 i, error);
1597	}
1598
1599	platform_set_drvdata(pdev, thermal);
1600
1601	return 0;
1602}
1603
1604static void rockchip_thermal_remove(struct platform_device *pdev)
1605{
1606	struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev);
1607	int i;
1608
1609	for (i = 0; i < thermal->chip->chn_num; i++) {
1610		struct rockchip_thermal_sensor *sensor = &thermal->sensors[i];
1611
1612		thermal_remove_hwmon_sysfs(sensor->tzd);
1613		rockchip_thermal_toggle_sensor(sensor, false);
1614	}
1615
1616	thermal->chip->control(thermal->regs, false);
1617}
1618
1619static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
1620{
1621	struct rockchip_thermal_data *thermal = dev_get_drvdata(dev);
1622	int i;
1623
1624	for (i = 0; i < thermal->chip->chn_num; i++)
1625		rockchip_thermal_toggle_sensor(&thermal->sensors[i], false);
1626
1627	thermal->chip->control(thermal->regs, false);
1628
1629	clk_disable(thermal->pclk);
1630	clk_disable(thermal->clk);
1631
1632	pinctrl_pm_select_sleep_state(dev);
1633
1634	return 0;
1635}
1636
1637static int __maybe_unused rockchip_thermal_resume(struct device *dev)
1638{
1639	struct rockchip_thermal_data *thermal = dev_get_drvdata(dev);
1640	int i;
1641	int error;
1642
1643	error = clk_enable(thermal->clk);
1644	if (error)
1645		return error;
1646
1647	error = clk_enable(thermal->pclk);
1648	if (error) {
1649		clk_disable(thermal->clk);
1650		return error;
1651	}
1652
1653	rockchip_thermal_reset_controller(thermal->reset);
1654
1655	thermal->chip->initialize(thermal->grf, thermal->regs,
1656				  thermal->tshut_polarity);
1657
1658	for (i = 0; i < thermal->chip->chn_num; i++) {
1659		int id = thermal->sensors[i].id;
1660
1661		thermal->chip->set_tshut_mode(id, thermal->regs,
1662					      thermal->tshut_mode);
1663
1664		error = thermal->chip->set_tshut_temp(&thermal->chip->table,
1665					      id, thermal->regs,
1666					      thermal->tshut_temp);
1667		if (error)
1668			dev_err(dev, "%s: invalid tshut=%d, error=%d\n",
1669				__func__, thermal->tshut_temp, error);
1670	}
1671
1672	thermal->chip->control(thermal->regs, true);
1673
1674	for (i = 0; i < thermal->chip->chn_num; i++)
1675		rockchip_thermal_toggle_sensor(&thermal->sensors[i], true);
1676
1677	pinctrl_pm_select_default_state(dev);
1678
1679	return 0;
1680}
1681
1682static SIMPLE_DEV_PM_OPS(rockchip_thermal_pm_ops,
1683			 rockchip_thermal_suspend, rockchip_thermal_resume);
1684
1685static struct platform_driver rockchip_thermal_driver = {
1686	.driver = {
1687		.name = "rockchip-thermal",
1688		.pm = &rockchip_thermal_pm_ops,
1689		.of_match_table = of_rockchip_thermal_match,
1690	},
1691	.probe = rockchip_thermal_probe,
1692	.remove_new = rockchip_thermal_remove,
1693};
1694
1695module_platform_driver(rockchip_thermal_driver);
1696
1697MODULE_DESCRIPTION("ROCKCHIP THERMAL Driver");
1698MODULE_AUTHOR("Rockchip, Inc.");
1699MODULE_LICENSE("GPL v2");
1700MODULE_ALIAS("platform:rockchip-thermal");
1701