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