root/drivers/thermal/qcom/tsens-v2.c

/* [<][>][^][v][top][bottom][index][help] */
   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (c) 2015, The Linux Foundation. All rights reserved.
   4  * Copyright (c) 2018, Linaro Limited
   5  */
   6 
   7 #include <linux/bitops.h>
   8 #include <linux/regmap.h>
   9 #include "tsens.h"
  10 
  11 /* ----- SROT ------ */
  12 #define SROT_HW_VER_OFF 0x0000
  13 #define SROT_CTRL_OFF           0x0004
  14 
  15 /* ----- TM ------ */
  16 #define TM_INT_EN_OFF                   0x0004
  17 #define TM_UPPER_LOWER_INT_STATUS_OFF   0x0008
  18 #define TM_UPPER_LOWER_INT_CLEAR_OFF    0x000c
  19 #define TM_UPPER_LOWER_INT_MASK_OFF     0x0010
  20 #define TM_CRITICAL_INT_STATUS_OFF      0x0014
  21 #define TM_CRITICAL_INT_CLEAR_OFF       0x0018
  22 #define TM_CRITICAL_INT_MASK_OFF        0x001c
  23 #define TM_Sn_UPPER_LOWER_THRESHOLD_OFF 0x0020
  24 #define TM_Sn_CRITICAL_THRESHOLD_OFF    0x0060
  25 #define TM_Sn_STATUS_OFF                0x00a0
  26 #define TM_TRDY_OFF                     0x00e4
  27 
  28 /* v2.x: 8996, 8998, sdm845 */
  29 
  30 static const struct tsens_features tsens_v2_feat = {
  31         .ver_major      = VER_2_X,
  32         .crit_int       = 1,
  33         .adc            = 0,
  34         .srot_split     = 1,
  35         .max_sensors    = 16,
  36 };
  37 
  38 static const struct reg_field tsens_v2_regfields[MAX_REGFIELDS] = {
  39         /* ----- SROT ------ */
  40         /* VERSION */
  41         [VER_MAJOR] = REG_FIELD(SROT_HW_VER_OFF, 28, 31),
  42         [VER_MINOR] = REG_FIELD(SROT_HW_VER_OFF, 16, 27),
  43         [VER_STEP]  = REG_FIELD(SROT_HW_VER_OFF,  0, 15),
  44         /* CTRL_OFF */
  45         [TSENS_EN]     = REG_FIELD(SROT_CTRL_OFF,    0,  0),
  46         [TSENS_SW_RST] = REG_FIELD(SROT_CTRL_OFF,    1,  1),
  47 
  48         /* ----- TM ------ */
  49         /* INTERRUPT ENABLE */
  50         /* v2 has separate enables for UPPER/LOWER/CRITICAL interrupts */
  51         [INT_EN]  = REG_FIELD(TM_INT_EN_OFF, 0, 2),
  52 
  53         /* Sn_STATUS */
  54         REG_FIELD_FOR_EACH_SENSOR16(LAST_TEMP,       TM_Sn_STATUS_OFF,  0,  11),
  55         REG_FIELD_FOR_EACH_SENSOR16(VALID,           TM_Sn_STATUS_OFF, 21,  21),
  56         REG_FIELD_FOR_EACH_SENSOR16(MIN_STATUS,      TM_Sn_STATUS_OFF, 16,  16),
  57         REG_FIELD_FOR_EACH_SENSOR16(LOWER_STATUS,    TM_Sn_STATUS_OFF, 17,  17),
  58         REG_FIELD_FOR_EACH_SENSOR16(UPPER_STATUS,    TM_Sn_STATUS_OFF, 18,  18),
  59         REG_FIELD_FOR_EACH_SENSOR16(CRITICAL_STATUS, TM_Sn_STATUS_OFF, 19,  19),
  60         REG_FIELD_FOR_EACH_SENSOR16(MAX_STATUS,      TM_Sn_STATUS_OFF, 20,  20),
  61 
  62         /* TRDY: 1=ready, 0=in progress */
  63         [TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0),
  64 };
  65 
  66 static const struct tsens_ops ops_generic_v2 = {
  67         .init           = init_common,
  68         .get_temp       = get_temp_tsens_valid,
  69 };
  70 
  71 const struct tsens_plat_data data_tsens_v2 = {
  72         .ops            = &ops_generic_v2,
  73         .feat           = &tsens_v2_feat,
  74         .fields = tsens_v2_regfields,
  75 };
  76 
  77 /* Kept around for backward compatibility with old msm8996.dtsi */
  78 const struct tsens_plat_data data_8996 = {
  79         .num_sensors    = 13,
  80         .ops            = &ops_generic_v2,
  81         .feat           = &tsens_v2_feat,
  82         .fields = tsens_v2_regfields,
  83 };

/* [<][>][^][v][top][bottom][index][help] */