diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c
index c8f62044ac197..07e8de58dcd47 100644
--- a/drivers/hwmon/w83795.c
+++ b/drivers/hwmon/w83795.c
@@ -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),				\