hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/thermal/rockchip_thermal.c
....@@ -1,15 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2014-2016, Fuzhou Rockchip Electronics Co., Ltd
34 * Caesar Wang <wxt@rock-chips.com>
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms and conditions of the GNU General Public License,
7
- * version 2, as published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
- * more details.
135 */
146
157 #include <linux/clk.h>
....@@ -29,7 +21,7 @@
2921 #include <linux/pinctrl/consumer.h>
3022 #include <linux/nvmem-consumer.h>
3123
32
-/**
24
+/*
3325 * If the temperature over a period of time High,
3426 * the resulting TSHUT gave CRU module,let it reset the entire chip,
3527 * or via GPIO give PMIC.
....@@ -39,7 +31,7 @@
3931 TSHUT_MODE_OTP,
4032 };
4133
42
-/**
34
+/*
4335 * The system Temperature Sensors tshut(tshut) polarity
4436 * the bit 8 is tshut polarity.
4537 * 0: low active, 1: high active
....@@ -49,7 +41,7 @@
4941 TSHUT_HIGH_ACTIVE,
5042 };
5143
52
-/**
44
+/*
5345 * The system has two Temperature Sensors.
5446 * sensor0 is for CPU, and sensor1 is for GPU.
5547 */
....@@ -58,7 +50,7 @@
5850 SENSOR_GPU,
5951 };
6052
61
-/**
53
+/*
6254 * The conversion table has the adc value and temperature.
6355 * ADC_DECREMENT: the adc value is of diminishing.(e.g. rk3288_code_table)
6456 * ADC_INCREMENT: the adc value is incremental.(e.g. rk3368_code_table)
....@@ -67,6 +59,8 @@
6759 ADC_DECREMENT = 0,
6860 ADC_INCREMENT,
6961 };
62
+
63
+#include "thermal_hwmon.h"
7064
7165 /**
7266 * The max sensors is seven in rockchip SoCs.
....@@ -78,6 +72,8 @@
7872 * @id: conversion table
7973 * @length: size of conversion table
8074 * @data_mask: mask to apply on data inputs
75
+ * @kNum: linear parameter k
76
+ * @bNum: linear parameter b
8177 * @mode: sort mode of this adc variant (incrementing or decrementing)
8278 */
8379 struct chip_tsadc_table {
....@@ -92,7 +88,7 @@
9288
9389 /**
9490 * struct rockchip_tsadc_chip - hold the private data of tsadc chip
95
- * @chn_id[SOC_MAX_SENSORS]: the sensor id of chip correspond to the channel
91
+ * @chn_id: array of sensor ids of chip corresponding to the channel
9692 * @chn_num: the channel number of tsadc chip
9793 * @conversion_time: the conversion time of tsadc
9894 * @trim_slope: use to conversion trim code to trim temp
....@@ -101,6 +97,7 @@
10197 * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
10298 * @initialize: SoC special initialize tsadc controller method
10399 * @irq_ack: clear the interrupt
100
+ * @control: enable/disable method for the tsadc controller
104101 * @get_temp: get the temperature
105102 * @set_alarm_temp: set the high temperature interrupt
106103 * @set_tshut_temp: set the hardware-controlled shutdown temperature
....@@ -169,13 +166,17 @@
169166 * @chip: pointer to the platform/configuration data
170167 * @pdev: platform device of thermal
171168 * @reset: the reset controller of tsadc
172
- * @sensors[SOC_MAX_SENSORS]: the thermal sensor
173
- * @clk: the controller clock is divided by the exteral 24MHz
174
- * @pclk: the advanced peripherals bus clock
169
+ * @sensors: array of thermal sensors
170
+ * @clk: the bulk clk of tsadc, include controller clock and peripherals bus clock
171
+ * @num_clks: the number of tsadc clks
175172 * @grf: the general register file will be used to do static set by software
176173 * @regs: the base address of tsadc controller
177174 * @tshut_mode: the hardware-controlled shutdown mode (0:CRU 1:GPIO)
178175 * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
176
+ * @pinctrl: the pinctrl of tsadc
177
+ * @gpio_state: pinctrl select gpio function
178
+ * @otp_state: pinctrl select otp out function
179
+ * @panic_nb: panic notifier block
179180 */
180181 struct rockchip_thermal_data {
181182 const struct rockchip_tsadc_chip *chip;
....@@ -230,7 +231,8 @@
230231 #define TSADCV2_AUTO_PERIOD_HT 0x6c
231232 #define TSADCV3_AUTO_PERIOD 0x154
232233 #define TSADCV3_AUTO_PERIOD_HT 0x158
233
-#define TSADCV3_Q_MAX 0x210
234
+#define TSADCV9_Q_MAX 0x210
235
+#define TSADCV9_FLOW_CON 0x218
234236
235237 #define TSADCV2_AUTO_EN BIT(0)
236238 #define TSADCV2_AUTO_EN_MASK BIT(16)
....@@ -269,10 +271,17 @@
269271 #define TSADCV6_AUTO_PERIOD_HT_TIME 5000 /* 2.5ms */
270272 #define TSADCV7_AUTO_PERIOD_TIME 3000 /* 2.5ms */
271273 #define TSADCV7_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */
274
+#define TSADCV12_AUTO_PERIOD_TIME 3000 /* 2.5ms */
275
+#define TSADCV12_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */
272276 #define TSADCV3_Q_MAX_VAL 0x7ff /* 11bit 2047 */
277
+#define TSADCV12_Q_MAX_VAL 0xfff /* 12bit 4095 */
273278
274279 #define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */
275280 #define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */
281
+
282
+#define TSADCV9_AUTO_SRC (0x10001 << 0)
283
+#define TSADCV9_PD_MODE (0x10001 << 4)
284
+#define TSADCV9_Q_MAX_VAL (0xffff0400 << 0)
276285
277286 #define GRF_SARADC_TESTBIT 0x0e644
278287 #define GRF_TSADC_TESTBIT_L 0x0e648
....@@ -283,12 +292,19 @@
283292
284293 #define RK1808_BUS_GRF_SOC_CON0 0x0400
285294
286
-#define RK3568_GRF_TSADC_CON 0x0600
287295 #define RK3528_GRF_TSADC_CON 0x40030
296
+
297
+#define RK3562_GRF_TSADC_CON 0x0580
298
+
299
+#define RK3568_GRF_TSADC_CON 0x0600
288300 #define RK3568_GRF_TSADC_ANA_REG0 (0x10001 << 0)
289301 #define RK3568_GRF_TSADC_ANA_REG1 (0x10001 << 1)
290302 #define RK3568_GRF_TSADC_ANA_REG2 (0x10001 << 2)
291303 #define RK3568_GRF_TSADC_TSEN (0x10001 << 8)
304
+
305
+#define RV1106_VOGRF_TSADC_CON 0x6000C
306
+#define RV1106_VOGRF_TSADC_TSEN (0x10001 << 8)
307
+#define RV1106_VOGRF_TSADC_ANA (0xff0007 << 0)
292308
293309 #define RV1126_GRF0_TSADC_CON 0x0100
294310
....@@ -309,15 +325,7 @@
309325
310326 /* -40 to 125 is reliable, outside the range existed unreliability */
311327 #define MIN_TEMP (-60000)
312
-#define LOWEST_TEMP (-273000)
313328 #define MAX_TEMP (180000)
314
-#define MAX_ENV_TEMP (85000)
315
-
316
-#define BASE (1024)
317
-#define BASE_SHIFT (10)
318
-#define START_DEBOUNCE_COUNT (100)
319
-#define HIGHER_DEBOUNCE_TEMP (30000)
320
-#define LOWER_DEBOUNCE_TEMP (15000)
321329
322330 /**
323331 * struct tsadc_table - code to temperature conversion table
....@@ -332,6 +340,17 @@
332340 struct tsadc_table {
333341 u32 code;
334342 int temp;
343
+};
344
+
345
+static const struct tsadc_table rv1106_code_table[] = {
346
+ {0, MIN_TEMP},
347
+ {363, MIN_TEMP},
348
+ {396, -40000},
349
+ {504, 25000},
350
+ {605, 85000},
351
+ {673, 125000},
352
+ {758, MAX_TEMP},
353
+ {TSADCV2_DATA_MASK, MAX_TEMP},
335354 };
336355
337356 static const struct tsadc_table rv1108_table[] = {
....@@ -665,6 +684,47 @@
665684 {TSADCV5_DATA_MASK, MAX_TEMP},
666685 };
667686
687
+static const struct tsadc_table rk3562_code_table[] = {
688
+ {0, MIN_TEMP},
689
+ {1385, MIN_TEMP},
690
+ {1419, -40000},
691
+ {1428, -35000},
692
+ {1436, -30000},
693
+ {1445, -25000},
694
+ {1453, -20000},
695
+ {1462, -15000},
696
+ {1470, -10000},
697
+ {1479, -5000},
698
+ {1487, 0},
699
+ {1496, 5000},
700
+ {1504, 10000},
701
+ {1512, 15000},
702
+ {1521, 20000},
703
+ {1529, 25000},
704
+ {1538, 30000},
705
+ {1546, 35000},
706
+ {1555, 40000},
707
+ {1563, 45000},
708
+ {1572, 50000},
709
+ {1580, 55000},
710
+ {1589, 60000},
711
+ {1598, 65000},
712
+ {1606, 70000},
713
+ {1615, 75000},
714
+ {1623, 80000},
715
+ {1632, 85000},
716
+ {1640, 90000},
717
+ {1648, 95000},
718
+ {1657, 100000},
719
+ {1666, 105000},
720
+ {1674, 110000},
721
+ {1682, 115000},
722
+ {1691, 120000},
723
+ {1699, 125000},
724
+ {1793, MAX_TEMP},
725
+ {TSADCV2_DATA_MASK, MAX_TEMP},
726
+};
727
+
668728 static const struct tsadc_table rk3568_code_table[] = {
669729 {0, MIN_TEMP},
670730 {1448, MIN_TEMP},
....@@ -846,6 +906,9 @@
846906
847907 /**
848908 * rk_tsadcv2_initialize - initialize TASDC Controller.
909
+ * @grf: the general register file will be used to do static set by software
910
+ * @regs: the base address of tsadc controller
911
+ * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
849912 *
850913 * (1) Set TSADC_V2_AUTO_PERIOD:
851914 * Configure the interleave between every two accessing of
....@@ -880,6 +943,9 @@
880943
881944 /**
882945 * rk_tsadcv3_initialize - initialize TASDC Controller.
946
+ * @grf: the general register file will be used to do static set by software
947
+ * @regs: the base address of tsadc controller
948
+ * @tshut_polarity: the hardware-controlled active polarity (0:LOW 1:HIGH)
883949 *
884950 * (1) The tsadc control power sequence.
885951 *
....@@ -945,8 +1011,7 @@
9451011 enum tshut_polarity tshut_polarity)
9461012 {
9471013 rk_tsadcv2_initialize(grf, regs, tshut_polarity);
948
- if (!IS_ERR(grf))
949
- regmap_write(grf, PX30_GRF_SOC_CON2, GRF_CON_TSADC_CH_INV);
1014
+ regmap_write(grf, PX30_GRF_SOC_CON2, GRF_CON_TSADC_CH_INV);
9501015 }
9511016
9521017 static void rk_tsadcv5_initialize(struct regmap *grf, void __iomem *regs,
....@@ -1003,12 +1068,26 @@
10031068 writel_relaxed(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
10041069 regs + TSADCV2_AUTO_CON);
10051070
1071
+ /*
1072
+ * The general register file will is optional
1073
+ * and might not be available.
1074
+ */
10061075 if (!IS_ERR(grf)) {
10071076 regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN);
1077
+ /*
1078
+ * RK3568 TRM, section 18.5. requires a delay no less
1079
+ * than 10us between the rising edge of tsadc_tsen_en
1080
+ * and the rising edge of tsadc_ana_reg_0/1/2.
1081
+ */
10081082 udelay(15);
10091083 regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0);
10101084 regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1);
10111085 regmap_write(grf, RK3568_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2);
1086
+
1087
+ /*
1088
+ * RK3568 TRM, section 18.5. requires a delay no less
1089
+ * than 90us after the rising edge of tsadc_ana_reg_0/1/2.
1090
+ */
10121091 usleep_range(100, 200);
10131092 }
10141093 }
....@@ -1035,6 +1114,35 @@
10351114 static void rk_tsadcv9_initialize(struct regmap *grf, void __iomem *regs,
10361115 enum tshut_polarity tshut_polarity)
10371116 {
1117
+ regmap_write(grf, RV1106_VOGRF_TSADC_CON, RV1106_VOGRF_TSADC_TSEN);
1118
+ udelay(10);
1119
+ regmap_write(grf, RV1106_VOGRF_TSADC_CON, RV1106_VOGRF_TSADC_ANA);
1120
+ udelay(100);
1121
+
1122
+ writel_relaxed(TSADCV2_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD);
1123
+ writel_relaxed(TSADCV2_AUTO_PERIOD_TIME,
1124
+ regs + TSADCV3_AUTO_PERIOD_HT);
1125
+ writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
1126
+ regs + TSADCV3_HIGHT_INT_DEBOUNCE);
1127
+ writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
1128
+ regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
1129
+ writel_relaxed(TSADCV9_AUTO_SRC, regs + TSADCV2_INT_PD);
1130
+ writel_relaxed(TSADCV9_PD_MODE, regs + TSADCV9_FLOW_CON);
1131
+ writel_relaxed(TSADCV9_Q_MAX_VAL, regs + TSADCV9_Q_MAX);
1132
+ if (tshut_polarity == TSHUT_HIGH_ACTIVE)
1133
+ writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
1134
+ TSADCV2_AUTO_TSHUT_POLARITY_MASK,
1135
+ regs + TSADCV2_AUTO_CON);
1136
+ else
1137
+ writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
1138
+ regs + TSADCV2_AUTO_CON);
1139
+ writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | (TSADCV3_AUTO_Q_SEL_EN << 16),
1140
+ regs + TSADCV2_AUTO_CON);
1141
+}
1142
+
1143
+static void rk_tsadcv10_initialize(struct regmap *grf, void __iomem *regs,
1144
+ enum tshut_polarity tshut_polarity)
1145
+{
10381146 rk_tsadcv2_initialize(grf, regs, tshut_polarity);
10391147 if (!IS_ERR(grf)) {
10401148 regmap_write(grf, PX30_GRF_SOC_CON0, PX30S_TSADC_TDC_MODE);
....@@ -1052,7 +1160,7 @@
10521160 regs + TSADCV3_HIGHT_INT_DEBOUNCE);
10531161 writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
10541162 regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
1055
- writel_relaxed(TSADCV3_Q_MAX_VAL, regs + TSADCV3_Q_MAX);
1163
+ writel_relaxed(TSADCV3_Q_MAX_VAL, regs + TSADCV9_Q_MAX);
10561164 writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
10571165 regs + TSADCV2_AUTO_CON);
10581166 if (tshut_polarity == TSHUT_HIGH_ACTIVE)
....@@ -1069,6 +1177,37 @@
10691177 regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0);
10701178 regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1);
10711179 regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2);
1180
+ usleep_range(100, 200);
1181
+ }
1182
+}
1183
+
1184
+static void rk_tsadcv12_initialize(struct regmap *grf, void __iomem *regs,
1185
+ enum tshut_polarity tshut_polarity)
1186
+{
1187
+ writel_relaxed(TSADCV12_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD);
1188
+ writel_relaxed(TSADCV12_AUTO_PERIOD_HT_TIME,
1189
+ regs + TSADCV3_AUTO_PERIOD_HT);
1190
+ writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
1191
+ regs + TSADCV3_HIGHT_INT_DEBOUNCE);
1192
+ writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
1193
+ regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
1194
+ writel_relaxed(TSADCV12_Q_MAX_VAL, regs + TSADCV9_Q_MAX);
1195
+ writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
1196
+ regs + TSADCV2_AUTO_CON);
1197
+ if (tshut_polarity == TSHUT_HIGH_ACTIVE)
1198
+ writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
1199
+ TSADCV2_AUTO_TSHUT_POLARITY_MASK,
1200
+ regs + TSADCV2_AUTO_CON);
1201
+ else
1202
+ writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
1203
+ regs + TSADCV2_AUTO_CON);
1204
+
1205
+ if (!IS_ERR(grf)) {
1206
+ regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN);
1207
+ udelay(15);
1208
+ regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0);
1209
+ regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1);
1210
+ regmap_write(grf, RK3562_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2);
10721211 usleep_range(100, 200);
10731212 }
10741213 }
....@@ -1115,6 +1254,8 @@
11151254
11161255 /**
11171256 * rk_tsadcv3_control - the tsadc controller is enabled or disabled.
1257
+ * @regs: the base address of tsadc controller
1258
+ * @enable: boolean flag to enable the controller
11181259 *
11191260 * NOTE: TSADC controller works at auto mode, and some SoCs need set the
11201261 * tsadc_q_sel bit on TSADCV2_AUTO_CON[1]. The (1024 - tsadc_q) as output
....@@ -1153,91 +1294,6 @@
11531294 val = readl_relaxed(regs + TSADCV2_DATA(chn));
11541295
11551296 return rk_tsadcv2_code_to_temp(table, val, temp);
1156
-}
1157
-
1158
-static int predict_temp(int temp)
1159
-{
1160
- /*
1161
- * The deviation of prediction. the temperature will not change rapidly,
1162
- * so this cov_q is small
1163
- */
1164
- int cov_q = 18;
1165
- /*
1166
- * The deviation of tsadc's reading, deviation of tsadc is very big when
1167
- * abnormal temperature is get
1168
- */
1169
- int cov_r = 542;
1170
-
1171
- int gain;
1172
- int temp_mid;
1173
- int temp_now;
1174
- int prob_mid;
1175
- int prob_now;
1176
- static int temp_last = LOWEST_TEMP;
1177
- static int prob_last = 160;
1178
- static int bounding_cnt;
1179
-
1180
- /*
1181
- * init temp_last with a more suitable value, which mostly equals to
1182
- * temp reading from tsadc, but not higher than MAX_ENV_TEMP. If the
1183
- * temp is higher than MAX_ENV_TEMP, it is assumed to be abnormal
1184
- * value and temp_last is adjusted to MAX_ENV_TEMP.
1185
- */
1186
- if (temp_last == LOWEST_TEMP)
1187
- temp_last = min(temp, MAX_ENV_TEMP);
1188
-
1189
- /*
1190
- * Before START_DEBOUNCE_COUNT's samples of temperature, we consider
1191
- * tsadc is stable, i.e. after that, the temperature may be not stable
1192
- * and may have abnormal reading, so we set a bounding temperature. If
1193
- * the reading from tsadc is too big, we set the delta temperature of
1194
- * DEBOUNCE_TEMP/3 comparing to the last temperature.
1195
- */
1196
-
1197
- if (bounding_cnt++ > START_DEBOUNCE_COUNT) {
1198
- bounding_cnt = START_DEBOUNCE_COUNT;
1199
- if (temp - temp_last > HIGHER_DEBOUNCE_TEMP)
1200
- temp = temp_last + HIGHER_DEBOUNCE_TEMP / 3;
1201
- if (temp_last - temp > LOWER_DEBOUNCE_TEMP)
1202
- temp = temp_last - LOWER_DEBOUNCE_TEMP / 3;
1203
- }
1204
-
1205
- temp_mid = temp_last;
1206
-
1207
- /* calculate the probability of this time's prediction */
1208
- prob_mid = prob_last + cov_q;
1209
-
1210
- /* calculate the Kalman Gain */
1211
- gain = (prob_mid * BASE) / (prob_mid + cov_r);
1212
-
1213
- /* calculate the prediction of temperature */
1214
- temp_now = (temp_mid * BASE + gain * (temp - temp_mid)) >> BASE_SHIFT;
1215
-
1216
- /*
1217
- * Base on this time's Kalman Gain, ajust our probability of prediction
1218
- * for next time calculation
1219
- */
1220
- prob_now = ((BASE - gain) * prob_mid) >> BASE_SHIFT;
1221
-
1222
- prob_last = prob_now;
1223
- temp_last = temp_now;
1224
-
1225
- return temp_last;
1226
-}
1227
-
1228
-static int rk_tsadcv3_get_temp(const struct chip_tsadc_table *table,
1229
- int chn, void __iomem *regs, int *temp)
1230
-{
1231
- u32 val;
1232
- int ret;
1233
-
1234
- val = readl_relaxed(regs + TSADCV2_DATA(chn));
1235
-
1236
- ret = rk_tsadcv2_code_to_temp(table, val, temp);
1237
- if (!ret)
1238
- *temp = predict_temp(*temp);
1239
-
1240
- return ret;
12411297 }
12421298
12431299 static int rk_tsadcv4_get_temp(const struct chip_tsadc_table *table,
....@@ -1449,6 +1505,75 @@
14491505 return 0;
14501506 }
14511507
1508
+static const struct rockchip_tsadc_chip px30_tsadc_data = {
1509
+ .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1510
+ .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1511
+ .chn_num = 2, /* 2 channels for tsadc */
1512
+
1513
+ .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1514
+ .tshut_temp = 95000,
1515
+
1516
+ .initialize = rk_tsadcv4_initialize,
1517
+ .irq_ack = rk_tsadcv3_irq_ack,
1518
+ .control = rk_tsadcv3_control,
1519
+ .get_temp = rk_tsadcv2_get_temp,
1520
+ .set_alarm_temp = rk_tsadcv2_alarm_temp,
1521
+ .set_tshut_temp = rk_tsadcv2_tshut_temp,
1522
+ .set_tshut_mode = rk_tsadcv2_tshut_mode,
1523
+
1524
+ .table = {
1525
+ .id = rk3328_code_table,
1526
+ .length = ARRAY_SIZE(rk3328_code_table),
1527
+ .data_mask = TSADCV2_DATA_MASK,
1528
+ .mode = ADC_INCREMENT,
1529
+ },
1530
+};
1531
+
1532
+static const struct rockchip_tsadc_chip px30s_tsadc_data = {
1533
+ .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1534
+ .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1535
+ .chn_num = 2, /* 1 channels for tsadc */
1536
+ .conversion_time = 2100, /* us */
1537
+ .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1538
+ .tshut_temp = 95000,
1539
+ .initialize = rk_tsadcv10_initialize,
1540
+ .irq_ack = rk_tsadcv3_irq_ack,
1541
+ .control = rk_tsadcv2_control,
1542
+ .get_temp = rk_tsadcv2_get_temp,
1543
+ .set_alarm_temp = rk_tsadcv2_alarm_temp,
1544
+ .set_tshut_temp = rk_tsadcv2_tshut_temp,
1545
+ .set_tshut_mode = rk_tsadcv2_tshut_mode,
1546
+ .set_clk_rate = rk_tsadcv1_set_clk_rate,
1547
+ .table = {
1548
+ .kNum = 2699,
1549
+ .bNum = 2796,
1550
+ .data_mask = TSADCV2_DATA_MASK,
1551
+ .mode = ADC_INCREMENT,
1552
+ },
1553
+};
1554
+
1555
+static const struct rockchip_tsadc_chip rv1106_tsadc_data = {
1556
+ /* top, big_core0, big_core1, little_core, center, gpu, npu */
1557
+ .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1558
+ .chn_num = 1, /* seven channels for tsadc */
1559
+ .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1560
+ .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1561
+ .tshut_temp = 95000,
1562
+ .initialize = rk_tsadcv9_initialize,
1563
+ .irq_ack = rk_tsadcv4_irq_ack,
1564
+ .control = rk_tsadcv4_control,
1565
+ .get_temp = rk_tsadcv4_get_temp,
1566
+ .set_alarm_temp = rk_tsadcv3_alarm_temp,
1567
+ .set_tshut_temp = rk_tsadcv3_tshut_temp,
1568
+ .set_tshut_mode = rk_tsadcv4_tshut_mode,
1569
+ .table = {
1570
+ .id = rv1106_code_table,
1571
+ .length = ARRAY_SIZE(rv1106_code_table),
1572
+ .data_mask = TSADCV2_DATA_MASK,
1573
+ .mode = ADC_INCREMENT,
1574
+ },
1575
+};
1576
+
14521577 static const struct rockchip_tsadc_chip rv1108_tsadc_data = {
14531578 .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
14541579 .chn_num = 1, /* one channel for tsadc */
....@@ -1559,7 +1684,7 @@
15591684 .initialize = rk_tsadcv2_initialize,
15601685 .irq_ack = rk_tsadcv2_irq_ack,
15611686 .control = rk_tsadcv2_control,
1562
- .get_temp = rk_tsadcv3_get_temp,
1687
+ .get_temp = rk_tsadcv2_get_temp,
15631688 .set_alarm_temp = rk_tsadcv2_alarm_temp,
15641689 .set_tshut_temp = rk_tsadcv2_tshut_temp,
15651690 .set_tshut_mode = rk_tsadcv2_tshut_mode,
....@@ -1580,7 +1705,7 @@
15801705 .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
15811706 .tshut_temp = 95000,
15821707
1583
- .initialize = rk_tsadcv4_initialize,
1708
+ .initialize = rk_tsadcv2_initialize,
15841709 .irq_ack = rk_tsadcv3_irq_ack,
15851710 .control = rk_tsadcv3_control,
15861711 .get_temp = rk_tsadcv2_get_temp,
....@@ -1596,38 +1721,16 @@
15961721 },
15971722 };
15981723
1599
-static const struct rockchip_tsadc_chip px30_tsadc_data = {
1724
+static const struct rockchip_tsadc_chip rk3308bs_tsadc_data = {
16001725 .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1601
- .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1602
- .chn_num = 2, /* 2 channels for tsadc */
1726
+ .chn_num = 1, /* 1 channels for tsadc */
16031727
1604
- .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
1605
- .tshut_temp = 95000,
1606
-
1607
- .initialize = rk_tsadcv4_initialize,
1608
- .irq_ack = rk_tsadcv3_irq_ack,
1609
- .control = rk_tsadcv3_control,
1610
- .get_temp = rk_tsadcv2_get_temp,
1611
- .set_alarm_temp = rk_tsadcv2_alarm_temp,
1612
- .set_tshut_temp = rk_tsadcv2_tshut_temp,
1613
- .set_tshut_mode = rk_tsadcv2_tshut_mode,
1614
-
1615
- .table = {
1616
- .id = rk3328_code_table,
1617
- .length = ARRAY_SIZE(rk3328_code_table),
1618
- .data_mask = TSADCV2_DATA_MASK,
1619
- .mode = ADC_INCREMENT,
1620
- },
1621
-};
1622
-
1623
-static const struct rockchip_tsadc_chip px30s_tsadc_data = {
1624
- .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1625
- .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
1626
- .chn_num = 2, /* 1 channels for tsadc */
16271728 .conversion_time = 2100, /* us */
1729
+
16281730 .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
16291731 .tshut_temp = 95000,
1630
- .initialize = rk_tsadcv9_initialize,
1732
+
1733
+ .initialize = rk_tsadcv2_initialize,
16311734 .irq_ack = rk_tsadcv3_irq_ack,
16321735 .control = rk_tsadcv2_control,
16331736 .get_temp = rk_tsadcv2_get_temp,
....@@ -1635,6 +1738,7 @@
16351738 .set_tshut_temp = rk_tsadcv2_tshut_temp,
16361739 .set_tshut_mode = rk_tsadcv2_tshut_mode,
16371740 .set_clk_rate = rk_tsadcv1_set_clk_rate,
1741
+
16381742 .table = {
16391743 .kNum = 2699,
16401744 .bNum = 2796,
....@@ -1765,6 +1869,30 @@
17651869 },
17661870 };
17671871
1872
+static const struct rockchip_tsadc_chip rk3562_tsadc_data = {
1873
+ .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
1874
+ .chn_num = 1, /* one channels for tsadc */
1875
+
1876
+ .tshut_mode = TSHUT_MODE_OTP, /* default TSHUT via GPIO give PMIC */
1877
+ .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
1878
+ .tshut_temp = 95000,
1879
+
1880
+ .initialize = rk_tsadcv12_initialize,
1881
+ .irq_ack = rk_tsadcv4_irq_ack,
1882
+ .control = rk_tsadcv4_control,
1883
+ .get_temp = rk_tsadcv4_get_temp,
1884
+ .set_alarm_temp = rk_tsadcv3_alarm_temp,
1885
+ .set_tshut_temp = rk_tsadcv3_tshut_temp,
1886
+ .set_tshut_mode = rk_tsadcv4_tshut_mode,
1887
+
1888
+ .table = {
1889
+ .id = rk3562_code_table,
1890
+ .length = ARRAY_SIZE(rk3562_code_table),
1891
+ .data_mask = TSADCV2_DATA_MASK,
1892
+ .mode = ADC_INCREMENT,
1893
+ },
1894
+};
1895
+
17681896 static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
17691897 .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
17701898 .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
....@@ -1815,7 +1943,21 @@
18151943 };
18161944
18171945 static const struct of_device_id of_rockchip_thermal_match[] = {
1818
-#ifdef CONFIG_CPU_RV110X
1946
+#ifdef CONFIG_CPU_PX30
1947
+ { .compatible = "rockchip,px30-tsadc",
1948
+ .data = (void *)&px30_tsadc_data,
1949
+ },
1950
+ { .compatible = "rockchip,px30s-tsadc",
1951
+ .data = (void *)&px30s_tsadc_data,
1952
+ },
1953
+#endif
1954
+#ifdef CONFIG_CPU_RV1106
1955
+ {
1956
+ .compatible = "rockchip,rv1106-tsadc",
1957
+ .data = (void *)&rv1106_tsadc_data,
1958
+ },
1959
+#endif
1960
+#ifdef CONFIG_CPU_RV1108
18191961 {
18201962 .compatible = "rockchip,rv1108-tsadc",
18211963 .data = (void *)&rv1108_tsadc_data,
....@@ -1825,14 +1967,6 @@
18251967 {
18261968 .compatible = "rockchip,rv1126-tsadc",
18271969 .data = (void *)&rv1126_tsadc_data,
1828
- },
1829
-#endif
1830
-#ifdef CONFIG_CPU_PX30
1831
- { .compatible = "rockchip,px30-tsadc",
1832
- .data = (void *)&px30_tsadc_data,
1833
- },
1834
- { .compatible = "rockchip,px30s-tsadc",
1835
- .data = (void *)&px30s_tsadc_data,
18361970 },
18371971 #endif
18381972 #ifdef CONFIG_CPU_RK1808
....@@ -1857,6 +1991,10 @@
18571991 {
18581992 .compatible = "rockchip,rk3308-tsadc",
18591993 .data = (void *)&rk3308_tsadc_data,
1994
+ },
1995
+ {
1996
+ .compatible = "rockchip,rk3308bs-tsadc",
1997
+ .data = (void *)&rk3308bs_tsadc_data,
18601998 },
18611999 #endif
18622000 #ifdef CONFIG_CPU_RK3328
....@@ -1889,6 +2027,12 @@
18892027 .data = (void *)&rk3528_tsadc_data,
18902028 },
18912029 #endif
2030
+#ifdef CONFIG_CPU_RK3562
2031
+ {
2032
+ .compatible = "rockchip,rk3562-tsadc",
2033
+ .data = (void *)&rk3562_tsadc_data,
2034
+ },
2035
+#endif
18922036 #ifdef CONFIG_CPU_RK3568
18932037 {
18942038 .compatible = "rockchip,rk3568-tsadc",
....@@ -1910,8 +2054,10 @@
19102054 {
19112055 struct thermal_zone_device *tzd = sensor->tzd;
19122056
1913
- tzd->ops->set_mode(tzd,
1914
- on ? THERMAL_DEVICE_ENABLED : THERMAL_DEVICE_DISABLED);
2057
+ if (on)
2058
+ thermal_zone_device_enable(tzd);
2059
+ else
2060
+ thermal_zone_device_disable(tzd);
19152061 }
19162062
19172063 static irqreturn_t rockchip_thermal_alarm_irq_thread(int irq, void *dev)
....@@ -2182,6 +2328,7 @@
21822328
21832329 /**
21842330 * Reset TSADC Controller, reset all tsadc registers.
2331
+ * @reset: the reset controller of tsadc
21852332 */
21862333 static void rockchip_thermal_reset_controller(struct reset_control *reset)
21872334 {
....@@ -2242,10 +2389,8 @@
22422389 return -ENXIO;
22432390
22442391 irq = platform_get_irq(pdev, 0);
2245
- if (irq < 0) {
2246
- dev_err(&pdev->dev, "no irq resource?\n");
2392
+ if (irq < 0)
22472393 return -EINVAL;
2248
- }
22492394
22502395 thermal = devm_kzalloc(&pdev->dev, sizeof(struct rockchip_thermal_data),
22512396 GFP_KERNEL);
....@@ -2259,6 +2404,8 @@
22592404 return -EINVAL;
22602405 if (soc_is_px30s())
22612406 thermal->chip = &px30s_tsadc_data;
2407
+ if (soc_is_rk3308bs())
2408
+ thermal->chip = &rk3308bs_tsadc_data;
22622409
22632410 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
22642411 thermal->regs = devm_ioremap_resource(&pdev->dev, res);
....@@ -2346,8 +2493,15 @@
23462493 usleep_range(thermal->chip->conversion_time,
23472494 thermal->chip->conversion_time + 50);
23482495
2349
- for (i = 0; i < thermal->chip->chn_num; i++)
2496
+ for (i = 0; i < thermal->chip->chn_num; i++) {
23502497 rockchip_thermal_toggle_sensor(&thermal->sensors[i], true);
2498
+ thermal->sensors[i].tzd->tzp->no_hwmon = false;
2499
+ error = thermal_add_hwmon_sysfs(thermal->sensors[i].tzd);
2500
+ if (error)
2501
+ dev_warn(&pdev->dev,
2502
+ "failed to register sensor %d with hwmon: %d\n",
2503
+ i, error);
2504
+ }
23512505
23522506 thermal->panic_nb.notifier_call = rockchip_thermal_panic;
23532507 atomic_notifier_chain_register(&panic_notifier_list,
....@@ -2371,6 +2525,7 @@
23712525 for (i = 0; i < thermal->chip->chn_num; i++) {
23722526 struct rockchip_thermal_sensor *sensor = &thermal->sensors[i];
23732527
2528
+ thermal_remove_hwmon_sysfs(sensor->tzd);
23742529 rockchip_thermal_toggle_sensor(sensor, false);
23752530 }
23762531
....@@ -2400,8 +2555,7 @@
24002555
24012556 static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
24022557 {
2403
- struct platform_device *pdev = to_platform_device(dev);
2404
- struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev);
2558
+ struct rockchip_thermal_data *thermal = dev_get_drvdata(dev);
24052559 int i;
24062560
24072561 for (i = 0; i < thermal->chip->chn_num; i++)
....@@ -2419,14 +2573,13 @@
24192573
24202574 static int __maybe_unused rockchip_thermal_resume(struct device *dev)
24212575 {
2422
- struct platform_device *pdev = to_platform_device(dev);
2423
- struct rockchip_thermal_data *thermal = platform_get_drvdata(pdev);
2576
+ struct rockchip_thermal_data *thermal = dev_get_drvdata(dev);
24242577 int i;
24252578 int error;
24262579
24272580 error = clk_bulk_enable(thermal->num_clks, thermal->clks);
24282581 if (error) {
2429
- dev_err(&pdev->dev, "failed to enable tsadc bulk clks: %d\n",
2582
+ dev_err(dev, "failed to enable tsadc bulk clks: %d\n",
24302583 error);
24312584 return error;
24322585 }
....@@ -2447,7 +2600,7 @@
24472600 id, thermal->regs,
24482601 tshut_temp);
24492602 if (error)
2450
- dev_err(&pdev->dev, "%s: invalid tshut=%d, error=%d\n",
2603
+ dev_err(dev, "%s: invalid tshut=%d, error=%d\n",
24512604 __func__, tshut_temp, error);
24522605 }
24532606
....@@ -2479,7 +2632,17 @@
24792632 .shutdown = rockchip_thermal_shutdown,
24802633 };
24812634
2482
-module_platform_driver(rockchip_thermal_driver);
2635
+static int __init rockchip_thermal_driver_init(void)
2636
+{
2637
+ return platform_driver_register(&rockchip_thermal_driver);
2638
+}
2639
+rootfs_initcall(rockchip_thermal_driver_init);
2640
+
2641
+static void __exit rockchip_thermal_driver_exit(void)
2642
+{
2643
+ platform_driver_unregister(&rockchip_thermal_driver);
2644
+}
2645
+module_exit(rockchip_thermal_driver_exit);
24832646
24842647 MODULE_DESCRIPTION("ROCKCHIP THERMAL Driver");
24852648 MODULE_AUTHOR("Rockchip, Inc.");