|
39 | 39 | #define SBTSI_REG_TEMP_DEC 0x10 /* RW */ |
40 | 40 | #define SBTSI_REG_TEMP_HIGH_DEC 0x13 /* RW */ |
41 | 41 | #define SBTSI_REG_TEMP_LOW_DEC 0x14 /* RW */ |
| 42 | +#define SBTSI_REG_MAX_HBM_INT 0x50 /* RO */ |
| 43 | +#define SBTSI_REG_MAX_HBM_DEC 0x54 /* RO */ |
42 | 44 |
|
43 | 45 | #define SBTSI_CONFIG_READ_ORDER_SHIFT 5 |
44 | 46 |
|
@@ -67,6 +69,12 @@ struct apml_sbtsi_device { |
67 | 69 | u8 dev_static_addr; |
68 | 70 | } __packed; |
69 | 71 |
|
| 72 | +enum sbtsi_channels { |
| 73 | + CPU_CHANNEL, |
| 74 | + HBM_CHANNEL, |
| 75 | + SBTSI_NUM_CHANNELS |
| 76 | +}; |
| 77 | + |
70 | 78 | /* |
71 | 79 | * From SB-TSI spec: CPU temperature readings and limit registers encode the |
72 | 80 | * temperature in increments of 0.125 from 0 to 255.875. The "high byte" |
@@ -118,12 +126,18 @@ static int sbtsi_read(struct device *dev, enum hwmon_sensor_types type, |
118 | 126 | return ret; |
119 | 127 |
|
120 | 128 | mutex_lock(&tsi_dev->lock); |
121 | | - if (cfg & BIT(SBTSI_CONFIG_READ_ORDER_SHIFT)) { |
122 | | - ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_DEC, &temp_dec); |
123 | | - ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_INT, &temp_int); |
124 | | - } else { |
125 | | - ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_INT, &temp_int); |
126 | | - ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_DEC, &temp_dec); |
| 129 | + if (channel == HBM_CHANNEL) { |
| 130 | + ret = regmap_read(tsi_dev->regmap, SBTSI_REG_MAX_HBM_INT, &temp_int); |
| 131 | + ret = regmap_read(tsi_dev->regmap, SBTSI_REG_MAX_HBM_DEC, &temp_dec); |
| 132 | + } |
| 133 | + else { |
| 134 | + if (cfg & BIT(SBTSI_CONFIG_READ_ORDER_SHIFT)) { |
| 135 | + ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_DEC, &temp_dec); |
| 136 | + ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_INT, &temp_int); |
| 137 | + } else { |
| 138 | + ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_INT, &temp_int); |
| 139 | + ret = regmap_read(tsi_dev->regmap, SBTSI_REG_TEMP_DEC, &temp_dec); |
| 140 | + } |
127 | 141 | } |
128 | 142 | mutex_unlock(&tsi_dev->lock); |
129 | 143 | break; |
@@ -208,7 +222,8 @@ static umode_t sbtsi_is_visible(const void *data, |
208 | 222 |
|
209 | 223 | static const struct hwmon_channel_info *sbtsi_info[] = { |
210 | 224 | HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ), |
211 | | - HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX), |
| 225 | + HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX, |
| 226 | + HWMON_T_INPUT), |
212 | 227 | NULL |
213 | 228 | }; |
214 | 229 |
|
|
0 commit comments