1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2015, The Linux Foundation. All rights reserved.
6 #ifndef __QCOM_TSENS_H__
7 #define __QCOM_TSENS_H__
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
18 #include <linux/thermal.h>
19 #include <linux/regmap.h>
30 * struct tsens_sensor - data for each sensor connected to the tsens device
31 * @priv: tsens device instance that this sensor is connected to
32 * @tzd: pointer to the thermal zone that this sensor is in
33 * @offset: offset of temperature adjustment curve
35 * @hw_id: HW ID can be used in case of platform-specific IDs
36 * @slope: slope of temperature adjustment curve
37 * @status: 8960-specific variable to track 8960 and 8660 status register offset
40 struct tsens_priv *priv;
41 struct thermal_zone_device *tzd;
50 * struct tsens_ops - operations as supported by the tsens device
51 * @init: Function to initialize the tsens device
52 * @calibrate: Function to calibrate the tsens device
53 * @get_temp: Function which returns the temp in millidegC
54 * @enable: Function to enable (clocks/power) tsens device
55 * @disable: Function to disable the tsens device
56 * @suspend: Function to suspend the tsens device
57 * @resume: Function to resume the tsens device
58 * @get_trend: Function to get the thermal/temp trend
61 /* mandatory callbacks */
62 int (*init)(struct tsens_priv *priv);
63 int (*calibrate)(struct tsens_priv *priv);
64 int (*get_temp)(struct tsens_priv *priv, int i, int *temp);
65 /* optional callbacks */
66 int (*enable)(struct tsens_priv *priv, int i);
67 void (*disable)(struct tsens_priv *priv);
68 int (*suspend)(struct tsens_priv *priv);
69 int (*resume)(struct tsens_priv *priv);
70 int (*get_trend)(struct tsens_priv *priv, int i, enum thermal_trend *trend);
73 #define REG_FIELD_FOR_EACH_SENSOR11(_name, _offset, _startbit, _stopbit) \
74 [_name##_##0] = REG_FIELD(_offset, _startbit, _stopbit), \
75 [_name##_##1] = REG_FIELD(_offset + 4, _startbit, _stopbit), \
76 [_name##_##2] = REG_FIELD(_offset + 8, _startbit, _stopbit), \
77 [_name##_##3] = REG_FIELD(_offset + 12, _startbit, _stopbit), \
78 [_name##_##4] = REG_FIELD(_offset + 16, _startbit, _stopbit), \
79 [_name##_##5] = REG_FIELD(_offset + 20, _startbit, _stopbit), \
80 [_name##_##6] = REG_FIELD(_offset + 24, _startbit, _stopbit), \
81 [_name##_##7] = REG_FIELD(_offset + 28, _startbit, _stopbit), \
82 [_name##_##8] = REG_FIELD(_offset + 32, _startbit, _stopbit), \
83 [_name##_##9] = REG_FIELD(_offset + 36, _startbit, _stopbit), \
84 [_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit)
86 #define REG_FIELD_FOR_EACH_SENSOR16(_name, _offset, _startbit, _stopbit) \
87 [_name##_##0] = REG_FIELD(_offset, _startbit, _stopbit), \
88 [_name##_##1] = REG_FIELD(_offset + 4, _startbit, _stopbit), \
89 [_name##_##2] = REG_FIELD(_offset + 8, _startbit, _stopbit), \
90 [_name##_##3] = REG_FIELD(_offset + 12, _startbit, _stopbit), \
91 [_name##_##4] = REG_FIELD(_offset + 16, _startbit, _stopbit), \
92 [_name##_##5] = REG_FIELD(_offset + 20, _startbit, _stopbit), \
93 [_name##_##6] = REG_FIELD(_offset + 24, _startbit, _stopbit), \
94 [_name##_##7] = REG_FIELD(_offset + 28, _startbit, _stopbit), \
95 [_name##_##8] = REG_FIELD(_offset + 32, _startbit, _stopbit), \
96 [_name##_##9] = REG_FIELD(_offset + 36, _startbit, _stopbit), \
97 [_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit), \
98 [_name##_##11] = REG_FIELD(_offset + 44, _startbit, _stopbit), \
99 [_name##_##12] = REG_FIELD(_offset + 48, _startbit, _stopbit), \
100 [_name##_##13] = REG_FIELD(_offset + 52, _startbit, _stopbit), \
101 [_name##_##14] = REG_FIELD(_offset + 56, _startbit, _stopbit), \
102 [_name##_##15] = REG_FIELD(_offset + 60, _startbit, _stopbit)
104 /* reg_field IDs to use as an index into an array */
106 /* ----- SROT ------ */
117 /* ----- TM ------ */
119 LAST_TEMP_0 = 7, /* Last temperature reading */
135 VALID_0 = 23, /* VALID reading or not */
151 MIN_STATUS_0, /* MIN threshold violated */
167 MAX_STATUS_0, /* MAX threshold violated */
183 LOWER_STATUS_0, /* LOWER threshold violated */
199 UPPER_STATUS_0, /* UPPER threshold violated */
215 CRITICAL_STATUS_0, /* CRITICAL threshold violated */
233 /* INTERRUPT ENABLE */
234 INT_EN, /* Pre-V1, V1.x */
235 LOW_INT_EN, /* V2.x */
236 UP_INT_EN, /* V2.x */
237 CRIT_INT_EN, /* V2.x */
244 * struct tsens_features - Features supported by the IP
245 * @ver_major: Major number of IP version
246 * @crit_int: does the IP support critical interrupts?
247 * @adc: do the sensors only output adc code (instead of temperature)?
248 * @srot_split: does the IP neatly splits the register space into SROT and TM,
249 * with SROT only being available to secure boot firmware?
250 * @max_sensors: maximum sensors supported by this version of the IP
252 struct tsens_features {
253 unsigned int ver_major;
254 unsigned int crit_int:1;
256 unsigned int srot_split:1;
257 unsigned int max_sensors;
261 * struct tsens_plat_data - tsens compile-time platform data
262 * @num_sensors: Number of sensors supported by platform
263 * @ops: operations the tsens instance supports
264 * @hw_ids: Subset of sensors ids supported by platform, if not the first n
265 * @feat: features of the IP
266 * @fields: bitfield locations
268 struct tsens_plat_data {
269 const u32 num_sensors;
270 const struct tsens_ops *ops;
271 unsigned int *hw_ids;
272 const struct tsens_features *feat;
273 const struct reg_field *fields;
277 * struct tsens_context - Registers to be saved/restored across a context loss
279 struct tsens_context {
285 * struct tsens_priv - private data for each instance of the tsens IP
286 * @dev: pointer to struct device
287 * @num_sensors: number of sensors enabled on this device
288 * @tm_map: pointer to TM register address space
289 * @srot_map: pointer to SROT register address space
290 * @tm_offset: deal with old device trees that don't address TM and SROT
291 * address space separately
292 * @rf: array of regmap_fields used to store value of the field
293 * @ctx: registers to be saved and restored during suspend/resume
294 * @feat: features of the IP
295 * @fields: bitfield locations
296 * @ops: pointer to list of callbacks supported by this device
297 * @sensor: list of sensors attached to this device
302 struct regmap *tm_map;
303 struct regmap *srot_map;
305 struct regmap_field *rf[MAX_REGFIELDS];
306 struct tsens_context ctx;
307 const struct tsens_features *feat;
308 const struct reg_field *fields;
309 const struct tsens_ops *ops;
310 struct tsens_sensor sensor[0];
313 char *qfprom_read(struct device *dev, const char *cname);
314 void compute_intercept_slope(struct tsens_priv *priv, u32 *pt1, u32 *pt2, u32 mode);
315 int init_common(struct tsens_priv *priv);
316 int get_temp_tsens_valid(struct tsens_priv *priv, int i, int *temp);
317 int get_temp_common(struct tsens_priv *priv, int i, int *temp);
320 extern const struct tsens_plat_data data_8960;
322 /* TSENS v0.1 targets */
323 extern const struct tsens_plat_data data_8916, data_8974;
325 /* TSENS v1 targets */
326 extern const struct tsens_plat_data data_tsens_v1;
328 /* TSENS v2 targets */
329 extern const struct tsens_plat_data data_8996, data_tsens_v2;
331 #endif /* __QCOM_TSENS_H__ */