summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Packham <chris.packham@alliedtelesis.co.nz>2016-10-04 17:40:54 -0400
committerGuenter Roeck <linux@roeck-us.net>2016-10-17 13:16:20 -0400
commit667f4bab81ea8357d260aa14bb6fb1a4834248d5 (patch)
treea0cadcf223dbfcfe8a7b708d88cb957bbca7b3c7
parent1001354ca34179f3db924eb66672442a173147dc (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.c6
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
269static ssize_t show_max(struct device *dev, struct device_attribute *devattr, 269static ssize_t show_max(struct device *dev, struct device_attribute *devattr,