diff options
author | Chris Packham <chris.packham@alliedtelesis.co.nz> | 2016-10-04 17:40:54 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2016-10-17 13:16:20 -0400 |
commit | 667f4bab81ea8357d260aa14bb6fb1a4834248d5 (patch) | |
tree | a0cadcf223dbfcfe8a7b708d88cb957bbca7b3c7 | |
parent | 1001354ca34179f3db924eb66672442a173147dc (diff) |
hwmon: (adm9240) handle temperature readings below 0
Unlike the temperature thresholds the temperature data is a 9-bit signed
value. This allows and additional 0.5 degrees of precision on the
reading but makes handling negative values slightly harder. In order to
have sign-extension applied correctly the 9-bit value is stored in the
upper bits of a signed 16-bit value. When presenting this in sysfs the
value is shifted and scaled appropriately.
Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/adm9240.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/hwmon/adm9240.c b/drivers/hwmon/adm9240.c index 98114cef1e43..2fe1828bd10b 100644 --- a/drivers/hwmon/adm9240.c +++ b/drivers/hwmon/adm9240.c | |||
@@ -194,10 +194,10 @@ static struct adm9240_data *adm9240_update_device(struct device *dev) | |||
194 | * 0.5'C per two measurement cycles thus ignore possible | 194 | * 0.5'C per two measurement cycles thus ignore possible |
195 | * but unlikely aliasing error on lsb reading. --Grant | 195 | * but unlikely aliasing error on lsb reading. --Grant |
196 | */ | 196 | */ |
197 | data->temp = ((i2c_smbus_read_byte_data(client, | 197 | data->temp = (i2c_smbus_read_byte_data(client, |
198 | ADM9240_REG_TEMP) << 8) | | 198 | ADM9240_REG_TEMP) << 8) | |
199 | i2c_smbus_read_byte_data(client, | 199 | i2c_smbus_read_byte_data(client, |
200 | ADM9240_REG_TEMP_CONF)) / 128; | 200 | ADM9240_REG_TEMP_CONF); |
201 | 201 | ||
202 | for (i = 0; i < 2; i++) { /* read fans */ | 202 | for (i = 0; i < 2; i++) { /* read fans */ |
203 | data->fan[i] = i2c_smbus_read_byte_data(client, | 203 | data->fan[i] = i2c_smbus_read_byte_data(client, |
@@ -263,7 +263,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *dummy, | |||
263 | char *buf) | 263 | char *buf) |
264 | { | 264 | { |
265 | struct adm9240_data *data = adm9240_update_device(dev); | 265 | struct adm9240_data *data = adm9240_update_device(dev); |
266 | return sprintf(buf, "%d\n", data->temp * 500); /* 9-bit value */ | 266 | return sprintf(buf, "%d\n", data->temp / 128 * 500); /* 9-bit value */ |
267 | } | 267 | } |
268 | 268 | ||
269 | static ssize_t show_max(struct device *dev, struct device_attribute *devattr, | 269 | static ssize_t show_max(struct device *dev, struct device_attribute *devattr, |