xref: /openbmc/linux/drivers/thermal/qcom/tsens.h (revision fb8d6c8d)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2015, The Linux Foundation. All rights reserved.
4  */
5 
6 #ifndef __QCOM_TSENS_H__
7 #define __QCOM_TSENS_H__
8 
9 #define ONE_PT_CALIB		0x1
10 #define ONE_PT_CALIB2		0x2
11 #define TWO_PT_CALIB		0x3
12 #define CAL_DEGC_PT1		30
13 #define CAL_DEGC_PT2		120
14 #define SLOPE_FACTOR		1000
15 #define SLOPE_DEFAULT		3200
16 
17 
18 #include <linux/thermal.h>
19 #include <linux/regmap.h>
20 #include <linux/slab.h>
21 
22 struct tsens_priv;
23 
24 enum tsens_ver {
25 	VER_0_1 = 0,
26 	VER_1_X,
27 	VER_2_X,
28 };
29 
30 /**
31  * struct tsens_sensor - data for each sensor connected to the tsens device
32  * @priv: tsens device instance that this sensor is connected to
33  * @tzd: pointer to the thermal zone that this sensor is in
34  * @offset: offset of temperature adjustment curve
35  * @id: Sensor ID
36  * @hw_id: HW ID can be used in case of platform-specific IDs
37  * @slope: slope of temperature adjustment curve
38  * @status: 8960-specific variable to track 8960 and 8660 status register offset
39  */
40 struct tsens_sensor {
41 	struct tsens_priv		*priv;
42 	struct thermal_zone_device	*tzd;
43 	int				offset;
44 	unsigned int			id;
45 	unsigned int			hw_id;
46 	int				slope;
47 	u32				status;
48 };
49 
50 /**
51  * struct tsens_ops - operations as supported by the tsens device
52  * @init: Function to initialize the tsens device
53  * @calibrate: Function to calibrate the tsens device
54  * @get_temp: Function which returns the temp in millidegC
55  * @enable: Function to enable (clocks/power) tsens device
56  * @disable: Function to disable the tsens device
57  * @suspend: Function to suspend the tsens device
58  * @resume: Function to resume the tsens device
59  * @get_trend: Function to get the thermal/temp trend
60  */
61 struct tsens_ops {
62 	/* mandatory callbacks */
63 	int (*init)(struct tsens_priv *priv);
64 	int (*calibrate)(struct tsens_priv *priv);
65 	int (*get_temp)(struct tsens_priv *priv, int i, int *temp);
66 	/* optional callbacks */
67 	int (*enable)(struct tsens_priv *priv, int i);
68 	void (*disable)(struct tsens_priv *priv);
69 	int (*suspend)(struct tsens_priv *priv);
70 	int (*resume)(struct tsens_priv *priv);
71 	int (*get_trend)(struct tsens_priv *priv, int i, enum thermal_trend *trend);
72 };
73 
74 #define REG_FIELD_FOR_EACH_SENSOR11(_name, _offset, _startbit, _stopbit) \
75 	[_name##_##0]  = REG_FIELD(_offset,      _startbit, _stopbit),	\
76 	[_name##_##1]  = REG_FIELD(_offset +  4, _startbit, _stopbit), \
77 	[_name##_##2]  = REG_FIELD(_offset +  8, _startbit, _stopbit), \
78 	[_name##_##3]  = REG_FIELD(_offset + 12, _startbit, _stopbit), \
79 	[_name##_##4]  = REG_FIELD(_offset + 16, _startbit, _stopbit), \
80 	[_name##_##5]  = REG_FIELD(_offset + 20, _startbit, _stopbit), \
81 	[_name##_##6]  = REG_FIELD(_offset + 24, _startbit, _stopbit), \
82 	[_name##_##7]  = REG_FIELD(_offset + 28, _startbit, _stopbit), \
83 	[_name##_##8]  = REG_FIELD(_offset + 32, _startbit, _stopbit), \
84 	[_name##_##9]  = REG_FIELD(_offset + 36, _startbit, _stopbit), \
85 	[_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit)
86 
87 #define REG_FIELD_FOR_EACH_SENSOR16(_name, _offset, _startbit, _stopbit) \
88 	[_name##_##0]  = REG_FIELD(_offset,      _startbit, _stopbit),	\
89 	[_name##_##1]  = REG_FIELD(_offset +  4, _startbit, _stopbit), \
90 	[_name##_##2]  = REG_FIELD(_offset +  8, _startbit, _stopbit), \
91 	[_name##_##3]  = REG_FIELD(_offset + 12, _startbit, _stopbit), \
92 	[_name##_##4]  = REG_FIELD(_offset + 16, _startbit, _stopbit), \
93 	[_name##_##5]  = REG_FIELD(_offset + 20, _startbit, _stopbit), \
94 	[_name##_##6]  = REG_FIELD(_offset + 24, _startbit, _stopbit), \
95 	[_name##_##7]  = REG_FIELD(_offset + 28, _startbit, _stopbit), \
96 	[_name##_##8]  = REG_FIELD(_offset + 32, _startbit, _stopbit), \
97 	[_name##_##9]  = REG_FIELD(_offset + 36, _startbit, _stopbit), \
98 	[_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit), \
99 	[_name##_##11] = REG_FIELD(_offset + 44, _startbit, _stopbit), \
100 	[_name##_##12] = REG_FIELD(_offset + 48, _startbit, _stopbit), \
101 	[_name##_##13] = REG_FIELD(_offset + 52, _startbit, _stopbit), \
102 	[_name##_##14] = REG_FIELD(_offset + 56, _startbit, _stopbit), \
103 	[_name##_##15] = REG_FIELD(_offset + 60, _startbit, _stopbit)
104 
105 /* reg_field IDs to use as an index into an array */
106 enum regfield_ids {
107 	/* ----- SROT ------ */
108 	/* HW_VER */
109 	VER_MAJOR = 0,
110 	VER_MINOR,
111 	VER_STEP,
112 	/* CTRL_OFFSET */
113 	TSENS_EN =  3,
114 	TSENS_SW_RST,
115 	SENSOR_EN,
116 	CODE_OR_TEMP,
117 
118 	/* ----- TM ------ */
119 	/* STATUS */
120 	LAST_TEMP_0 = 7,	/* Last temperature reading */
121 	LAST_TEMP_1,
122 	LAST_TEMP_2,
123 	LAST_TEMP_3,
124 	LAST_TEMP_4,
125 	LAST_TEMP_5,
126 	LAST_TEMP_6,
127 	LAST_TEMP_7,
128 	LAST_TEMP_8,
129 	LAST_TEMP_9,
130 	LAST_TEMP_10,
131 	LAST_TEMP_11,
132 	LAST_TEMP_12,
133 	LAST_TEMP_13,
134 	LAST_TEMP_14,
135 	LAST_TEMP_15,
136 	VALID_0 = 23,		/* VALID reading or not */
137 	VALID_1,
138 	VALID_2,
139 	VALID_3,
140 	VALID_4,
141 	VALID_5,
142 	VALID_6,
143 	VALID_7,
144 	VALID_8,
145 	VALID_9,
146 	VALID_10,
147 	VALID_11,
148 	VALID_12,
149 	VALID_13,
150 	VALID_14,
151 	VALID_15,
152 	MIN_STATUS_0,		/* MIN threshold violated */
153 	MIN_STATUS_1,
154 	MIN_STATUS_2,
155 	MIN_STATUS_3,
156 	MIN_STATUS_4,
157 	MIN_STATUS_5,
158 	MIN_STATUS_6,
159 	MIN_STATUS_7,
160 	MIN_STATUS_8,
161 	MIN_STATUS_9,
162 	MIN_STATUS_10,
163 	MIN_STATUS_11,
164 	MIN_STATUS_12,
165 	MIN_STATUS_13,
166 	MIN_STATUS_14,
167 	MIN_STATUS_15,
168 	MAX_STATUS_0,		/* MAX threshold violated */
169 	MAX_STATUS_1,
170 	MAX_STATUS_2,
171 	MAX_STATUS_3,
172 	MAX_STATUS_4,
173 	MAX_STATUS_5,
174 	MAX_STATUS_6,
175 	MAX_STATUS_7,
176 	MAX_STATUS_8,
177 	MAX_STATUS_9,
178 	MAX_STATUS_10,
179 	MAX_STATUS_11,
180 	MAX_STATUS_12,
181 	MAX_STATUS_13,
182 	MAX_STATUS_14,
183 	MAX_STATUS_15,
184 	LOWER_STATUS_0,	/* LOWER threshold violated */
185 	LOWER_STATUS_1,
186 	LOWER_STATUS_2,
187 	LOWER_STATUS_3,
188 	LOWER_STATUS_4,
189 	LOWER_STATUS_5,
190 	LOWER_STATUS_6,
191 	LOWER_STATUS_7,
192 	LOWER_STATUS_8,
193 	LOWER_STATUS_9,
194 	LOWER_STATUS_10,
195 	LOWER_STATUS_11,
196 	LOWER_STATUS_12,
197 	LOWER_STATUS_13,
198 	LOWER_STATUS_14,
199 	LOWER_STATUS_15,
200 	UPPER_STATUS_0,	/* UPPER threshold violated */
201 	UPPER_STATUS_1,
202 	UPPER_STATUS_2,
203 	UPPER_STATUS_3,
204 	UPPER_STATUS_4,
205 	UPPER_STATUS_5,
206 	UPPER_STATUS_6,
207 	UPPER_STATUS_7,
208 	UPPER_STATUS_8,
209 	UPPER_STATUS_9,
210 	UPPER_STATUS_10,
211 	UPPER_STATUS_11,
212 	UPPER_STATUS_12,
213 	UPPER_STATUS_13,
214 	UPPER_STATUS_14,
215 	UPPER_STATUS_15,
216 	CRITICAL_STATUS_0,	/* CRITICAL threshold violated */
217 	CRITICAL_STATUS_1,
218 	CRITICAL_STATUS_2,
219 	CRITICAL_STATUS_3,
220 	CRITICAL_STATUS_4,
221 	CRITICAL_STATUS_5,
222 	CRITICAL_STATUS_6,
223 	CRITICAL_STATUS_7,
224 	CRITICAL_STATUS_8,
225 	CRITICAL_STATUS_9,
226 	CRITICAL_STATUS_10,
227 	CRITICAL_STATUS_11,
228 	CRITICAL_STATUS_12,
229 	CRITICAL_STATUS_13,
230 	CRITICAL_STATUS_14,
231 	CRITICAL_STATUS_15,
232 	/* TRDY */
233 	TRDY,
234 	/* INTERRUPT ENABLE */
235 	INT_EN,	/* Pre-V1, V1.x */
236 	LOW_INT_EN,	/* V2.x */
237 	UP_INT_EN,	/* V2.x */
238 	CRIT_INT_EN,	/* V2.x */
239 
240 	/* Keep last */
241 	MAX_REGFIELDS
242 };
243 
244 /**
245  * struct tsens_features - Features supported by the IP
246  * @ver_major: Major number of IP version
247  * @crit_int: does the IP support critical interrupts?
248  * @adc:      do the sensors only output adc code (instead of temperature)?
249  * @srot_split: does the IP neatly splits the register space into SROT and TM,
250  *              with SROT only being available to secure boot firmware?
251  * @max_sensors: maximum sensors supported by this version of the IP
252  */
253 struct tsens_features {
254 	unsigned int ver_major;
255 	unsigned int crit_int:1;
256 	unsigned int adc:1;
257 	unsigned int srot_split:1;
258 	unsigned int max_sensors;
259 };
260 
261 /**
262  * struct tsens_plat_data - tsens compile-time platform data
263  * @num_sensors: Number of sensors supported by platform
264  * @ops: operations the tsens instance supports
265  * @hw_ids: Subset of sensors ids supported by platform, if not the first n
266  * @feat: features of the IP
267  * @fields: bitfield locations
268  */
269 struct tsens_plat_data {
270 	const u32		num_sensors;
271 	const struct tsens_ops	*ops;
272 	unsigned int		*hw_ids;
273 	const struct tsens_features	*feat;
274 	const struct reg_field		*fields;
275 };
276 
277 /**
278  * struct tsens_context - Registers to be saved/restored across a context loss
279  */
280 struct tsens_context {
281 	int	threshold;
282 	int	control;
283 };
284 
285 /**
286  * struct tsens_priv - private data for each instance of the tsens IP
287  * @dev: pointer to struct device
288  * @num_sensors: number of sensors enabled on this device
289  * @tm_map: pointer to TM register address space
290  * @srot_map: pointer to SROT register address space
291  * @tm_offset: deal with old device trees that don't address TM and SROT
292  *             address space separately
293  * @rf: array of regmap_fields used to store value of the field
294  * @ctx: registers to be saved and restored during suspend/resume
295  * @feat: features of the IP
296  * @fields: bitfield locations
297  * @ops: pointer to list of callbacks supported by this device
298  * @sensor: list of sensors attached to this device
299  */
300 struct tsens_priv {
301 	struct device			*dev;
302 	u32				num_sensors;
303 	struct regmap			*tm_map;
304 	struct regmap			*srot_map;
305 	u32				tm_offset;
306 	struct regmap_field		*rf[MAX_REGFIELDS];
307 	struct tsens_context		ctx;
308 	const struct tsens_features	*feat;
309 	const struct reg_field		*fields;
310 	const struct tsens_ops		*ops;
311 	struct tsens_sensor		sensor[0];
312 };
313 
314 char *qfprom_read(struct device *dev, const char *cname);
315 void compute_intercept_slope(struct tsens_priv *priv, u32 *pt1, u32 *pt2, u32 mode);
316 int init_common(struct tsens_priv *priv);
317 int get_temp_tsens_valid(struct tsens_priv *priv, int i, int *temp);
318 int get_temp_common(struct tsens_priv *priv, int i, int *temp);
319 
320 /* TSENS target */
321 extern const struct tsens_plat_data data_8960;
322 
323 /* TSENS v0.1 targets */
324 extern const struct tsens_plat_data data_8916, data_8974;
325 
326 /* TSENS v1 targets */
327 extern const struct tsens_plat_data data_tsens_v1;
328 
329 /* TSENS v2 targets */
330 extern const struct tsens_plat_data data_8996, data_tsens_v2;
331 
332 #endif /* __QCOM_TSENS_H__ */
333