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 21 struct tsens_priv; 22 23 enum tsens_ver { 24 VER_0_1 = 0, 25 VER_1_X, 26 VER_2_X, 27 }; 28 29 /** 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 34 * @id: Sensor ID 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 38 */ 39 struct tsens_sensor { 40 struct tsens_priv *priv; 41 struct thermal_zone_device *tzd; 42 int offset; 43 unsigned int id; 44 unsigned int hw_id; 45 int slope; 46 u32 status; 47 }; 48 49 /** 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 59 */ 60 struct tsens_ops { 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); 71 }; 72 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) 85 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) 103 104 /* reg_field IDs to use as an index into an array */ 105 enum regfield_ids { 106 /* ----- SROT ------ */ 107 /* HW_VER */ 108 VER_MAJOR = 0, 109 VER_MINOR, 110 VER_STEP, 111 /* CTRL_OFFSET */ 112 TSENS_EN = 3, 113 TSENS_SW_RST, 114 SENSOR_EN, 115 CODE_OR_TEMP, 116 117 /* ----- TM ------ */ 118 /* STATUS */ 119 LAST_TEMP_0 = 7, /* Last temperature reading */ 120 LAST_TEMP_1, 121 LAST_TEMP_2, 122 LAST_TEMP_3, 123 LAST_TEMP_4, 124 LAST_TEMP_5, 125 LAST_TEMP_6, 126 LAST_TEMP_7, 127 LAST_TEMP_8, 128 LAST_TEMP_9, 129 LAST_TEMP_10, 130 LAST_TEMP_11, 131 LAST_TEMP_12, 132 LAST_TEMP_13, 133 LAST_TEMP_14, 134 LAST_TEMP_15, 135 VALID_0 = 23, /* VALID reading or not */ 136 VALID_1, 137 VALID_2, 138 VALID_3, 139 VALID_4, 140 VALID_5, 141 VALID_6, 142 VALID_7, 143 VALID_8, 144 VALID_9, 145 VALID_10, 146 VALID_11, 147 VALID_12, 148 VALID_13, 149 VALID_14, 150 VALID_15, 151 MIN_STATUS_0, /* MIN threshold violated */ 152 MIN_STATUS_1, 153 MIN_STATUS_2, 154 MIN_STATUS_3, 155 MIN_STATUS_4, 156 MIN_STATUS_5, 157 MIN_STATUS_6, 158 MIN_STATUS_7, 159 MIN_STATUS_8, 160 MIN_STATUS_9, 161 MIN_STATUS_10, 162 MIN_STATUS_11, 163 MIN_STATUS_12, 164 MIN_STATUS_13, 165 MIN_STATUS_14, 166 MIN_STATUS_15, 167 MAX_STATUS_0, /* MAX threshold violated */ 168 MAX_STATUS_1, 169 MAX_STATUS_2, 170 MAX_STATUS_3, 171 MAX_STATUS_4, 172 MAX_STATUS_5, 173 MAX_STATUS_6, 174 MAX_STATUS_7, 175 MAX_STATUS_8, 176 MAX_STATUS_9, 177 MAX_STATUS_10, 178 MAX_STATUS_11, 179 MAX_STATUS_12, 180 MAX_STATUS_13, 181 MAX_STATUS_14, 182 MAX_STATUS_15, 183 LOWER_STATUS_0, /* LOWER threshold violated */ 184 LOWER_STATUS_1, 185 LOWER_STATUS_2, 186 LOWER_STATUS_3, 187 LOWER_STATUS_4, 188 LOWER_STATUS_5, 189 LOWER_STATUS_6, 190 LOWER_STATUS_7, 191 LOWER_STATUS_8, 192 LOWER_STATUS_9, 193 LOWER_STATUS_10, 194 LOWER_STATUS_11, 195 LOWER_STATUS_12, 196 LOWER_STATUS_13, 197 LOWER_STATUS_14, 198 LOWER_STATUS_15, 199 UPPER_STATUS_0, /* UPPER threshold violated */ 200 UPPER_STATUS_1, 201 UPPER_STATUS_2, 202 UPPER_STATUS_3, 203 UPPER_STATUS_4, 204 UPPER_STATUS_5, 205 UPPER_STATUS_6, 206 UPPER_STATUS_7, 207 UPPER_STATUS_8, 208 UPPER_STATUS_9, 209 UPPER_STATUS_10, 210 UPPER_STATUS_11, 211 UPPER_STATUS_12, 212 UPPER_STATUS_13, 213 UPPER_STATUS_14, 214 UPPER_STATUS_15, 215 CRITICAL_STATUS_0, /* CRITICAL threshold violated */ 216 CRITICAL_STATUS_1, 217 CRITICAL_STATUS_2, 218 CRITICAL_STATUS_3, 219 CRITICAL_STATUS_4, 220 CRITICAL_STATUS_5, 221 CRITICAL_STATUS_6, 222 CRITICAL_STATUS_7, 223 CRITICAL_STATUS_8, 224 CRITICAL_STATUS_9, 225 CRITICAL_STATUS_10, 226 CRITICAL_STATUS_11, 227 CRITICAL_STATUS_12, 228 CRITICAL_STATUS_13, 229 CRITICAL_STATUS_14, 230 CRITICAL_STATUS_15, 231 /* TRDY */ 232 TRDY, 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 */ 238 239 /* Keep last */ 240 MAX_REGFIELDS 241 }; 242 243 /** 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 251 */ 252 struct tsens_features { 253 unsigned int ver_major; 254 unsigned int crit_int:1; 255 unsigned int adc:1; 256 unsigned int srot_split:1; 257 unsigned int max_sensors; 258 }; 259 260 /** 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 267 */ 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; 274 }; 275 276 /** 277 * struct tsens_context - Registers to be saved/restored across a context loss 278 */ 279 struct tsens_context { 280 int threshold; 281 int control; 282 }; 283 284 /** 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 298 */ 299 struct tsens_priv { 300 struct device *dev; 301 u32 num_sensors; 302 struct regmap *tm_map; 303 struct regmap *srot_map; 304 u32 tm_offset; 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]; 311 }; 312 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); 318 bool is_sensor_enabled(struct tsens_priv *priv, u32 hw_id); 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