|
@@ -66,23 +66,6 @@ MODULE_PARM_DESC(reset, "Set to 1 to reset chip, not recommended");
|
|
|
#define W83795_REG_FANIN_CTRL2 0x07
|
|
|
#define W83795_REG_VMIGB_CTRL 0x08
|
|
|
|
|
|
-#define TEMP_CTRL_DISABLE 0
|
|
|
-#define TEMP_CTRL_TD 1
|
|
|
-#define TEMP_CTRL_VSEN 2
|
|
|
-#define TEMP_CTRL_TR 3
|
|
|
-#define TEMP_CTRL_SHIFT 4
|
|
|
-#define TEMP_CTRL_HASIN_SHIFT 5
|
|
|
-/* temp mode may effect VSEN17-12 (in20-15) */
|
|
|
-static const u16 W83795_REG_TEMP_CTRL[][6] = {
|
|
|
- /* Disable, TD, VSEN, TR, register shift value, has_in shift num */
|
|
|
- {0x00, 0x01, 0x02, 0x03, 0, 17}, /* TR1 */
|
|
|
- {0x00, 0x04, 0x08, 0x0C, 2, 18}, /* TR2 */
|
|
|
- {0x00, 0x10, 0x20, 0x30, 4, 19}, /* TR3 */
|
|
|
- {0x00, 0x40, 0x80, 0xC0, 6, 20}, /* TR4 */
|
|
|
- {0x00, 0x00, 0x02, 0x03, 0, 15}, /* TR5 */
|
|
|
- {0x00, 0x00, 0x08, 0x0C, 2, 16}, /* TR6 */
|
|
|
-};
|
|
|
-
|
|
|
#define TEMP_READ 0
|
|
|
#define TEMP_CRIT 1
|
|
|
#define TEMP_CRIT_HYST 2
|
|
@@ -359,7 +342,7 @@ struct w83795_data {
|
|
|
u8 has_temp; /* Enable monitor temp6-1 or not */
|
|
|
s8 temp[6][5]; /* current, crit, crit_hyst, warn, warn_hyst */
|
|
|
u8 temp_read_vrlsb[6];
|
|
|
- u8 temp_mode; /* bit 0: TR mode, bit 1: TD mode */
|
|
|
+ u8 temp_mode; /* Bit vector, 0 = TR, 1 = TD */
|
|
|
u8 temp_src[3]; /* Register value */
|
|
|
|
|
|
u8 enable_dts; /* Enable PECI and SB-TSI,
|
|
@@ -509,13 +492,6 @@ static struct w83795_data *w83795_update_device(struct device *dev)
|
|
|
|
|
|
/* Update temperature */
|
|
|
for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
|
|
|
- /* even stop monitor, register still keep value, just read out
|
|
|
- * it */
|
|
|
- if (!(data->has_temp & (1 << i))) {
|
|
|
- data->temp[i][TEMP_READ] = 0;
|
|
|
- data->temp_read_vrlsb[i] = 0;
|
|
|
- continue;
|
|
|
- }
|
|
|
data->temp[i][TEMP_READ] =
|
|
|
w83795_read(client, W83795_REG_TEMP[i][TEMP_READ]);
|
|
|
data->temp_read_vrlsb[i] =
|
|
@@ -1163,22 +1139,12 @@ show_dts_mode(struct device *dev, struct device_attribute *attr, char *buf)
|
|
|
{
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct w83795_data *data = i2c_get_clientdata(client);
|
|
|
- struct sensor_device_attribute_2 *sensor_attr =
|
|
|
- to_sensor_dev_attr_2(attr);
|
|
|
- int index = sensor_attr->index;
|
|
|
- u8 tmp;
|
|
|
+ int tmp;
|
|
|
|
|
|
- if (data->enable_dts == 0)
|
|
|
- return sprintf(buf, "%d\n", 0);
|
|
|
-
|
|
|
- if ((data->has_dts >> index) & 0x01) {
|
|
|
- if (data->enable_dts & 2)
|
|
|
- tmp = 5;
|
|
|
- else
|
|
|
- tmp = 6;
|
|
|
- } else {
|
|
|
- tmp = 0;
|
|
|
- }
|
|
|
+ if (data->enable_dts & 2)
|
|
|
+ tmp = 5;
|
|
|
+ else
|
|
|
+ tmp = 6;
|
|
|
|
|
|
return sprintf(buf, "%d\n", tmp);
|
|
|
}
|
|
@@ -1231,14 +1197,6 @@ store_dts_ext(struct device *dev, struct device_attribute *attr,
|
|
|
}
|
|
|
|
|
|
|
|
|
-/*
|
|
|
- Type 3: Thermal diode
|
|
|
- Type 4: Thermistor
|
|
|
-
|
|
|
- Temp5-6, default TR
|
|
|
- Temp1-4, default TD
|
|
|
-*/
|
|
|
-
|
|
|
static ssize_t
|
|
|
show_temp_mode(struct device *dev, struct device_attribute *attr, char *buf)
|
|
|
{
|
|
@@ -1247,20 +1205,17 @@ show_temp_mode(struct device *dev, struct device_attribute *attr, char *buf)
|
|
|
struct sensor_device_attribute_2 *sensor_attr =
|
|
|
to_sensor_dev_attr_2(attr);
|
|
|
int index = sensor_attr->index;
|
|
|
- u8 tmp;
|
|
|
+ int tmp;
|
|
|
|
|
|
- if (data->has_temp >> index & 0x01) {
|
|
|
- if (data->temp_mode >> index & 0x01)
|
|
|
- tmp = 3;
|
|
|
- else
|
|
|
- tmp = 4;
|
|
|
- } else {
|
|
|
- tmp = 0;
|
|
|
- }
|
|
|
+ if (data->temp_mode & (1 << index))
|
|
|
+ tmp = 3; /* Thermal diode */
|
|
|
+ else
|
|
|
+ tmp = 4; /* Thermistor */
|
|
|
|
|
|
return sprintf(buf, "%d\n", tmp);
|
|
|
}
|
|
|
|
|
|
+/* Only for temp1-4 (temp5-6 can only be thermistor) */
|
|
|
static ssize_t
|
|
|
store_temp_mode(struct device *dev, struct device_attribute *attr,
|
|
|
const char *buf, size_t count)
|
|
@@ -1270,45 +1225,31 @@ store_temp_mode(struct device *dev, struct device_attribute *attr,
|
|
|
struct sensor_device_attribute_2 *sensor_attr =
|
|
|
to_sensor_dev_attr_2(attr);
|
|
|
int index = sensor_attr->index;
|
|
|
+ int reg_shift;
|
|
|
unsigned long val;
|
|
|
u8 tmp;
|
|
|
- u32 mask;
|
|
|
|
|
|
if (strict_strtoul(buf, 10, &val) < 0)
|
|
|
return -EINVAL;
|
|
|
if ((val != 4) && (val != 3))
|
|
|
return -EINVAL;
|
|
|
- if ((index > 3) && (val == 3))
|
|
|
- return -EINVAL;
|
|
|
|
|
|
mutex_lock(&data->update_lock);
|
|
|
if (val == 3) {
|
|
|
- val = TEMP_CTRL_TD;
|
|
|
- data->has_temp |= 1 << index;
|
|
|
+ /* Thermal diode */
|
|
|
+ val = 0x01;
|
|
|
data->temp_mode |= 1 << index;
|
|
|
} else if (val == 4) {
|
|
|
- val = TEMP_CTRL_TR;
|
|
|
- data->has_temp |= 1 << index;
|
|
|
- tmp = 1 << index;
|
|
|
- data->temp_mode &= ~tmp;
|
|
|
+ /* Thermistor */
|
|
|
+ val = 0x03;
|
|
|
+ data->temp_mode &= ~(1 << index);
|
|
|
}
|
|
|
|
|
|
- if (index > 3)
|
|
|
- tmp = w83795_read(client, W83795_REG_TEMP_CTRL1);
|
|
|
- else
|
|
|
- tmp = w83795_read(client, W83795_REG_TEMP_CTRL2);
|
|
|
-
|
|
|
- mask = 0x03 << W83795_REG_TEMP_CTRL[index][TEMP_CTRL_SHIFT];
|
|
|
- tmp &= ~mask;
|
|
|
- tmp |= W83795_REG_TEMP_CTRL[index][val];
|
|
|
-
|
|
|
- mask = 1 << W83795_REG_TEMP_CTRL[index][TEMP_CTRL_HASIN_SHIFT];
|
|
|
- data->has_in &= ~mask;
|
|
|
-
|
|
|
- if (index > 3)
|
|
|
- w83795_write(client, W83795_REG_TEMP_CTRL1, tmp);
|
|
|
- else
|
|
|
- w83795_write(client, W83795_REG_TEMP_CTRL2, tmp);
|
|
|
+ reg_shift = 2 * index;
|
|
|
+ tmp = w83795_read(client, W83795_REG_TEMP_CTRL2);
|
|
|
+ tmp &= ~(0x03 << reg_shift);
|
|
|
+ tmp |= val << reg_shift;
|
|
|
+ w83795_write(client, W83795_REG_TEMP_CTRL2, tmp);
|
|
|
|
|
|
mutex_unlock(&data->update_lock);
|
|
|
return count;
|
|
@@ -1506,7 +1447,7 @@ store_sf_setup(struct device *dev, struct device_attribute *attr,
|
|
|
show_alarm_beep, store_beep, BEEP_ENABLE, index + 17) }
|
|
|
|
|
|
#define SENSOR_ATTR_TEMP(index) { \
|
|
|
- SENSOR_ATTR_2(temp##index##_type, S_IRUGO | S_IWUSR, \
|
|
|
+ SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 4 ? S_IWUSR : 0), \
|
|
|
show_temp_mode, store_temp_mode, NOT_USED, index - 1), \
|
|
|
SENSOR_ATTR_2(temp##index##_input, S_IRUGO, show_temp, \
|
|
|
NULL, TEMP_READ, index - 1), \
|