1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * OMAP4 thermal driver.
4  *
5  * Copyright (C) 2011-2012 Texas Instruments Inc.
6  * Contact:
7  *	Eduardo Valentin <eduardo.valentin@ti.com>
8  */
9 
10 #include "ti-thermal.h"
11 #include "ti-bandgap.h"
12 #include "omap4xxx-bandgap.h"
13 
14 /*
15  * OMAP4430 has one instance of thermal sensor for MPU
16  * need to describe the individual bit fields
17  */
18 static struct temp_sensor_registers
19 omap4430_mpu_temp_sensor_registers = {
20 	.temp_sensor_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
21 	.bgap_tempsoff_mask = OMAP4430_BGAP_TEMPSOFF_MASK,
22 	.bgap_soc_mask = OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK,
23 	.bgap_eocz_mask = OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK,
24 	.bgap_dtemp_mask = OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK,
25 
26 	.bgap_mode_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
27 	.mode_ctrl_mask = OMAP4430_SINGLE_MODE_MASK,
28 
29 	.bgap_efuse = OMAP4430_FUSE_OPP_BGAP,
30 };
31 
32 /* Thresholds and limits for OMAP4430 MPU temperature sensor */
33 static struct temp_sensor_data omap4430_mpu_temp_sensor_data = {
34 	.min_freq = OMAP4430_MIN_FREQ,
35 	.max_freq = OMAP4430_MAX_FREQ,
36 };
37 
38 /*
39  * Temperature values in milli degree celsius
40  * ADC code values from 13 to 107, see TRM
41  * "18.4.10.2.3 ADC Codes Versus Temperature".
42  */
43 static const int
44 omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE - OMAP4430_ADC_START_VALUE + 1] = {
45 	-40000, -38000, -35000, -34000, -32000, -30000, -28000, -26000, -24000,
46 	-22000,	-20000, -18500, -17000, -15000, -13500, -12000, -10000, -8000,
47 	-6500, -5000, -3500, -1500, 0, 2000, 3500, 5000, 6500, 8500, 10000,
48 	12000, 13500, 15000, 17000, 19000, 21000, 23000, 25000, 27000, 28500,
49 	30000, 32000, 33500, 35000, 37000, 38500, 40000, 42000, 43500, 45000,
50 	47000, 48500, 50000, 52000, 53500, 55000, 57000, 58500, 60000, 62000,
51 	64000, 66000, 68000, 70000, 71500, 73500, 75000, 77000, 78500, 80000,
52 	82000, 83500, 85000, 87000, 88500, 90000, 92000, 93500, 95000, 97000,
53 	98500, 100000, 102000, 103500, 105000, 107000, 109000, 111000, 113000,
54 	115000, 117000, 118500, 120000, 122000, 123500, 125000,
55 };
56 
57 /* OMAP4430 data */
58 const struct ti_bandgap_data omap4430_data = {
59 	.features = TI_BANDGAP_FEATURE_MODE_CONFIG |
60 			TI_BANDGAP_FEATURE_CLK_CTRL |
61 			TI_BANDGAP_FEATURE_POWER_SWITCH,
62 	.fclock_name = "bandgap_fclk",
63 	.div_ck_name = "bandgap_fclk",
64 	.conv_table = omap4430_adc_to_temp,
65 	.adc_start_val = OMAP4430_ADC_START_VALUE,
66 	.adc_end_val = OMAP4430_ADC_END_VALUE,
67 	.expose_sensor = ti_thermal_expose_sensor,
68 	.remove_sensor = ti_thermal_remove_sensor,
69 	.sensors = {
70 		{
71 		.registers = &omap4430_mpu_temp_sensor_registers,
72 		.ts_data = &omap4430_mpu_temp_sensor_data,
73 		.domain = "cpu",
74 		.slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4430,
75 		.constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4430,
76 		.register_cooling = ti_thermal_register_cpu_cooling,
77 		.unregister_cooling = ti_thermal_unregister_cpu_cooling,
78 		},
79 	},
80 	.sensor_count = 1,
81 };
82 /*
83  * OMAP4460 has one instance of thermal sensor for MPU
84  * need to describe the individual bit fields
85  */
86 static struct temp_sensor_registers
87 omap4460_mpu_temp_sensor_registers = {
88 	.temp_sensor_ctrl = OMAP4460_TEMP_SENSOR_CTRL_OFFSET,
89 	.bgap_tempsoff_mask = OMAP4460_BGAP_TEMPSOFF_MASK,
90 	.bgap_soc_mask = OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK,
91 	.bgap_eocz_mask = OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK,
92 	.bgap_dtemp_mask = OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK,
93 
94 	.bgap_mask_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
95 	.mask_hot_mask = OMAP4460_MASK_HOT_MASK,
96 	.mask_cold_mask = OMAP4460_MASK_COLD_MASK,
97 
98 	.bgap_mode_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
99 	.mode_ctrl_mask = OMAP4460_SINGLE_MODE_MASK,
100 
101 	.bgap_counter = OMAP4460_BGAP_COUNTER_OFFSET,
102 	.counter_mask = OMAP4460_COUNTER_MASK,
103 
104 	.bgap_threshold = OMAP4460_BGAP_THRESHOLD_OFFSET,
105 	.threshold_thot_mask = OMAP4460_T_HOT_MASK,
106 	.threshold_tcold_mask = OMAP4460_T_COLD_MASK,
107 
108 	.tshut_threshold = OMAP4460_BGAP_TSHUT_OFFSET,
109 	.tshut_hot_mask = OMAP4460_TSHUT_HOT_MASK,
110 	.tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK,
111 
112 	.bgap_status = OMAP4460_BGAP_STATUS_OFFSET,
113 	.status_hot_mask = OMAP4460_HOT_FLAG_MASK,
114 	.status_cold_mask = OMAP4460_COLD_FLAG_MASK,
115 
116 	.bgap_efuse = OMAP4460_FUSE_OPP_BGAP,
117 };
118 
119 /* Thresholds and limits for OMAP4460 MPU temperature sensor */
120 static struct temp_sensor_data omap4460_mpu_temp_sensor_data = {
121 	.tshut_hot = OMAP4460_TSHUT_HOT,
122 	.tshut_cold = OMAP4460_TSHUT_COLD,
123 	.t_hot = OMAP4460_T_HOT,
124 	.t_cold = OMAP4460_T_COLD,
125 	.min_freq = OMAP4460_MIN_FREQ,
126 	.max_freq = OMAP4460_MAX_FREQ,
127 };
128 
129 /*
130  * Temperature values in milli degree celsius
131  * ADC code values from 530 to 923
132  */
133 static const int
134 omap4460_adc_to_temp[OMAP4460_ADC_END_VALUE - OMAP4460_ADC_START_VALUE + 1] = {
135 	-40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200,
136 	-37800, -37300, -36800, -36400, -36000, -35600, -35200, -34800,
137 	-34300, -33800, -33400, -33000, -32600, -32200, -31800, -31300,
138 	-30800, -30400, -30000, -29600, -29200, -28700, -28200, -27800,
139 	-27400, -27000, -26600, -26200, -25700, -25200, -24800, -24400,
140 	-24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000,
141 	-20600, -20200, -19700, -19200, -18800, -18400, -18000, -17600,
142 	-17200, -16700, -16200, -15800, -15400, -15000, -14600, -14200,
143 	-13700, -13200, -12800, -12400, -12000, -11600, -11200, -10700,
144 	-10200, -9800, -9400, -9000, -8600, -8200, -7700, -7200, -6800,
145 	-6400, -6000, -5600, -5200, -4800, -4300, -3800, -3400, -3000,
146 	-2600, -2200, -1800, -1300, -800, -400, 0, 400, 800, 1200, 1600,
147 	2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000, 6400,
148 	6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10600, 11000,
149 	11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800,
150 	15300, 15800, 16200, 16600, 17000, 17400, 17800, 18200, 18700,
151 	19200, 19600, 20000, 20400, 20800, 21200, 21600, 22100, 22600,
152 	23000, 23400, 23800, 24200, 24600, 25000, 25400, 25900, 26400,
153 	26800, 27200, 27600, 28000, 28400, 28800, 29300, 29800, 30200,
154 	30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000,
155 	34400, 34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800,
156 	38200, 38600, 39000, 39400, 39800, 40200, 40600, 41100, 41600,
157 	42000, 42400, 42800, 43200, 43600, 44000, 44400, 44800, 45300,
158 	45800, 46200, 46600, 47000, 47400, 47800, 48200, 48600, 49000,
159 	49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400, 52800,
160 	53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600,
161 	57000, 57400, 57800, 58200, 58700, 59200, 59600, 60000, 60400,
162 	60800, 61200, 61600, 62000, 62400, 62800, 63300, 63800, 64200,
163 	64600, 65000, 65400, 65800, 66200, 66600, 67000, 67400, 67800,
164 	68200, 68700, 69200, 69600, 70000, 70400, 70800, 71200, 71600,
165 	72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400,
166 	75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000,
167 	79400, 79800, 80300, 80800, 81200, 81600, 82000, 82400, 82800,
168 	83200, 83600, 84000, 84400, 84800, 85200, 85600, 86000, 86400,
169 	86800, 87300, 87800, 88200, 88600, 89000, 89400, 89800, 90200,
170 	90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400, 93800,
171 	94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600,
172 	98000, 98400, 98800, 99200, 99600, 100000, 100400, 100800, 101200,
173 	101600, 102000, 102400, 102800, 103200, 103600, 104000, 104400,
174 	104800, 105200, 105600, 106100, 106600, 107000, 107400, 107800,
175 	108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000,
176 	111400, 111800, 112200, 112600, 113000, 113400, 113800, 114200,
177 	114600, 115000, 115400, 115800, 116200, 116600, 117000, 117400,
178 	117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600,
179 	121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200,
180 	124600, 124900, 125000, 125000, 125000, 125000
181 };
182 
183 /* OMAP4460 data */
184 const struct ti_bandgap_data omap4460_data = {
185 	.features = TI_BANDGAP_FEATURE_TSHUT |
186 			TI_BANDGAP_FEATURE_TSHUT_CONFIG |
187 			TI_BANDGAP_FEATURE_TALERT |
188 			TI_BANDGAP_FEATURE_MODE_CONFIG |
189 			TI_BANDGAP_FEATURE_POWER_SWITCH |
190 			TI_BANDGAP_FEATURE_CLK_CTRL |
191 			TI_BANDGAP_FEATURE_COUNTER,
192 	.fclock_name = "bandgap_ts_fclk",
193 	.div_ck_name = "div_ts_ck",
194 	.conv_table = omap4460_adc_to_temp,
195 	.adc_start_val = OMAP4460_ADC_START_VALUE,
196 	.adc_end_val = OMAP4460_ADC_END_VALUE,
197 	.expose_sensor = ti_thermal_expose_sensor,
198 	.remove_sensor = ti_thermal_remove_sensor,
199 	.report_temperature = ti_thermal_report_sensor_temperature,
200 	.sensors = {
201 		{
202 		.registers = &omap4460_mpu_temp_sensor_registers,
203 		.ts_data = &omap4460_mpu_temp_sensor_data,
204 		.domain = "cpu",
205 		.slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4460,
206 		.constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4460,
207 		.register_cooling = ti_thermal_register_cpu_cooling,
208 		.unregister_cooling = ti_thermal_unregister_cpu_cooling,
209 		},
210 	},
211 	.sensor_count = 1,
212 };
213 
214 /* OMAP4470 data */
215 const struct ti_bandgap_data omap4470_data = {
216 	.features = TI_BANDGAP_FEATURE_TSHUT |
217 			TI_BANDGAP_FEATURE_TSHUT_CONFIG |
218 			TI_BANDGAP_FEATURE_TALERT |
219 			TI_BANDGAP_FEATURE_MODE_CONFIG |
220 			TI_BANDGAP_FEATURE_POWER_SWITCH |
221 			TI_BANDGAP_FEATURE_CLK_CTRL |
222 			TI_BANDGAP_FEATURE_COUNTER,
223 	.fclock_name = "bandgap_ts_fclk",
224 	.div_ck_name = "div_ts_ck",
225 	.conv_table = omap4460_adc_to_temp,
226 	.adc_start_val = OMAP4460_ADC_START_VALUE,
227 	.adc_end_val = OMAP4460_ADC_END_VALUE,
228 	.expose_sensor = ti_thermal_expose_sensor,
229 	.remove_sensor = ti_thermal_remove_sensor,
230 	.report_temperature = ti_thermal_report_sensor_temperature,
231 	.sensors = {
232 		{
233 		.registers = &omap4460_mpu_temp_sensor_registers,
234 		.ts_data = &omap4460_mpu_temp_sensor_data,
235 		.domain = "cpu",
236 		.slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4470,
237 		.constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4470,
238 		.register_cooling = ti_thermal_register_cpu_cooling,
239 		.unregister_cooling = ti_thermal_unregister_cpu_cooling,
240 		},
241 	},
242 	.sensor_count = 1,
243 };
244