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 NO_PT_CALIB 0x0 10 #define ONE_PT_CALIB 0x1 11 #define ONE_PT_CALIB2 0x2 12 #define TWO_PT_CALIB 0x3 13 #define ONE_PT_CALIB2_NO_OFFSET 0x6 14 #define TWO_PT_CALIB_NO_OFFSET 0x7 15 #define CAL_DEGC_PT1 30 16 #define CAL_DEGC_PT2 120 17 #define SLOPE_FACTOR 1000 18 #define SLOPE_DEFAULT 3200 19 #define TIMEOUT_US 100 20 #define THRESHOLD_MAX_ADC_CODE 0x3ff 21 #define THRESHOLD_MIN_ADC_CODE 0x0 22 23 #define MAX_SENSORS 16 24 25 #include <linux/interrupt.h> 26 #include <linux/thermal.h> 27 #include <linux/regmap.h> 28 #include <linux/slab.h> 29 30 struct tsens_priv; 31 32 /* IP version numbers in ascending order */ 33 enum tsens_ver { 34 VER_0 = 0, 35 VER_0_1, 36 VER_1_X, 37 VER_2_X, 38 }; 39 40 enum tsens_irq_type { 41 LOWER, 42 UPPER, 43 CRITICAL, 44 }; 45 46 /** 47 * struct tsens_sensor - data for each sensor connected to the tsens device 48 * @priv: tsens device instance that this sensor is connected to 49 * @tzd: pointer to the thermal zone that this sensor is in 50 * @offset: offset of temperature adjustment curve 51 * @hw_id: HW ID can be used in case of platform-specific IDs 52 * @slope: slope of temperature adjustment curve 53 * @status: 8960-specific variable to track 8960 and 8660 status register offset 54 */ 55 struct tsens_sensor { 56 struct tsens_priv *priv; 57 struct thermal_zone_device *tzd; 58 int offset; 59 unsigned int hw_id; 60 int slope; 61 u32 status; 62 int p1_calib_offset; 63 int p2_calib_offset; 64 }; 65 66 /** 67 * struct tsens_ops - operations as supported by the tsens device 68 * @init: Function to initialize the tsens device 69 * @calibrate: Function to calibrate the tsens device 70 * @get_temp: Function which returns the temp in millidegC 71 * @enable: Function to enable (clocks/power) tsens device 72 * @disable: Function to disable the tsens device 73 * @suspend: Function to suspend the tsens device 74 * @resume: Function to resume the tsens device 75 */ 76 struct tsens_ops { 77 /* mandatory callbacks */ 78 int (*init)(struct tsens_priv *priv); 79 int (*calibrate)(struct tsens_priv *priv); 80 int (*get_temp)(const struct tsens_sensor *s, int *temp); 81 /* optional callbacks */ 82 int (*enable)(struct tsens_priv *priv, int i); 83 void (*disable)(struct tsens_priv *priv); 84 int (*suspend)(struct tsens_priv *priv); 85 int (*resume)(struct tsens_priv *priv); 86 }; 87 88 #define REG_FIELD_FOR_EACH_SENSOR11(_name, _offset, _startbit, _stopbit) \ 89 [_name##_##0] = REG_FIELD(_offset, _startbit, _stopbit), \ 90 [_name##_##1] = REG_FIELD(_offset + 4, _startbit, _stopbit), \ 91 [_name##_##2] = REG_FIELD(_offset + 8, _startbit, _stopbit), \ 92 [_name##_##3] = REG_FIELD(_offset + 12, _startbit, _stopbit), \ 93 [_name##_##4] = REG_FIELD(_offset + 16, _startbit, _stopbit), \ 94 [_name##_##5] = REG_FIELD(_offset + 20, _startbit, _stopbit), \ 95 [_name##_##6] = REG_FIELD(_offset + 24, _startbit, _stopbit), \ 96 [_name##_##7] = REG_FIELD(_offset + 28, _startbit, _stopbit), \ 97 [_name##_##8] = REG_FIELD(_offset + 32, _startbit, _stopbit), \ 98 [_name##_##9] = REG_FIELD(_offset + 36, _startbit, _stopbit), \ 99 [_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit) 100 101 #define REG_FIELD_FOR_EACH_SENSOR16(_name, _offset, _startbit, _stopbit) \ 102 [_name##_##0] = REG_FIELD(_offset, _startbit, _stopbit), \ 103 [_name##_##1] = REG_FIELD(_offset + 4, _startbit, _stopbit), \ 104 [_name##_##2] = REG_FIELD(_offset + 8, _startbit, _stopbit), \ 105 [_name##_##3] = REG_FIELD(_offset + 12, _startbit, _stopbit), \ 106 [_name##_##4] = REG_FIELD(_offset + 16, _startbit, _stopbit), \ 107 [_name##_##5] = REG_FIELD(_offset + 20, _startbit, _stopbit), \ 108 [_name##_##6] = REG_FIELD(_offset + 24, _startbit, _stopbit), \ 109 [_name##_##7] = REG_FIELD(_offset + 28, _startbit, _stopbit), \ 110 [_name##_##8] = REG_FIELD(_offset + 32, _startbit, _stopbit), \ 111 [_name##_##9] = REG_FIELD(_offset + 36, _startbit, _stopbit), \ 112 [_name##_##10] = REG_FIELD(_offset + 40, _startbit, _stopbit), \ 113 [_name##_##11] = REG_FIELD(_offset + 44, _startbit, _stopbit), \ 114 [_name##_##12] = REG_FIELD(_offset + 48, _startbit, _stopbit), \ 115 [_name##_##13] = REG_FIELD(_offset + 52, _startbit, _stopbit), \ 116 [_name##_##14] = REG_FIELD(_offset + 56, _startbit, _stopbit), \ 117 [_name##_##15] = REG_FIELD(_offset + 60, _startbit, _stopbit) 118 119 #define REG_FIELD_SPLIT_BITS_0_15(_name, _offset) \ 120 [_name##_##0] = REG_FIELD(_offset, 0, 0), \ 121 [_name##_##1] = REG_FIELD(_offset, 1, 1), \ 122 [_name##_##2] = REG_FIELD(_offset, 2, 2), \ 123 [_name##_##3] = REG_FIELD(_offset, 3, 3), \ 124 [_name##_##4] = REG_FIELD(_offset, 4, 4), \ 125 [_name##_##5] = REG_FIELD(_offset, 5, 5), \ 126 [_name##_##6] = REG_FIELD(_offset, 6, 6), \ 127 [_name##_##7] = REG_FIELD(_offset, 7, 7), \ 128 [_name##_##8] = REG_FIELD(_offset, 8, 8), \ 129 [_name##_##9] = REG_FIELD(_offset, 9, 9), \ 130 [_name##_##10] = REG_FIELD(_offset, 10, 10), \ 131 [_name##_##11] = REG_FIELD(_offset, 11, 11), \ 132 [_name##_##12] = REG_FIELD(_offset, 12, 12), \ 133 [_name##_##13] = REG_FIELD(_offset, 13, 13), \ 134 [_name##_##14] = REG_FIELD(_offset, 14, 14), \ 135 [_name##_##15] = REG_FIELD(_offset, 15, 15) 136 137 #define REG_FIELD_SPLIT_BITS_16_31(_name, _offset) \ 138 [_name##_##0] = REG_FIELD(_offset, 16, 16), \ 139 [_name##_##1] = REG_FIELD(_offset, 17, 17), \ 140 [_name##_##2] = REG_FIELD(_offset, 18, 18), \ 141 [_name##_##3] = REG_FIELD(_offset, 19, 19), \ 142 [_name##_##4] = REG_FIELD(_offset, 20, 20), \ 143 [_name##_##5] = REG_FIELD(_offset, 21, 21), \ 144 [_name##_##6] = REG_FIELD(_offset, 22, 22), \ 145 [_name##_##7] = REG_FIELD(_offset, 23, 23), \ 146 [_name##_##8] = REG_FIELD(_offset, 24, 24), \ 147 [_name##_##9] = REG_FIELD(_offset, 25, 25), \ 148 [_name##_##10] = REG_FIELD(_offset, 26, 26), \ 149 [_name##_##11] = REG_FIELD(_offset, 27, 27), \ 150 [_name##_##12] = REG_FIELD(_offset, 28, 28), \ 151 [_name##_##13] = REG_FIELD(_offset, 29, 29), \ 152 [_name##_##14] = REG_FIELD(_offset, 30, 30), \ 153 [_name##_##15] = REG_FIELD(_offset, 31, 31) 154 155 /* 156 * reg_field IDs to use as an index into an array 157 * If you change the order of the entries, check the devm_regmap_field_alloc() 158 * calls in init_common() 159 */ 160 enum regfield_ids { 161 /* ----- SROT ------ */ 162 /* HW_VER */ 163 VER_MAJOR, 164 VER_MINOR, 165 VER_STEP, 166 /* CTRL_OFFSET */ 167 TSENS_EN, 168 TSENS_SW_RST, 169 SENSOR_EN, 170 CODE_OR_TEMP, 171 172 /* ----- TM ------ */ 173 /* TRDY */ 174 TRDY, 175 /* INTERRUPT ENABLE */ 176 INT_EN, /* v2+ has separate enables for crit, upper and lower irq */ 177 /* STATUS */ 178 LAST_TEMP_0, /* Last temperature reading */ 179 LAST_TEMP_1, 180 LAST_TEMP_2, 181 LAST_TEMP_3, 182 LAST_TEMP_4, 183 LAST_TEMP_5, 184 LAST_TEMP_6, 185 LAST_TEMP_7, 186 LAST_TEMP_8, 187 LAST_TEMP_9, 188 LAST_TEMP_10, 189 LAST_TEMP_11, 190 LAST_TEMP_12, 191 LAST_TEMP_13, 192 LAST_TEMP_14, 193 LAST_TEMP_15, 194 VALID_0, /* VALID reading or not */ 195 VALID_1, 196 VALID_2, 197 VALID_3, 198 VALID_4, 199 VALID_5, 200 VALID_6, 201 VALID_7, 202 VALID_8, 203 VALID_9, 204 VALID_10, 205 VALID_11, 206 VALID_12, 207 VALID_13, 208 VALID_14, 209 VALID_15, 210 LOWER_STATUS_0, /* LOWER threshold violated */ 211 LOWER_STATUS_1, 212 LOWER_STATUS_2, 213 LOWER_STATUS_3, 214 LOWER_STATUS_4, 215 LOWER_STATUS_5, 216 LOWER_STATUS_6, 217 LOWER_STATUS_7, 218 LOWER_STATUS_8, 219 LOWER_STATUS_9, 220 LOWER_STATUS_10, 221 LOWER_STATUS_11, 222 LOWER_STATUS_12, 223 LOWER_STATUS_13, 224 LOWER_STATUS_14, 225 LOWER_STATUS_15, 226 LOW_INT_STATUS_0, /* LOWER interrupt status */ 227 LOW_INT_STATUS_1, 228 LOW_INT_STATUS_2, 229 LOW_INT_STATUS_3, 230 LOW_INT_STATUS_4, 231 LOW_INT_STATUS_5, 232 LOW_INT_STATUS_6, 233 LOW_INT_STATUS_7, 234 LOW_INT_STATUS_8, 235 LOW_INT_STATUS_9, 236 LOW_INT_STATUS_10, 237 LOW_INT_STATUS_11, 238 LOW_INT_STATUS_12, 239 LOW_INT_STATUS_13, 240 LOW_INT_STATUS_14, 241 LOW_INT_STATUS_15, 242 LOW_INT_CLEAR_0, /* LOWER interrupt clear */ 243 LOW_INT_CLEAR_1, 244 LOW_INT_CLEAR_2, 245 LOW_INT_CLEAR_3, 246 LOW_INT_CLEAR_4, 247 LOW_INT_CLEAR_5, 248 LOW_INT_CLEAR_6, 249 LOW_INT_CLEAR_7, 250 LOW_INT_CLEAR_8, 251 LOW_INT_CLEAR_9, 252 LOW_INT_CLEAR_10, 253 LOW_INT_CLEAR_11, 254 LOW_INT_CLEAR_12, 255 LOW_INT_CLEAR_13, 256 LOW_INT_CLEAR_14, 257 LOW_INT_CLEAR_15, 258 LOW_INT_MASK_0, /* LOWER interrupt mask */ 259 LOW_INT_MASK_1, 260 LOW_INT_MASK_2, 261 LOW_INT_MASK_3, 262 LOW_INT_MASK_4, 263 LOW_INT_MASK_5, 264 LOW_INT_MASK_6, 265 LOW_INT_MASK_7, 266 LOW_INT_MASK_8, 267 LOW_INT_MASK_9, 268 LOW_INT_MASK_10, 269 LOW_INT_MASK_11, 270 LOW_INT_MASK_12, 271 LOW_INT_MASK_13, 272 LOW_INT_MASK_14, 273 LOW_INT_MASK_15, 274 LOW_THRESH_0, /* LOWER threshold values */ 275 LOW_THRESH_1, 276 LOW_THRESH_2, 277 LOW_THRESH_3, 278 LOW_THRESH_4, 279 LOW_THRESH_5, 280 LOW_THRESH_6, 281 LOW_THRESH_7, 282 LOW_THRESH_8, 283 LOW_THRESH_9, 284 LOW_THRESH_10, 285 LOW_THRESH_11, 286 LOW_THRESH_12, 287 LOW_THRESH_13, 288 LOW_THRESH_14, 289 LOW_THRESH_15, 290 UPPER_STATUS_0, /* UPPER threshold violated */ 291 UPPER_STATUS_1, 292 UPPER_STATUS_2, 293 UPPER_STATUS_3, 294 UPPER_STATUS_4, 295 UPPER_STATUS_5, 296 UPPER_STATUS_6, 297 UPPER_STATUS_7, 298 UPPER_STATUS_8, 299 UPPER_STATUS_9, 300 UPPER_STATUS_10, 301 UPPER_STATUS_11, 302 UPPER_STATUS_12, 303 UPPER_STATUS_13, 304 UPPER_STATUS_14, 305 UPPER_STATUS_15, 306 UP_INT_STATUS_0, /* UPPER interrupt status */ 307 UP_INT_STATUS_1, 308 UP_INT_STATUS_2, 309 UP_INT_STATUS_3, 310 UP_INT_STATUS_4, 311 UP_INT_STATUS_5, 312 UP_INT_STATUS_6, 313 UP_INT_STATUS_7, 314 UP_INT_STATUS_8, 315 UP_INT_STATUS_9, 316 UP_INT_STATUS_10, 317 UP_INT_STATUS_11, 318 UP_INT_STATUS_12, 319 UP_INT_STATUS_13, 320 UP_INT_STATUS_14, 321 UP_INT_STATUS_15, 322 UP_INT_CLEAR_0, /* UPPER interrupt clear */ 323 UP_INT_CLEAR_1, 324 UP_INT_CLEAR_2, 325 UP_INT_CLEAR_3, 326 UP_INT_CLEAR_4, 327 UP_INT_CLEAR_5, 328 UP_INT_CLEAR_6, 329 UP_INT_CLEAR_7, 330 UP_INT_CLEAR_8, 331 UP_INT_CLEAR_9, 332 UP_INT_CLEAR_10, 333 UP_INT_CLEAR_11, 334 UP_INT_CLEAR_12, 335 UP_INT_CLEAR_13, 336 UP_INT_CLEAR_14, 337 UP_INT_CLEAR_15, 338 UP_INT_MASK_0, /* UPPER interrupt mask */ 339 UP_INT_MASK_1, 340 UP_INT_MASK_2, 341 UP_INT_MASK_3, 342 UP_INT_MASK_4, 343 UP_INT_MASK_5, 344 UP_INT_MASK_6, 345 UP_INT_MASK_7, 346 UP_INT_MASK_8, 347 UP_INT_MASK_9, 348 UP_INT_MASK_10, 349 UP_INT_MASK_11, 350 UP_INT_MASK_12, 351 UP_INT_MASK_13, 352 UP_INT_MASK_14, 353 UP_INT_MASK_15, 354 UP_THRESH_0, /* UPPER threshold values */ 355 UP_THRESH_1, 356 UP_THRESH_2, 357 UP_THRESH_3, 358 UP_THRESH_4, 359 UP_THRESH_5, 360 UP_THRESH_6, 361 UP_THRESH_7, 362 UP_THRESH_8, 363 UP_THRESH_9, 364 UP_THRESH_10, 365 UP_THRESH_11, 366 UP_THRESH_12, 367 UP_THRESH_13, 368 UP_THRESH_14, 369 UP_THRESH_15, 370 CRITICAL_STATUS_0, /* CRITICAL threshold violated */ 371 CRITICAL_STATUS_1, 372 CRITICAL_STATUS_2, 373 CRITICAL_STATUS_3, 374 CRITICAL_STATUS_4, 375 CRITICAL_STATUS_5, 376 CRITICAL_STATUS_6, 377 CRITICAL_STATUS_7, 378 CRITICAL_STATUS_8, 379 CRITICAL_STATUS_9, 380 CRITICAL_STATUS_10, 381 CRITICAL_STATUS_11, 382 CRITICAL_STATUS_12, 383 CRITICAL_STATUS_13, 384 CRITICAL_STATUS_14, 385 CRITICAL_STATUS_15, 386 CRIT_INT_STATUS_0, /* CRITICAL interrupt status */ 387 CRIT_INT_STATUS_1, 388 CRIT_INT_STATUS_2, 389 CRIT_INT_STATUS_3, 390 CRIT_INT_STATUS_4, 391 CRIT_INT_STATUS_5, 392 CRIT_INT_STATUS_6, 393 CRIT_INT_STATUS_7, 394 CRIT_INT_STATUS_8, 395 CRIT_INT_STATUS_9, 396 CRIT_INT_STATUS_10, 397 CRIT_INT_STATUS_11, 398 CRIT_INT_STATUS_12, 399 CRIT_INT_STATUS_13, 400 CRIT_INT_STATUS_14, 401 CRIT_INT_STATUS_15, 402 CRIT_INT_CLEAR_0, /* CRITICAL interrupt clear */ 403 CRIT_INT_CLEAR_1, 404 CRIT_INT_CLEAR_2, 405 CRIT_INT_CLEAR_3, 406 CRIT_INT_CLEAR_4, 407 CRIT_INT_CLEAR_5, 408 CRIT_INT_CLEAR_6, 409 CRIT_INT_CLEAR_7, 410 CRIT_INT_CLEAR_8, 411 CRIT_INT_CLEAR_9, 412 CRIT_INT_CLEAR_10, 413 CRIT_INT_CLEAR_11, 414 CRIT_INT_CLEAR_12, 415 CRIT_INT_CLEAR_13, 416 CRIT_INT_CLEAR_14, 417 CRIT_INT_CLEAR_15, 418 CRIT_INT_MASK_0, /* CRITICAL interrupt mask */ 419 CRIT_INT_MASK_1, 420 CRIT_INT_MASK_2, 421 CRIT_INT_MASK_3, 422 CRIT_INT_MASK_4, 423 CRIT_INT_MASK_5, 424 CRIT_INT_MASK_6, 425 CRIT_INT_MASK_7, 426 CRIT_INT_MASK_8, 427 CRIT_INT_MASK_9, 428 CRIT_INT_MASK_10, 429 CRIT_INT_MASK_11, 430 CRIT_INT_MASK_12, 431 CRIT_INT_MASK_13, 432 CRIT_INT_MASK_14, 433 CRIT_INT_MASK_15, 434 CRIT_THRESH_0, /* CRITICAL threshold values */ 435 CRIT_THRESH_1, 436 CRIT_THRESH_2, 437 CRIT_THRESH_3, 438 CRIT_THRESH_4, 439 CRIT_THRESH_5, 440 CRIT_THRESH_6, 441 CRIT_THRESH_7, 442 CRIT_THRESH_8, 443 CRIT_THRESH_9, 444 CRIT_THRESH_10, 445 CRIT_THRESH_11, 446 CRIT_THRESH_12, 447 CRIT_THRESH_13, 448 CRIT_THRESH_14, 449 CRIT_THRESH_15, 450 451 /* WATCHDOG */ 452 WDOG_BARK_STATUS, 453 WDOG_BARK_CLEAR, 454 WDOG_BARK_MASK, 455 WDOG_BARK_COUNT, 456 457 /* CYCLE COMPLETION MONITOR */ 458 CC_MON_STATUS, 459 CC_MON_CLEAR, 460 CC_MON_MASK, 461 462 MIN_STATUS_0, /* MIN threshold violated */ 463 MIN_STATUS_1, 464 MIN_STATUS_2, 465 MIN_STATUS_3, 466 MIN_STATUS_4, 467 MIN_STATUS_5, 468 MIN_STATUS_6, 469 MIN_STATUS_7, 470 MIN_STATUS_8, 471 MIN_STATUS_9, 472 MIN_STATUS_10, 473 MIN_STATUS_11, 474 MIN_STATUS_12, 475 MIN_STATUS_13, 476 MIN_STATUS_14, 477 MIN_STATUS_15, 478 MAX_STATUS_0, /* MAX threshold violated */ 479 MAX_STATUS_1, 480 MAX_STATUS_2, 481 MAX_STATUS_3, 482 MAX_STATUS_4, 483 MAX_STATUS_5, 484 MAX_STATUS_6, 485 MAX_STATUS_7, 486 MAX_STATUS_8, 487 MAX_STATUS_9, 488 MAX_STATUS_10, 489 MAX_STATUS_11, 490 MAX_STATUS_12, 491 MAX_STATUS_13, 492 MAX_STATUS_14, 493 MAX_STATUS_15, 494 495 /* Keep last */ 496 MAX_REGFIELDS 497 }; 498 499 /** 500 * struct tsens_features - Features supported by the IP 501 * @ver_major: Major number of IP version 502 * @crit_int: does the IP support critical interrupts? 503 * @combo_int: does the IP use one IRQ for up, low and critical thresholds? 504 * @adc: do the sensors only output adc code (instead of temperature)? 505 * @srot_split: does the IP neatly splits the register space into SROT and TM, 506 * with SROT only being available to secure boot firmware? 507 * @has_watchdog: does this IP support watchdog functionality? 508 * @max_sensors: maximum sensors supported by this version of the IP 509 * @trip_min_temp: minimum trip temperature supported by this version of the IP 510 * @trip_max_temp: maximum trip temperature supported by this version of the IP 511 */ 512 struct tsens_features { 513 unsigned int ver_major; 514 unsigned int crit_int:1; 515 unsigned int combo_int:1; 516 unsigned int adc:1; 517 unsigned int srot_split:1; 518 unsigned int has_watchdog:1; 519 unsigned int max_sensors; 520 int trip_min_temp; 521 int trip_max_temp; 522 }; 523 524 /** 525 * struct tsens_plat_data - tsens compile-time platform data 526 * @num_sensors: Number of sensors supported by platform 527 * @ops: operations the tsens instance supports 528 * @hw_ids: Subset of sensors ids supported by platform, if not the first n 529 * @feat: features of the IP 530 * @fields: bitfield locations 531 */ 532 struct tsens_plat_data { 533 const u32 num_sensors; 534 const struct tsens_ops *ops; 535 unsigned int *hw_ids; 536 struct tsens_features *feat; 537 const struct reg_field *fields; 538 }; 539 540 /** 541 * struct tsens_context - Registers to be saved/restored across a context loss 542 * @threshold: Threshold register value 543 * @control: Control register value 544 */ 545 struct tsens_context { 546 int threshold; 547 int control; 548 }; 549 550 /** 551 * struct tsens_priv - private data for each instance of the tsens IP 552 * @dev: pointer to struct device 553 * @num_sensors: number of sensors enabled on this device 554 * @tm_map: pointer to TM register address space 555 * @srot_map: pointer to SROT register address space 556 * @tm_offset: deal with old device trees that don't address TM and SROT 557 * address space separately 558 * @ul_lock: lock while processing upper/lower threshold interrupts 559 * @crit_lock: lock while processing critical threshold interrupts 560 * @rf: array of regmap_fields used to store value of the field 561 * @ctx: registers to be saved and restored during suspend/resume 562 * @feat: features of the IP 563 * @fields: bitfield locations 564 * @ops: pointer to list of callbacks supported by this device 565 * @debug_root: pointer to debugfs dentry for all tsens 566 * @debug: pointer to debugfs dentry for tsens controller 567 * @sensor: list of sensors attached to this device 568 */ 569 struct tsens_priv { 570 struct device *dev; 571 u32 num_sensors; 572 struct regmap *tm_map; 573 struct regmap *srot_map; 574 u32 tm_offset; 575 576 /* lock for upper/lower threshold interrupts */ 577 spinlock_t ul_lock; 578 579 struct regmap_field *rf[MAX_REGFIELDS]; 580 struct tsens_context ctx; 581 struct tsens_features *feat; 582 const struct reg_field *fields; 583 const struct tsens_ops *ops; 584 585 struct dentry *debug_root; 586 struct dentry *debug; 587 588 struct tsens_sensor sensor[] __counted_by(num_sensors); 589 }; 590 591 /** 592 * struct tsens_single_value - internal representation of a single field inside nvmem calibration data 593 * @idx: index into the u32 data array 594 * @shift: the shift of the first bit in the value 595 * @blob: index of the data blob to use for this cell 596 */ 597 struct tsens_single_value { 598 u8 idx; 599 u8 shift; 600 u8 blob; 601 }; 602 603 /** 604 * struct tsens_legacy_calibration_format - description of calibration data used when parsing the legacy nvmem blob 605 * @base_len: the length of the base fields inside calibration data 606 * @base_shift: the shift to be applied to base data 607 * @sp_len: the length of the sN_pM fields inside calibration data 608 * @mode: descriptor of the calibration mode field 609 * @invalid: descriptor of the calibration mode invalid field 610 * @base: descriptors of the base0 and base1 fields 611 * @sp: descriptors of the sN_pM fields 612 */ 613 struct tsens_legacy_calibration_format { 614 unsigned int base_len; 615 unsigned int base_shift; 616 unsigned int sp_len; 617 /* just two bits */ 618 struct tsens_single_value mode; 619 /* on all platforms except 8974 invalid is the third bit of what downstream calls 'mode' */ 620 struct tsens_single_value invalid; 621 struct tsens_single_value base[2]; 622 struct tsens_single_value sp[][2]; 623 }; 624 625 char *qfprom_read(struct device *dev, const char *cname); 626 int tsens_read_calibration_legacy(struct tsens_priv *priv, 627 const struct tsens_legacy_calibration_format *format, 628 u32 *p1, u32 *p2, 629 u32 *cdata, u32 *csel); 630 int tsens_read_calibration(struct tsens_priv *priv, int shift, u32 *p1, u32 *p2, bool backup); 631 int tsens_calibrate_nvmem(struct tsens_priv *priv, int shift); 632 int tsens_calibrate_common(struct tsens_priv *priv); 633 void compute_intercept_slope(struct tsens_priv *priv, u32 *pt1, u32 *pt2, u32 mode); 634 int init_common(struct tsens_priv *priv); 635 int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp); 636 int get_temp_common(const struct tsens_sensor *s, int *temp); 637 638 /* TSENS target */ 639 extern struct tsens_plat_data data_8960; 640 641 /* TSENS v0.1 targets */ 642 extern struct tsens_plat_data data_8226, data_8909, data_8916, data_8939, data_8974, data_9607; 643 644 /* TSENS v1 targets */ 645 extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956; 646 647 /* TSENS v2 targets */ 648 extern struct tsens_plat_data data_8996, data_ipq8074, data_tsens_v2; 649 650 #endif /* __QCOM_TSENS_H__ */ 651