summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2008-10-17 17:51:09 +0200
committerJean Delvare <khali@mahadeva.delvare>2008-10-17 17:51:09 +0200
commit5f502a834a6471dc3cc456ccef66292e9e3a152e (patch)
treee5302049c34bfc5c526d7d666929b04b0a4a2149
parentf65e17086fc141bee1592bbf6e709e9c7a43541b (diff)
downloadlinux-3.10-5f502a834a6471dc3cc456ccef66292e9e3a152e.tar.gz
linux-3.10-5f502a834a6471dc3cc456ccef66292e9e3a152e.tar.bz2
linux-3.10-5f502a834a6471dc3cc456ccef66292e9e3a152e.zip
hwmon: (lm90) Don't access nonexistent registers on Maxim chips
The Maxim chips supported by the lm90 driver have 8-bit high and low remote limit values, not 11-bit as the other chips have. So stop reading from and writing to registers that do not exist on these chips. Also round the limit values set by the user properly. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Martyn Welch <martyn.welch@gefanuc.com>
-rw-r--r--drivers/hwmon/lm90.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index 16b99e0bdff..90489b8f5c8 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -323,12 +323,16 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
mutex_lock(&data->update_lock);
if (data->kind == adt7461)
data->temp11[nr] = TEMP2_TO_REG_ADT7461(val);
+ else if (data->kind == max6657 || data->kind == max6680)
+ data->temp11[nr] = TEMP1_TO_REG(val) << 8;
else
data->temp11[nr] = TEMP2_TO_REG(val);
+
i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2],
data->temp11[nr] >> 8);
- i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2 + 1],
- data->temp11[nr] & 0xff);
+ if (data->kind != max6657 && data->kind != max6680)
+ i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2 + 1],
+ data->temp11[nr] & 0xff);
mutex_unlock(&data->update_lock);
return count;
}
@@ -801,12 +805,21 @@ static struct lm90_data *lm90_update_device(struct device *dev)
lm90_read16(client, LM90_REG_R_REMOTE_TEMPH,
LM90_REG_R_REMOTE_TEMPL, &data->temp11[0]);
- if (lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH, &h) == 0
- && lm90_read_reg(client, LM90_REG_R_REMOTE_LOWL, &l) == 0)
- data->temp11[1] = (h << 8) | l;
- if (lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &h) == 0
- && lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHL, &l) == 0)
- data->temp11[2] = (h << 8) | l;
+ if (lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH, &h) == 0) {
+ data->temp11[1] = h << 8;
+ if (data->kind != max6657 && data->kind != max6680
+ && lm90_read_reg(client, LM90_REG_R_REMOTE_LOWL,
+ &l) == 0)
+ data->temp11[1] |= l;
+ }
+ if (lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &h) == 0) {
+ data->temp11[2] = h << 8;
+ if (data->kind != max6657 && data->kind != max6680
+ && lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHL,
+ &l) == 0)
+ data->temp11[2] |= l;
+ }
+
if (data->kind != max6657) {
if (lm90_read_reg(client, LM90_REG_R_REMOTE_OFFSH,
&h) == 0