xref: /linux/drivers/thermal/tegra/tegra114-soctherm.c (revision 4f38da1f027ea2c9f01bb71daa7a299c191b6940)
1*9d522a87SSvyatoslav Ryhel // SPDX-License-Identifier: GPL-2.0
2*9d522a87SSvyatoslav Ryhel /*
3*9d522a87SSvyatoslav Ryhel  * Copyright (c) 2014-2018, NVIDIA CORPORATION.  All rights reserved.
4*9d522a87SSvyatoslav Ryhel  * Copyright (c) 2024, Svyatoslav Ryhel <clamor95@gmail.com>
5*9d522a87SSvyatoslav Ryhel  */
6*9d522a87SSvyatoslav Ryhel 
7*9d522a87SSvyatoslav Ryhel #include <linux/module.h>
8*9d522a87SSvyatoslav Ryhel #include <linux/platform_device.h>
9*9d522a87SSvyatoslav Ryhel 
10*9d522a87SSvyatoslav Ryhel #include <dt-bindings/thermal/tegra114-soctherm.h>
11*9d522a87SSvyatoslav Ryhel 
12*9d522a87SSvyatoslav Ryhel #include "soctherm.h"
13*9d522a87SSvyatoslav Ryhel 
14*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_ANY_EN_MASK		(0x1 << 28)
15*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_MEM_EN_MASK		(0x1 << 27)
16*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_GPU_EN_MASK		(0x1 << 26)
17*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_CPU_EN_MASK		(0x1 << 25)
18*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_TSENSE_EN_MASK	(0x1 << 24)
19*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_GPUMEM_THRESH_MASK	(0xff << 16)
20*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_CPU_THRESH_MASK	(0xff << 8)
21*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMTRIP_TSENSE_THRESH_MASK	0xff
22*9d522a87SSvyatoslav Ryhel 
23*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMCTL_LVL0_UP_THRESH_MASK	(0xff << 17)
24*9d522a87SSvyatoslav Ryhel #define TEGRA114_THERMCTL_LVL0_DN_THRESH_MASK	(0xff << 9)
25*9d522a87SSvyatoslav Ryhel 
26*9d522a87SSvyatoslav Ryhel #define TEGRA114_THRESH_GRAIN			1000
27*9d522a87SSvyatoslav Ryhel #define TEGRA114_BPTT				8
28*9d522a87SSvyatoslav Ryhel 
29*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor_configuration tegra114_tsensor_config = {
30*9d522a87SSvyatoslav Ryhel 	.tall = 16300,
31*9d522a87SSvyatoslav Ryhel 	.tiddq_en = 1,
32*9d522a87SSvyatoslav Ryhel 	.ten_count = 1,
33*9d522a87SSvyatoslav Ryhel 	.tsample = 163,
34*9d522a87SSvyatoslav Ryhel 	.tsample_ate = 655,
35*9d522a87SSvyatoslav Ryhel };
36*9d522a87SSvyatoslav Ryhel 
37*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor_group tegra114_tsensor_group_cpu = {
38*9d522a87SSvyatoslav Ryhel 	.id = TEGRA114_SOCTHERM_SENSOR_CPU,
39*9d522a87SSvyatoslav Ryhel 	.name = "cpu",
40*9d522a87SSvyatoslav Ryhel 	.sensor_temp_offset = SENSOR_TEMP1,
41*9d522a87SSvyatoslav Ryhel 	.sensor_temp_mask = SENSOR_TEMP1_CPU_TEMP_MASK,
42*9d522a87SSvyatoslav Ryhel 	.pdiv = 10,
43*9d522a87SSvyatoslav Ryhel 	.pdiv_ate = 10,
44*9d522a87SSvyatoslav Ryhel 	.pdiv_mask = SENSOR_PDIV_CPU_MASK,
45*9d522a87SSvyatoslav Ryhel 	.pllx_hotspot_diff = 6,
46*9d522a87SSvyatoslav Ryhel 	.pllx_hotspot_mask = SENSOR_HOTSPOT_CPU_MASK,
47*9d522a87SSvyatoslav Ryhel 	.thermtrip_any_en_mask = TEGRA114_THERMTRIP_ANY_EN_MASK,
48*9d522a87SSvyatoslav Ryhel 	.thermtrip_enable_mask = TEGRA114_THERMTRIP_CPU_EN_MASK,
49*9d522a87SSvyatoslav Ryhel 	.thermtrip_threshold_mask = TEGRA114_THERMTRIP_CPU_THRESH_MASK,
50*9d522a87SSvyatoslav Ryhel 	.thermctl_isr_mask = THERM_IRQ_CPU_MASK,
51*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_CPU,
52*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_up_thresh_mask = TEGRA114_THERMCTL_LVL0_UP_THRESH_MASK,
53*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_dn_thresh_mask = TEGRA114_THERMCTL_LVL0_DN_THRESH_MASK,
54*9d522a87SSvyatoslav Ryhel };
55*9d522a87SSvyatoslav Ryhel 
56*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor_group tegra114_tsensor_group_gpu = {
57*9d522a87SSvyatoslav Ryhel 	.id = TEGRA114_SOCTHERM_SENSOR_GPU,
58*9d522a87SSvyatoslav Ryhel 	.name = "gpu",
59*9d522a87SSvyatoslav Ryhel 	.sensor_temp_offset = SENSOR_TEMP1,
60*9d522a87SSvyatoslav Ryhel 	.sensor_temp_mask = SENSOR_TEMP1_GPU_TEMP_MASK,
61*9d522a87SSvyatoslav Ryhel 	.pdiv = 10,
62*9d522a87SSvyatoslav Ryhel 	.pdiv_ate = 10,
63*9d522a87SSvyatoslav Ryhel 	.pdiv_mask = SENSOR_PDIV_GPU_MASK,
64*9d522a87SSvyatoslav Ryhel 	.pllx_hotspot_diff = 6,
65*9d522a87SSvyatoslav Ryhel 	.pllx_hotspot_mask = SENSOR_HOTSPOT_GPU_MASK,
66*9d522a87SSvyatoslav Ryhel 	.thermtrip_any_en_mask = TEGRA114_THERMTRIP_ANY_EN_MASK,
67*9d522a87SSvyatoslav Ryhel 	.thermtrip_enable_mask = TEGRA114_THERMTRIP_GPU_EN_MASK,
68*9d522a87SSvyatoslav Ryhel 	.thermtrip_threshold_mask = TEGRA114_THERMTRIP_GPUMEM_THRESH_MASK,
69*9d522a87SSvyatoslav Ryhel 	.thermctl_isr_mask = THERM_IRQ_GPU_MASK,
70*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_GPU,
71*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_up_thresh_mask = TEGRA114_THERMCTL_LVL0_UP_THRESH_MASK,
72*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_dn_thresh_mask = TEGRA114_THERMCTL_LVL0_DN_THRESH_MASK,
73*9d522a87SSvyatoslav Ryhel };
74*9d522a87SSvyatoslav Ryhel 
75*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor_group tegra114_tsensor_group_pll = {
76*9d522a87SSvyatoslav Ryhel 	.id = TEGRA114_SOCTHERM_SENSOR_PLLX,
77*9d522a87SSvyatoslav Ryhel 	.name = "pll",
78*9d522a87SSvyatoslav Ryhel 	.sensor_temp_offset = SENSOR_TEMP2,
79*9d522a87SSvyatoslav Ryhel 	.sensor_temp_mask = SENSOR_TEMP2_PLLX_TEMP_MASK,
80*9d522a87SSvyatoslav Ryhel 	.pdiv = 10,
81*9d522a87SSvyatoslav Ryhel 	.pdiv_ate = 10,
82*9d522a87SSvyatoslav Ryhel 	.pdiv_mask = SENSOR_PDIV_PLLX_MASK,
83*9d522a87SSvyatoslav Ryhel 	.thermtrip_any_en_mask = TEGRA114_THERMTRIP_ANY_EN_MASK,
84*9d522a87SSvyatoslav Ryhel 	.thermtrip_enable_mask = TEGRA114_THERMTRIP_TSENSE_EN_MASK,
85*9d522a87SSvyatoslav Ryhel 	.thermtrip_threshold_mask = TEGRA114_THERMTRIP_TSENSE_THRESH_MASK,
86*9d522a87SSvyatoslav Ryhel 	.thermctl_isr_mask = THERM_IRQ_TSENSE_MASK,
87*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_TSENSE,
88*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_up_thresh_mask = TEGRA114_THERMCTL_LVL0_UP_THRESH_MASK,
89*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_dn_thresh_mask = TEGRA114_THERMCTL_LVL0_DN_THRESH_MASK,
90*9d522a87SSvyatoslav Ryhel };
91*9d522a87SSvyatoslav Ryhel 
92*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor_group tegra114_tsensor_group_mem = {
93*9d522a87SSvyatoslav Ryhel 	.id = TEGRA114_SOCTHERM_SENSOR_MEM,
94*9d522a87SSvyatoslav Ryhel 	.name = "mem",
95*9d522a87SSvyatoslav Ryhel 	.sensor_temp_offset = SENSOR_TEMP2,
96*9d522a87SSvyatoslav Ryhel 	.sensor_temp_mask = SENSOR_TEMP2_MEM_TEMP_MASK,
97*9d522a87SSvyatoslav Ryhel 	.pdiv = 10,
98*9d522a87SSvyatoslav Ryhel 	.pdiv_ate = 10,
99*9d522a87SSvyatoslav Ryhel 	.pdiv_mask = SENSOR_PDIV_MEM_MASK,
100*9d522a87SSvyatoslav Ryhel 	.pllx_hotspot_diff = 0,
101*9d522a87SSvyatoslav Ryhel 	.pllx_hotspot_mask = SENSOR_HOTSPOT_MEM_MASK,
102*9d522a87SSvyatoslav Ryhel 	.thermtrip_any_en_mask = TEGRA114_THERMTRIP_ANY_EN_MASK,
103*9d522a87SSvyatoslav Ryhel 	.thermtrip_enable_mask = TEGRA114_THERMTRIP_MEM_EN_MASK,
104*9d522a87SSvyatoslav Ryhel 	.thermtrip_threshold_mask = TEGRA114_THERMTRIP_GPUMEM_THRESH_MASK,
105*9d522a87SSvyatoslav Ryhel 	.thermctl_isr_mask = THERM_IRQ_MEM_MASK,
106*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_MEM,
107*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_up_thresh_mask = TEGRA114_THERMCTL_LVL0_UP_THRESH_MASK,
108*9d522a87SSvyatoslav Ryhel 	.thermctl_lvl0_dn_thresh_mask = TEGRA114_THERMCTL_LVL0_DN_THRESH_MASK,
109*9d522a87SSvyatoslav Ryhel };
110*9d522a87SSvyatoslav Ryhel 
111*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor_group *tegra114_tsensor_groups[] = {
112*9d522a87SSvyatoslav Ryhel 	&tegra114_tsensor_group_cpu,
113*9d522a87SSvyatoslav Ryhel 	&tegra114_tsensor_group_gpu,
114*9d522a87SSvyatoslav Ryhel 	&tegra114_tsensor_group_pll,
115*9d522a87SSvyatoslav Ryhel 	&tegra114_tsensor_group_mem,
116*9d522a87SSvyatoslav Ryhel };
117*9d522a87SSvyatoslav Ryhel 
118*9d522a87SSvyatoslav Ryhel static const struct tegra_tsensor tegra114_tsensors[] = {
119*9d522a87SSvyatoslav Ryhel 	{
120*9d522a87SSvyatoslav Ryhel 		.name = "cpu0",
121*9d522a87SSvyatoslav Ryhel 		.base = 0xc0,
122*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
123*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x098,
124*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1196400,
125*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = -13600000,
126*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_cpu,
127*9d522a87SSvyatoslav Ryhel 	}, {
128*9d522a87SSvyatoslav Ryhel 		.name = "cpu1",
129*9d522a87SSvyatoslav Ryhel 		.base = 0xe0,
130*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
131*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x084,
132*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1196400,
133*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = -13600000,
134*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_cpu,
135*9d522a87SSvyatoslav Ryhel 	}, {
136*9d522a87SSvyatoslav Ryhel 		.name = "cpu2",
137*9d522a87SSvyatoslav Ryhel 		.base = 0x100,
138*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
139*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x088,
140*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1196400,
141*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = -13600000,
142*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_cpu,
143*9d522a87SSvyatoslav Ryhel 	}, {
144*9d522a87SSvyatoslav Ryhel 		.name = "cpu3",
145*9d522a87SSvyatoslav Ryhel 		.base = 0x120,
146*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
147*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x12c,
148*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1196400,
149*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = -13600000,
150*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_cpu,
151*9d522a87SSvyatoslav Ryhel 	}, {
152*9d522a87SSvyatoslav Ryhel 		.name = "mem0",
153*9d522a87SSvyatoslav Ryhel 		.base = 0x140,
154*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
155*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x158,
156*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1000000,
157*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = 0,
158*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_mem,
159*9d522a87SSvyatoslav Ryhel 	}, {
160*9d522a87SSvyatoslav Ryhel 		.name = "mem1",
161*9d522a87SSvyatoslav Ryhel 		.base = 0x160,
162*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
163*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x15c,
164*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1000000,
165*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = 0,
166*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_mem,
167*9d522a87SSvyatoslav Ryhel 	}, {
168*9d522a87SSvyatoslav Ryhel 		.name = "gpu",
169*9d522a87SSvyatoslav Ryhel 		.base = 0x180,
170*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
171*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x154,
172*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1124500,
173*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = -9793100,
174*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_gpu,
175*9d522a87SSvyatoslav Ryhel 	}, {
176*9d522a87SSvyatoslav Ryhel 		.name = "pllx",
177*9d522a87SSvyatoslav Ryhel 		.base = 0x1a0,
178*9d522a87SSvyatoslav Ryhel 		.config = &tegra114_tsensor_config,
179*9d522a87SSvyatoslav Ryhel 		.calib_fuse_offset = 0x160,
180*9d522a87SSvyatoslav Ryhel 		.fuse_corr_alpha = 1224200,
181*9d522a87SSvyatoslav Ryhel 		.fuse_corr_beta = -14665000,
182*9d522a87SSvyatoslav Ryhel 		.group = &tegra114_tsensor_group_pll,
183*9d522a87SSvyatoslav Ryhel 	},
184*9d522a87SSvyatoslav Ryhel };
185*9d522a87SSvyatoslav Ryhel 
186*9d522a87SSvyatoslav Ryhel static const struct tegra_soctherm_fuse tegra114_soctherm_fuse = {
187*9d522a87SSvyatoslav Ryhel 	.fuse_base_cp_mask = 0x3ff,
188*9d522a87SSvyatoslav Ryhel 	.fuse_base_cp_shift = 0,
189*9d522a87SSvyatoslav Ryhel 	.fuse_shift_cp_mask = 0x3f << 10,
190*9d522a87SSvyatoslav Ryhel 	.fuse_shift_cp_shift = 10,
191*9d522a87SSvyatoslav Ryhel 	.fuse_base_ft_mask = 0x7ff << 16,
192*9d522a87SSvyatoslav Ryhel 	.fuse_base_ft_shift = 16,
193*9d522a87SSvyatoslav Ryhel 	.fuse_shift_ft_mask = 0x1f << 27,
194*9d522a87SSvyatoslav Ryhel 	.fuse_shift_ft_shift = 27,
195*9d522a87SSvyatoslav Ryhel 	.fuse_common_reg = FUSE_VSENSOR_CALIB,
196*9d522a87SSvyatoslav Ryhel 	.fuse_spare_realignment = 0,
197*9d522a87SSvyatoslav Ryhel 	.nominal_calib_ft = 90,
198*9d522a87SSvyatoslav Ryhel };
199*9d522a87SSvyatoslav Ryhel 
200*9d522a87SSvyatoslav Ryhel const struct tegra_soctherm_soc tegra114_soctherm = {
201*9d522a87SSvyatoslav Ryhel 	.tsensors = tegra114_tsensors,
202*9d522a87SSvyatoslav Ryhel 	.num_tsensors = ARRAY_SIZE(tegra114_tsensors),
203*9d522a87SSvyatoslav Ryhel 	.ttgs = tegra114_tsensor_groups,
204*9d522a87SSvyatoslav Ryhel 	.num_ttgs = ARRAY_SIZE(tegra114_tsensor_groups),
205*9d522a87SSvyatoslav Ryhel 	.tfuse = &tegra114_soctherm_fuse,
206*9d522a87SSvyatoslav Ryhel 	.thresh_grain = TEGRA114_THRESH_GRAIN,
207*9d522a87SSvyatoslav Ryhel 	.bptt = TEGRA114_BPTT,
208*9d522a87SSvyatoslav Ryhel 	.use_ccroc = false,
209*9d522a87SSvyatoslav Ryhel };
210