From ea5430f3f7e5ca99702189df8ddd156aa2972333 Mon Sep 17 00:00:00 2001 From: "Mark D. Studebaker" Date: Sun, 10 Sep 2000 23:28:51 +0000 Subject: [PATCH] (mds) Limit the as99127f fan_div values to 8. The as99127f apparently does not support the extended fan_div bits like the w83782d does. This should fix fan2 so it defaults to a divisor of 2 instead of 32. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@871 7894878c-1315-0410-8ee3-d5d059ff63e0 --- CHANGES | 1 + kernel/chips/w83781d.c | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index ccc6bd56..8152678c 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,7 @@ ask CVS about it: Module i2c-i801: add i2c block write support, fix smbus block bugs (requires i2c 2.5.3 package) Module i2c-i810: support Intel 82815 + Module w83781d: limit fan divisors to 8 max. for as99127f Program i2cdump: Add smbus block read support Programs i2cdetect, i2cdump: Improve error reporting Program sensors: new switch -u (--unknown) diff --git a/kernel/chips/w83781d.c b/kernel/chips/w83781d.c index d6e40f33..9c2f0d4e 100644 --- a/kernel/chips/w83781d.c +++ b/kernel/chips/w83781d.c @@ -208,7 +208,8 @@ extern inline u8 AS_FAN_TO_REG(long rpm, int div) extern inline u8 DIV_TO_REG(long val, enum chips type) { int i; - val = SENSORS_LIMIT(val, 1, ((type == w83781d) ? 8 : 128)) >> 1; + val = SENSORS_LIMIT(val, 1, + ((type == w83781d || type == as99127f) ? 8 : 128)) >> 1; for (i = 0; i < 6; i++) { if (val == 0) break; @@ -1457,7 +1458,7 @@ void w83781d_update_client(struct i2c_client *client) data->fan_div[2] = (w83781d_read_value(client, W83781D_REG_PIN) >> 6) & 0x03; - if (data->type != w83781d) { + if ((data->type != w83781d) && (data->type != as99127f)) { i = w83781d_read_value(client, W83781D_REG_VBAT); data->fan_div[0] |= (i >> 3) & 0x04; data->fan_div[1] |= (i >> 4) & 0x04; @@ -1733,7 +1734,8 @@ void w83781d_fan_div(struct i2c_client *client, int operation, *nrels_mag = 3; } else if (operation == SENSORS_PROC_REAL_WRITE) { old = w83781d_read_value(client, W83781D_REG_VID_FANDIV); - if (data->type != w83781d) { + /* w83781d and as99127f don't have extended divisor bits */ + if ((data->type != w83781d) && data->type != as99127f) { old3 = w83781d_read_value(client, W83781D_REG_VBAT); } @@ -1742,10 +1744,10 @@ void w83781d_fan_div(struct i2c_client *client, int operation, DIV_TO_REG(results[2], data->type); old2 = w83781d_read_value(client, W83781D_REG_PIN); old2 = - (old2 & 0x3f) | ((data->fan_div[2] & 0x03) << - 6); + (old2 & 0x3f) | ((data->fan_div[2] & 0x03) << 6); w83781d_write_value(client, W83781D_REG_PIN, old2); - if (data->type != w83781d) { + if ((data->type != w83781d) && + (data->type != as99127f)) { old3 = (old3 & 0x7f) | ((data->fan_div[2] & 0x04) << 5); @@ -1755,9 +1757,9 @@ void w83781d_fan_div(struct i2c_client *client, int operation, data->fan_div[1] = DIV_TO_REG(results[1], data->type); old = - (old & 0x3f) | ((data->fan_div[1] & 0x03) << - 6); - if (data->type != w83781d) { + (old & 0x3f) | ((data->fan_div[1] & 0x03) << 6); + if ((data->type != w83781d) && + (data->type != as99127f)) { old3 = (old3 & 0xbf) | ((data->fan_div[1] & 0x04) << 4); @@ -1767,11 +1769,11 @@ void w83781d_fan_div(struct i2c_client *client, int operation, data->fan_div[0] = DIV_TO_REG(results[0], data->type); old = - (old & 0xcf) | ((data->fan_div[0] & 0x03) << - 4); + (old & 0xcf) | ((data->fan_div[0] & 0x03) << 4); w83781d_write_value(client, W83781D_REG_VID_FANDIV, old); - if (data->type != w83781d) { + if ((data->type != w83781d) && + (data->type != as99127f)) { old3 = (old3 & 0xdf) | ((data->fan_div[0] & 0x04) << 3);