summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/w83795.c107
1 files changed, 24 insertions, 83 deletions
diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c
index c8f6204..07e8de5 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), \
OpenPOWER on IntegriCloud