2 * Copyright (c) 2015 MediaTek Inc.
3 * Author: Hanyi Wu <hanyi.wu@mediatek.com>
4 * Sascha Hauer <s.hauer@pengutronix.de>
5 * Dawei Chien <dawei.chien@mediatek.com>
6 * Louis Yu <louis.yu@mediatek.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/clk.h>
19 #include <linux/delay.h>
20 #include <linux/interrupt.h>
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/nvmem-consumer.h>
25 #include <linux/of_address.h>
26 #include <linux/of_device.h>
27 #include <linux/platform_device.h>
28 #include <linux/slab.h>
30 #include <linux/thermal.h>
31 #include <linux/reset.h>
32 #include <linux/types.h>
34 /* AUXADC Registers */
35 #define AUXADC_CON1_SET_V 0x008
36 #define AUXADC_CON1_CLR_V 0x00c
37 #define AUXADC_CON2_V 0x010
38 #define AUXADC_DATA(channel) (0x14 + (channel) * 4)
40 #define APMIXED_SYS_TS_CON1 0x604
42 /* Thermal Controller Registers */
43 #define TEMP_MONCTL0 0x000
44 #define TEMP_MONCTL1 0x004
45 #define TEMP_MONCTL2 0x008
46 #define TEMP_MONIDET0 0x014
47 #define TEMP_MONIDET1 0x018
48 #define TEMP_MSRCTL0 0x038
49 #define TEMP_AHBPOLL 0x040
50 #define TEMP_AHBTO 0x044
51 #define TEMP_ADCPNP0 0x048
52 #define TEMP_ADCPNP1 0x04c
53 #define TEMP_ADCPNP2 0x050
54 #define TEMP_ADCPNP3 0x0b4
56 #define TEMP_ADCMUX 0x054
57 #define TEMP_ADCEN 0x060
58 #define TEMP_PNPMUXADDR 0x064
59 #define TEMP_ADCMUXADDR 0x068
60 #define TEMP_ADCENADDR 0x074
61 #define TEMP_ADCVALIDADDR 0x078
62 #define TEMP_ADCVOLTADDR 0x07c
63 #define TEMP_RDCTRL 0x080
64 #define TEMP_ADCVALIDMASK 0x084
65 #define TEMP_ADCVOLTAGESHIFT 0x088
66 #define TEMP_ADCWRITECTRL 0x08c
67 #define TEMP_MSR0 0x090
68 #define TEMP_MSR1 0x094
69 #define TEMP_MSR2 0x098
70 #define TEMP_MSR3 0x0B8
72 #define TEMP_SPARE0 0x0f0
74 #define TEMP_ADCPNP0_1 0x148
75 #define TEMP_ADCPNP1_1 0x14c
76 #define TEMP_ADCPNP2_1 0x150
77 #define TEMP_MSR0_1 0x190
78 #define TEMP_MSR1_1 0x194
79 #define TEMP_MSR2_1 0x198
80 #define TEMP_ADCPNP3_1 0x1b4
81 #define TEMP_MSR3_1 0x1B8
83 #define PTPCORESEL 0x400
85 #define TEMP_MONCTL1_PERIOD_UNIT(x) ((x) & 0x3ff)
87 #define TEMP_MONCTL2_FILTER_INTERVAL(x) (((x) & 0x3ff) << 16)
88 #define TEMP_MONCTL2_SENSOR_INTERVAL(x) ((x) & 0x3ff)
90 #define TEMP_AHBPOLL_ADC_POLL_INTERVAL(x) (x)
92 #define TEMP_ADCWRITECTRL_ADC_PNP_WRITE BIT(0)
93 #define TEMP_ADCWRITECTRL_ADC_MUX_WRITE BIT(1)
95 #define TEMP_ADCVALIDMASK_VALID_HIGH BIT(5)
96 #define TEMP_ADCVALIDMASK_VALID_POS(bit) (bit)
98 /* MT8173 thermal sensors */
103 #define MT8173_TSABB 4
105 /* AUXADC channel 11 is used for the temperature sensors */
106 #define MT8173_TEMP_AUXADC_CHANNEL 11
108 /* The total number of temperature sensors in the MT8173 */
109 #define MT8173_NUM_SENSORS 5
111 /* The number of banks in the MT8173 */
112 #define MT8173_NUM_ZONES 4
114 /* The number of sensing points per bank */
115 #define MT8173_NUM_SENSORS_PER_ZONE 4
117 /* The number of controller in the MT8173 */
118 #define MT8173_NUM_CONTROLLER 1
120 /* The calibration coefficient of sensor */
121 #define MT8173_CALIBRATION 165
124 * Layout of the fuses providing the calibration data
125 * These macros could be used for MT8183, MT8173, MT2701, and MT2712.
126 * MT8183 has 6 sensors and needs 6 VTS calibration data.
127 * MT8173 has 5 sensors and needs 5 VTS calibration data.
128 * MT2701 has 3 sensors and needs 3 VTS calibration data.
129 * MT2712 has 4 sensors and needs 4 VTS calibration data.
131 #define CALIB_BUF0_VALID BIT(0)
132 #define CALIB_BUF1_ADC_GE(x) (((x) >> 22) & 0x3ff)
133 #define CALIB_BUF0_VTS_TS1(x) (((x) >> 17) & 0x1ff)
134 #define CALIB_BUF0_VTS_TS2(x) (((x) >> 8) & 0x1ff)
135 #define CALIB_BUF1_VTS_TS3(x) (((x) >> 0) & 0x1ff)
136 #define CALIB_BUF2_VTS_TS4(x) (((x) >> 23) & 0x1ff)
137 #define CALIB_BUF2_VTS_TS5(x) (((x) >> 5) & 0x1ff)
138 #define CALIB_BUF2_VTS_TSABB(x) (((x) >> 14) & 0x1ff)
139 #define CALIB_BUF0_DEGC_CALI(x) (((x) >> 1) & 0x3f)
140 #define CALIB_BUF0_O_SLOPE(x) (((x) >> 26) & 0x3f)
141 #define CALIB_BUF0_O_SLOPE_SIGN(x) (((x) >> 7) & 0x1)
142 #define CALIB_BUF1_ID(x) (((x) >> 9) & 0x1)
154 /* MT2701 thermal sensors */
157 #define MT2701_TSABB 2
159 /* AUXADC channel 11 is used for the temperature sensors */
160 #define MT2701_TEMP_AUXADC_CHANNEL 11
162 /* The total number of temperature sensors in the MT2701 */
163 #define MT2701_NUM_SENSORS 3
165 /* The number of sensing points per bank */
166 #define MT2701_NUM_SENSORS_PER_ZONE 3
168 /* The number of controller in the MT2701 */
169 #define MT2701_NUM_CONTROLLER 1
171 /* The calibration coefficient of sensor */
172 #define MT2701_CALIBRATION 165
174 /* MT2712 thermal sensors */
180 /* AUXADC channel 11 is used for the temperature sensors */
181 #define MT2712_TEMP_AUXADC_CHANNEL 11
183 /* The total number of temperature sensors in the MT2712 */
184 #define MT2712_NUM_SENSORS 4
186 /* The number of sensing points per bank */
187 #define MT2712_NUM_SENSORS_PER_ZONE 4
189 /* The number of controller in the MT2712 */
190 #define MT2712_NUM_CONTROLLER 1
192 /* The calibration coefficient of sensor */
193 #define MT2712_CALIBRATION 165
195 #define MT7622_TEMP_AUXADC_CHANNEL 11
196 #define MT7622_NUM_SENSORS 1
197 #define MT7622_NUM_ZONES 1
198 #define MT7622_NUM_SENSORS_PER_ZONE 1
200 #define MT7622_NUM_CONTROLLER 1
202 /* The calibration coefficient of sensor */
203 #define MT7622_CALIBRATION 165
205 /* MT8183 thermal sensors */
211 #define MT8183_TSABB 5
213 /* AUXADC channel is used for the temperature sensors */
214 #define MT8183_TEMP_AUXADC_CHANNEL 11
216 /* The total number of temperature sensors in the MT8183 */
217 #define MT8183_NUM_SENSORS 6
219 /* The number of sensing points per bank */
220 #define MT8183_NUM_SENSORS_PER_ZONE 6
222 /* The number of controller in the MT8183 */
223 #define MT8183_NUM_CONTROLLER 2
225 /* The calibration coefficient of sensor */
226 #define MT8183_CALIBRATION 153
230 struct thermal_bank_cfg
{
231 unsigned int num_sensors
;
235 struct mtk_thermal_bank
{
236 struct mtk_thermal
*mt
;
240 struct mtk_thermal_data
{
244 const int *vts_index
;
245 const int *sensor_mux_values
;
249 const int num_controller
;
250 const int *controller_offset
;
251 bool need_switch_bank
;
252 struct thermal_bank_cfg bank_data
[];
257 void __iomem
*thermal_base
;
259 struct clk
*clk_peri_therm
;
260 struct clk
*clk_auxadc
;
261 /* lock: for getting and putting banks */
264 /* Calibration values */
268 s32 vts
[MAX_NUM_VTS
];
270 const struct mtk_thermal_data
*conf
;
271 struct mtk_thermal_bank banks
[];
274 /* MT8183 thermal sensor data */
275 static const int mt8183_bank_data
[MT8183_NUM_SENSORS
] = {
276 MT8183_TS1
, MT8183_TS2
, MT8183_TS3
, MT8183_TS4
, MT8183_TS5
, MT8183_TSABB
279 static const int mt8183_msr
[MT8183_NUM_SENSORS_PER_ZONE
] = {
280 TEMP_MSR0_1
, TEMP_MSR1_1
, TEMP_MSR2_1
, TEMP_MSR1
, TEMP_MSR0
, TEMP_MSR3_1
283 static const int mt8183_adcpnp
[MT8183_NUM_SENSORS_PER_ZONE
] = {
284 TEMP_ADCPNP0_1
, TEMP_ADCPNP1_1
, TEMP_ADCPNP2_1
,
285 TEMP_ADCPNP1
, TEMP_ADCPNP0
, TEMP_ADCPNP3_1
288 static const int mt8183_mux_values
[MT8183_NUM_SENSORS
] = { 0, 1, 2, 3, 4, 0 };
289 static const int mt8183_tc_offset
[MT8183_NUM_CONTROLLER
] = {0x0, 0x100};
291 static const int mt8183_vts_index
[MT8183_NUM_SENSORS
] = {
292 VTS1
, VTS2
, VTS3
, VTS4
, VTS5
, VTSABB
295 /* MT8173 thermal sensor data */
296 static const int mt8173_bank_data
[MT8173_NUM_ZONES
][3] = {
297 { MT8173_TS2
, MT8173_TS3
},
298 { MT8173_TS2
, MT8173_TS4
},
299 { MT8173_TS1
, MT8173_TS2
, MT8173_TSABB
},
303 static const int mt8173_msr
[MT8173_NUM_SENSORS_PER_ZONE
] = {
304 TEMP_MSR0
, TEMP_MSR1
, TEMP_MSR2
, TEMP_MSR3
307 static const int mt8173_adcpnp
[MT8173_NUM_SENSORS_PER_ZONE
] = {
308 TEMP_ADCPNP0
, TEMP_ADCPNP1
, TEMP_ADCPNP2
, TEMP_ADCPNP3
311 static const int mt8173_mux_values
[MT8173_NUM_SENSORS
] = { 0, 1, 2, 3, 16 };
312 static const int mt8173_tc_offset
[MT8173_NUM_CONTROLLER
] = { 0x0, };
314 static const int mt8173_vts_index
[MT8173_NUM_SENSORS
] = {
315 VTS1
, VTS2
, VTS3
, VTS4
, VTSABB
318 /* MT2701 thermal sensor data */
319 static const int mt2701_bank_data
[MT2701_NUM_SENSORS
] = {
320 MT2701_TS1
, MT2701_TS2
, MT2701_TSABB
323 static const int mt2701_msr
[MT2701_NUM_SENSORS_PER_ZONE
] = {
324 TEMP_MSR0
, TEMP_MSR1
, TEMP_MSR2
327 static const int mt2701_adcpnp
[MT2701_NUM_SENSORS_PER_ZONE
] = {
328 TEMP_ADCPNP0
, TEMP_ADCPNP1
, TEMP_ADCPNP2
331 static const int mt2701_mux_values
[MT2701_NUM_SENSORS
] = { 0, 1, 16 };
332 static const int mt2701_tc_offset
[MT2701_NUM_CONTROLLER
] = { 0x0, };
334 static const int mt2701_vts_index
[MT2701_NUM_SENSORS
] = {
338 /* MT2712 thermal sensor data */
339 static const int mt2712_bank_data
[MT2712_NUM_SENSORS
] = {
340 MT2712_TS1
, MT2712_TS2
, MT2712_TS3
, MT2712_TS4
343 static const int mt2712_msr
[MT2712_NUM_SENSORS_PER_ZONE
] = {
344 TEMP_MSR0
, TEMP_MSR1
, TEMP_MSR2
, TEMP_MSR3
347 static const int mt2712_adcpnp
[MT2712_NUM_SENSORS_PER_ZONE
] = {
348 TEMP_ADCPNP0
, TEMP_ADCPNP1
, TEMP_ADCPNP2
, TEMP_ADCPNP3
351 static const int mt2712_mux_values
[MT2712_NUM_SENSORS
] = { 0, 1, 2, 3 };
352 static const int mt2712_tc_offset
[MT2712_NUM_CONTROLLER
] = { 0x0, };
354 static const int mt2712_vts_index
[MT2712_NUM_SENSORS
] = {
355 VTS1
, VTS2
, VTS3
, VTS4
358 /* MT7622 thermal sensor data */
359 static const int mt7622_bank_data
[MT7622_NUM_SENSORS
] = { MT7622_TS1
, };
360 static const int mt7622_msr
[MT7622_NUM_SENSORS_PER_ZONE
] = { TEMP_MSR0
, };
361 static const int mt7622_adcpnp
[MT7622_NUM_SENSORS_PER_ZONE
] = { TEMP_ADCPNP0
, };
362 static const int mt7622_mux_values
[MT7622_NUM_SENSORS
] = { 0, };
363 static const int mt7622_vts_index
[MT7622_NUM_SENSORS
] = { VTS1
};
364 static const int mt7622_tc_offset
[MT7622_NUM_CONTROLLER
] = { 0x0, };
367 * The MT8173 thermal controller has four banks. Each bank can read up to
368 * four temperature sensors simultaneously. The MT8173 has a total of 5
369 * temperature sensors. We use each bank to measure a certain area of the
370 * SoC. Since TS2 is located centrally in the SoC it is influenced by multiple
371 * areas, hence is used in different banks.
373 * The thermal core only gets the maximum temperature of all banks, so
374 * the bank concept wouldn't be necessary here. However, the SVS (Smart
375 * Voltage Scaling) unit makes its decisions based on the same bank
376 * data, and this indeed needs the temperatures of the individual banks
377 * for making better decisions.
379 static const struct mtk_thermal_data mt8173_thermal_data
= {
380 .auxadc_channel
= MT8173_TEMP_AUXADC_CHANNEL
,
381 .num_banks
= MT8173_NUM_ZONES
,
382 .num_sensors
= MT8173_NUM_SENSORS
,
383 .vts_index
= mt8173_vts_index
,
384 .cali_val
= MT8173_CALIBRATION
,
385 .num_controller
= MT8173_NUM_CONTROLLER
,
386 .controller_offset
= mt8173_tc_offset
,
387 .need_switch_bank
= true,
391 .sensors
= mt8173_bank_data
[0],
394 .sensors
= mt8173_bank_data
[1],
397 .sensors
= mt8173_bank_data
[2],
400 .sensors
= mt8173_bank_data
[3],
404 .adcpnp
= mt8173_adcpnp
,
405 .sensor_mux_values
= mt8173_mux_values
,
409 * The MT2701 thermal controller has one bank, which can read up to
410 * three temperature sensors simultaneously. The MT2701 has a total of 3
411 * temperature sensors.
413 * The thermal core only gets the maximum temperature of this one bank,
414 * so the bank concept wouldn't be necessary here. However, the SVS (Smart
415 * Voltage Scaling) unit makes its decisions based on the same bank
418 static const struct mtk_thermal_data mt2701_thermal_data
= {
419 .auxadc_channel
= MT2701_TEMP_AUXADC_CHANNEL
,
421 .num_sensors
= MT2701_NUM_SENSORS
,
422 .vts_index
= mt2701_vts_index
,
423 .cali_val
= MT2701_CALIBRATION
,
424 .num_controller
= MT2701_NUM_CONTROLLER
,
425 .controller_offset
= mt2701_tc_offset
,
426 .need_switch_bank
= true,
430 .sensors
= mt2701_bank_data
,
434 .adcpnp
= mt2701_adcpnp
,
435 .sensor_mux_values
= mt2701_mux_values
,
439 * The MT2712 thermal controller has one bank, which can read up to
440 * four temperature sensors simultaneously. The MT2712 has a total of 4
441 * temperature sensors.
443 * The thermal core only gets the maximum temperature of this one bank,
444 * so the bank concept wouldn't be necessary here. However, the SVS (Smart
445 * Voltage Scaling) unit makes its decisions based on the same bank
448 static const struct mtk_thermal_data mt2712_thermal_data
= {
449 .auxadc_channel
= MT2712_TEMP_AUXADC_CHANNEL
,
451 .num_sensors
= MT2712_NUM_SENSORS
,
452 .vts_index
= mt2712_vts_index
,
453 .cali_val
= MT2712_CALIBRATION
,
454 .num_controller
= MT2712_NUM_CONTROLLER
,
455 .controller_offset
= mt2712_tc_offset
,
456 .need_switch_bank
= true,
460 .sensors
= mt2712_bank_data
,
464 .adcpnp
= mt2712_adcpnp
,
465 .sensor_mux_values
= mt2712_mux_values
,
469 * MT7622 have only one sensing point which uses AUXADC Channel 11 for raw data
472 static const struct mtk_thermal_data mt7622_thermal_data
= {
473 .auxadc_channel
= MT7622_TEMP_AUXADC_CHANNEL
,
474 .num_banks
= MT7622_NUM_ZONES
,
475 .num_sensors
= MT7622_NUM_SENSORS
,
476 .vts_index
= mt7622_vts_index
,
477 .cali_val
= MT7622_CALIBRATION
,
478 .num_controller
= MT7622_NUM_CONTROLLER
,
479 .controller_offset
= mt7622_tc_offset
,
480 .need_switch_bank
= true,
484 .sensors
= mt7622_bank_data
,
488 .adcpnp
= mt7622_adcpnp
,
489 .sensor_mux_values
= mt7622_mux_values
,
493 * The MT8183 thermal controller has one bank for the current SW framework.
494 * The MT8183 has a total of 6 temperature sensors.
495 * There are two thermal controller to control the six sensor.
496 * The first one bind 2 sensor, and the other bind 4 sensors.
497 * The thermal core only gets the maximum temperature of all sensor, so
498 * the bank concept wouldn't be necessary here. However, the SVS (Smart
499 * Voltage Scaling) unit makes its decisions based on the same bank
500 * data, and this indeed needs the temperatures of the individual banks
501 * for making better decisions.
504 static const struct mtk_thermal_data mt8183_thermal_data
= {
505 .auxadc_channel
= MT8183_TEMP_AUXADC_CHANNEL
,
506 .num_banks
= MT8183_NUM_SENSORS_PER_ZONE
,
507 .num_sensors
= MT8183_NUM_SENSORS
,
508 .vts_index
= mt8183_vts_index
,
509 .cali_val
= MT8183_CALIBRATION
,
510 .num_controller
= MT8183_NUM_CONTROLLER
,
511 .controller_offset
= mt8183_tc_offset
,
512 .need_switch_bank
= false,
516 .sensors
= mt8183_bank_data
,
521 .adcpnp
= mt8183_adcpnp
,
522 .sensor_mux_values
= mt8183_mux_values
,
526 * raw_to_mcelsius - convert a raw ADC value to mcelsius
527 * @mt: The thermal controller
528 * @raw: raw ADC value
530 * This converts the raw ADC value to mcelsius using the SoC specific
531 * calibration constants
533 static int raw_to_mcelsius(struct mtk_thermal
*mt
, int sensno
, s32 raw
)
539 tmp
= 203450520 << 3;
540 tmp
/= mt
->conf
->cali_val
+ mt
->o_slope
;
541 tmp
/= 10000 + mt
->adc_ge
;
542 tmp
*= raw
- mt
->vts
[sensno
] - 3350;
545 return mt
->degc_cali
* 500 - tmp
;
549 * mtk_thermal_get_bank - get bank
552 * The bank registers are banked, we have to select a bank in the
553 * PTPCORESEL register to access it.
555 static void mtk_thermal_get_bank(struct mtk_thermal_bank
*bank
)
557 struct mtk_thermal
*mt
= bank
->mt
;
560 if (mt
->conf
->need_switch_bank
) {
561 mutex_lock(&mt
->lock
);
563 val
= readl(mt
->thermal_base
+ PTPCORESEL
);
566 writel(val
, mt
->thermal_base
+ PTPCORESEL
);
571 * mtk_thermal_put_bank - release bank
574 * release a bank previously taken with mtk_thermal_get_bank,
576 static void mtk_thermal_put_bank(struct mtk_thermal_bank
*bank
)
578 struct mtk_thermal
*mt
= bank
->mt
;
580 if (mt
->conf
->need_switch_bank
)
581 mutex_unlock(&mt
->lock
);
585 * mtk_thermal_bank_temperature - get the temperature of a bank
588 * The temperature of a bank is considered the maximum temperature of
589 * the sensors associated to the bank.
591 static int mtk_thermal_bank_temperature(struct mtk_thermal_bank
*bank
)
593 struct mtk_thermal
*mt
= bank
->mt
;
594 const struct mtk_thermal_data
*conf
= mt
->conf
;
595 int i
, temp
= INT_MIN
, max
= INT_MIN
;
598 for (i
= 0; i
< conf
->bank_data
[bank
->id
].num_sensors
; i
++) {
599 raw
= readl(mt
->thermal_base
+
600 conf
->msr
[conf
->bank_data
[bank
->id
].sensors
[i
]]);
602 temp
= raw_to_mcelsius(mt
,
603 conf
->bank_data
[bank
->id
].sensors
[i
],
607 * The first read of a sensor often contains very high bogus
608 * temperature value. Filter these out so that the system does
609 * not immediately shut down.
621 static int mtk_read_temp(void *data
, int *temperature
)
623 struct mtk_thermal
*mt
= data
;
625 int tempmax
= INT_MIN
;
627 for (i
= 0; i
< mt
->conf
->num_banks
; i
++) {
628 struct mtk_thermal_bank
*bank
= &mt
->banks
[i
];
630 mtk_thermal_get_bank(bank
);
632 tempmax
= max(tempmax
, mtk_thermal_bank_temperature(bank
));
634 mtk_thermal_put_bank(bank
);
637 *temperature
= tempmax
;
642 static const struct thermal_zone_of_device_ops mtk_thermal_ops
= {
643 .get_temp
= mtk_read_temp
,
646 static void mtk_thermal_init_bank(struct mtk_thermal
*mt
, int num
,
647 u32 apmixed_phys_base
, u32 auxadc_phys_base
,
650 struct mtk_thermal_bank
*bank
= &mt
->banks
[num
];
651 const struct mtk_thermal_data
*conf
= mt
->conf
;
654 int offset
= mt
->conf
->controller_offset
[ctrl_id
];
655 void __iomem
*controller_base
= mt
->thermal_base
+ offset
;
660 mtk_thermal_get_bank(bank
);
662 /* bus clock 66M counting unit is 12 * 15.15ns * 256 = 46.540us */
663 writel(TEMP_MONCTL1_PERIOD_UNIT(12), controller_base
+ TEMP_MONCTL1
);
666 * filt interval is 1 * 46.540us = 46.54us,
667 * sen interval is 429 * 46.540us = 19.96ms
669 writel(TEMP_MONCTL2_FILTER_INTERVAL(1) |
670 TEMP_MONCTL2_SENSOR_INTERVAL(429),
671 controller_base
+ TEMP_MONCTL2
);
673 /* poll is set to 10u */
674 writel(TEMP_AHBPOLL_ADC_POLL_INTERVAL(768),
675 controller_base
+ TEMP_AHBPOLL
);
677 /* temperature sampling control, 1 sample */
678 writel(0x0, controller_base
+ TEMP_MSRCTL0
);
680 /* exceed this polling time, IRQ would be inserted */
681 writel(0xffffffff, controller_base
+ TEMP_AHBTO
);
683 /* number of interrupts per event, 1 is enough */
684 writel(0x0, controller_base
+ TEMP_MONIDET0
);
685 writel(0x0, controller_base
+ TEMP_MONIDET1
);
688 * The MT8173 thermal controller does not have its own ADC. Instead it
689 * uses AHB bus accesses to control the AUXADC. To do this the thermal
690 * controller has to be programmed with the physical addresses of the
691 * AUXADC registers and with the various bit positions in the AUXADC.
692 * Also the thermal controller controls a mux in the APMIXEDSYS register
697 * this value will be stored to TEMP_PNPMUXADDR (TEMP_SPARE0)
698 * automatically by hw
700 writel(BIT(conf
->auxadc_channel
), controller_base
+ TEMP_ADCMUX
);
702 /* AHB address for auxadc mux selection */
703 writel(auxadc_phys_base
+ AUXADC_CON1_CLR_V
,
704 controller_base
+ TEMP_ADCMUXADDR
);
706 /* AHB address for pnp sensor mux selection */
707 writel(apmixed_phys_base
+ APMIXED_SYS_TS_CON1
,
708 controller_base
+ TEMP_PNPMUXADDR
);
710 /* AHB value for auxadc enable */
711 writel(BIT(conf
->auxadc_channel
), controller_base
+ TEMP_ADCEN
);
713 /* AHB address for auxadc enable (channel 0 immediate mode selected) */
714 writel(auxadc_phys_base
+ AUXADC_CON1_SET_V
,
715 controller_base
+ TEMP_ADCENADDR
);
717 /* AHB address for auxadc valid bit */
718 writel(auxadc_phys_base
+ AUXADC_DATA(conf
->auxadc_channel
),
719 controller_base
+ TEMP_ADCVALIDADDR
);
721 /* AHB address for auxadc voltage output */
722 writel(auxadc_phys_base
+ AUXADC_DATA(conf
->auxadc_channel
),
723 controller_base
+ TEMP_ADCVOLTADDR
);
725 /* read valid & voltage are at the same register */
726 writel(0x0, controller_base
+ TEMP_RDCTRL
);
728 /* indicate where the valid bit is */
729 writel(TEMP_ADCVALIDMASK_VALID_HIGH
| TEMP_ADCVALIDMASK_VALID_POS(12),
730 controller_base
+ TEMP_ADCVALIDMASK
);
733 writel(0x0, controller_base
+ TEMP_ADCVOLTAGESHIFT
);
735 /* enable auxadc mux write transaction */
736 writel(TEMP_ADCWRITECTRL_ADC_MUX_WRITE
,
737 controller_base
+ TEMP_ADCWRITECTRL
);
739 for (i
= 0; i
< conf
->bank_data
[num
].num_sensors
; i
++)
740 writel(conf
->sensor_mux_values
[conf
->bank_data
[num
].sensors
[i
]],
742 conf
->adcpnp
[conf
->bank_data
[num
].sensors
[i
]]);
744 writel((1 << conf
->bank_data
[num
].num_sensors
) - 1,
745 controller_base
+ TEMP_MONCTL0
);
747 writel(TEMP_ADCWRITECTRL_ADC_PNP_WRITE
|
748 TEMP_ADCWRITECTRL_ADC_MUX_WRITE
,
749 controller_base
+ TEMP_ADCWRITECTRL
);
751 mtk_thermal_put_bank(bank
);
754 static u64
of_get_phys_base(struct device_node
*np
)
757 const __be32
*regaddr_p
;
759 regaddr_p
= of_get_address(np
, 0, &size64
, NULL
);
763 return of_translate_address(np
, regaddr_p
);
766 static int mtk_thermal_get_calibration_data(struct device
*dev
,
767 struct mtk_thermal
*mt
)
769 struct nvmem_cell
*cell
;
774 /* Start with default values */
776 for (i
= 0; i
< mt
->conf
->num_sensors
; i
++)
781 cell
= nvmem_cell_get(dev
, "calibration-data");
783 if (PTR_ERR(cell
) == -EPROBE_DEFER
)
784 return PTR_ERR(cell
);
788 buf
= (u32
*)nvmem_cell_read(cell
, &len
);
790 nvmem_cell_put(cell
);
795 if (len
< 3 * sizeof(u32
)) {
796 dev_warn(dev
, "invalid calibration data\n");
801 if (buf
[0] & CALIB_BUF0_VALID
) {
802 mt
->adc_ge
= CALIB_BUF1_ADC_GE(buf
[1]);
804 for (i
= 0; i
< mt
->conf
->num_sensors
; i
++) {
805 switch (mt
->conf
->vts_index
[i
]) {
807 mt
->vts
[VTS1
] = CALIB_BUF0_VTS_TS1(buf
[0]);
810 mt
->vts
[VTS2
] = CALIB_BUF0_VTS_TS2(buf
[0]);
813 mt
->vts
[VTS3
] = CALIB_BUF1_VTS_TS3(buf
[1]);
816 mt
->vts
[VTS4
] = CALIB_BUF2_VTS_TS4(buf
[2]);
819 mt
->vts
[VTS5
] = CALIB_BUF2_VTS_TS5(buf
[2]);
822 mt
->vts
[VTSABB
] = CALIB_BUF2_VTS_TSABB(buf
[2]);
829 mt
->degc_cali
= CALIB_BUF0_DEGC_CALI(buf
[0]);
830 if (CALIB_BUF1_ID(buf
[1]) &
831 CALIB_BUF0_O_SLOPE_SIGN(buf
[0]))
832 mt
->o_slope
= -CALIB_BUF0_O_SLOPE(buf
[0]);
834 mt
->o_slope
= CALIB_BUF0_O_SLOPE(buf
[0]);
836 dev_info(dev
, "Device not calibrated, using default calibration values\n");
845 static const struct of_device_id mtk_thermal_of_match
[] = {
847 .compatible
= "mediatek,mt8173-thermal",
848 .data
= (void *)&mt8173_thermal_data
,
851 .compatible
= "mediatek,mt2701-thermal",
852 .data
= (void *)&mt2701_thermal_data
,
855 .compatible
= "mediatek,mt2712-thermal",
856 .data
= (void *)&mt2712_thermal_data
,
859 .compatible
= "mediatek,mt7622-thermal",
860 .data
= (void *)&mt7622_thermal_data
,
863 .compatible
= "mediatek,mt8183-thermal",
864 .data
= (void *)&mt8183_thermal_data
,
868 MODULE_DEVICE_TABLE(of
, mtk_thermal_of_match
);
870 static int mtk_thermal_probe(struct platform_device
*pdev
)
873 struct device_node
*auxadc
, *apmixedsys
, *np
= pdev
->dev
.of_node
;
874 struct mtk_thermal
*mt
;
875 struct resource
*res
;
876 u64 auxadc_phys_base
, apmixed_phys_base
;
877 struct thermal_zone_device
*tzdev
;
879 mt
= devm_kzalloc(&pdev
->dev
, sizeof(*mt
), GFP_KERNEL
);
883 mt
->conf
= of_device_get_match_data(&pdev
->dev
);
885 mt
->clk_peri_therm
= devm_clk_get(&pdev
->dev
, "therm");
886 if (IS_ERR(mt
->clk_peri_therm
))
887 return PTR_ERR(mt
->clk_peri_therm
);
889 mt
->clk_auxadc
= devm_clk_get(&pdev
->dev
, "auxadc");
890 if (IS_ERR(mt
->clk_auxadc
))
891 return PTR_ERR(mt
->clk_auxadc
);
893 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
894 mt
->thermal_base
= devm_ioremap_resource(&pdev
->dev
, res
);
895 if (IS_ERR(mt
->thermal_base
))
896 return PTR_ERR(mt
->thermal_base
);
898 ret
= mtk_thermal_get_calibration_data(&pdev
->dev
, mt
);
902 mutex_init(&mt
->lock
);
904 mt
->dev
= &pdev
->dev
;
906 auxadc
= of_parse_phandle(np
, "mediatek,auxadc", 0);
908 dev_err(&pdev
->dev
, "missing auxadc node\n");
912 auxadc_phys_base
= of_get_phys_base(auxadc
);
916 if (auxadc_phys_base
== OF_BAD_ADDR
) {
917 dev_err(&pdev
->dev
, "Can't get auxadc phys address\n");
921 apmixedsys
= of_parse_phandle(np
, "mediatek,apmixedsys", 0);
923 dev_err(&pdev
->dev
, "missing apmixedsys node\n");
927 apmixed_phys_base
= of_get_phys_base(apmixedsys
);
929 of_node_put(apmixedsys
);
931 if (apmixed_phys_base
== OF_BAD_ADDR
) {
932 dev_err(&pdev
->dev
, "Can't get auxadc phys address\n");
936 ret
= device_reset(&pdev
->dev
);
940 ret
= clk_prepare_enable(mt
->clk_auxadc
);
942 dev_err(&pdev
->dev
, "Can't enable auxadc clk: %d\n", ret
);
946 ret
= clk_prepare_enable(mt
->clk_peri_therm
);
948 dev_err(&pdev
->dev
, "Can't enable peri clk: %d\n", ret
);
949 goto err_disable_clk_auxadc
;
952 for (ctrl_id
= 0; ctrl_id
< mt
->conf
->num_controller
; ctrl_id
++)
953 for (i
= 0; i
< mt
->conf
->num_banks
; i
++)
954 mtk_thermal_init_bank(mt
, i
, apmixed_phys_base
,
955 auxadc_phys_base
, ctrl_id
);
957 platform_set_drvdata(pdev
, mt
);
959 tzdev
= devm_thermal_zone_of_sensor_register(&pdev
->dev
, 0, mt
,
962 ret
= PTR_ERR(tzdev
);
963 goto err_disable_clk_peri_therm
;
968 err_disable_clk_peri_therm
:
969 clk_disable_unprepare(mt
->clk_peri_therm
);
970 err_disable_clk_auxadc
:
971 clk_disable_unprepare(mt
->clk_auxadc
);
976 static int mtk_thermal_remove(struct platform_device
*pdev
)
978 struct mtk_thermal
*mt
= platform_get_drvdata(pdev
);
980 clk_disable_unprepare(mt
->clk_peri_therm
);
981 clk_disable_unprepare(mt
->clk_auxadc
);
986 static struct platform_driver mtk_thermal_driver
= {
987 .probe
= mtk_thermal_probe
,
988 .remove
= mtk_thermal_remove
,
990 .name
= "mtk-thermal",
991 .of_match_table
= mtk_thermal_of_match
,
995 module_platform_driver(mtk_thermal_driver
);
997 MODULE_AUTHOR("Michael Kao <michael.kao@mediatek.com>");
998 MODULE_AUTHOR("Louis Yu <louis.yu@mediatek.com>");
999 MODULE_AUTHOR("Dawei Chien <dawei.chien@mediatek.com>");
1000 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
1001 MODULE_AUTHOR("Hanyi Wu <hanyi.wu@mediatek.com>");
1002 MODULE_DESCRIPTION("Mediatek thermal driver");
1003 MODULE_LICENSE("GPL v2");