cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rockchip_thermal.c (42365B)


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