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