Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 220498
b: refs/heads/master
c: 39deb69
h: refs/heads/master
v: v3
  • Loading branch information
Jean Delvare authored and Jean Delvare committed Oct 28, 2010
1 parent 2de1b27 commit 97d85c7
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 84 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cd316df582925f3dab1ce5863651b3e260687035
refs/heads/master: 39deb6993e7c22274c272c95013eef886f7004e8
107 changes: 24 additions & 83 deletions trunk/drivers/hwmon/w83795.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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] =
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
{
Expand All @@ -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)
Expand All @@ -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;
Expand Down Expand Up @@ -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), \
Expand Down

0 comments on commit 97d85c7

Please sign in to comment.