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