hwmon: (w83627ehf) Better fix for negative temperature values
authorJean Delvare <khali@linux-fr.org>
Thu, 20 Oct 2011 07:13:31 +0000 (03:13 -0400)
committerGuenter Roeck <guenter.roeck@ericsson.com>
Mon, 24 Oct 2011 18:09:48 +0000 (11:09 -0700)
It is more efficient to left-align 8-bit temperature values, so that
8-bit and 9-bit temperature values can be handled exactly the same way
in the rest of the code.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Guenter Roeck <guenter.roeck@ericsson.com>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
drivers/hwmon/w83627ehf.c

index a26830d..98aab4b 100644 (file)
@@ -388,23 +388,6 @@ div_from_reg(u8 reg)
        return 1 << reg;
 }
 
-static inline int
-temp_from_reg(u16 reg, s16 regval)
-{
-       if (is_word_sized(reg))
-               return LM75_TEMP_FROM_REG(regval);
-       return ((s8)regval) * 1000;
-}
-
-static inline u16
-temp_to_reg(u16 reg, long temp)
-{
-       if (is_word_sized(reg))
-               return LM75_TEMP_TO_REG(temp);
-       return (s8)DIV_ROUND_CLOSEST(SENSORS_LIMIT(temp, -127000, 128000),
-                                    1000);
-}
-
 /* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */
 
 static u8 scale_in[10] = { 8, 8, 16, 16, 8, 8, 8, 16, 16, 8 };
@@ -561,6 +544,26 @@ static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg,
        return 0;
 }
 
+/* We left-align 8-bit temperature values to make the code simpler */
+static u16 w83627ehf_read_temp(struct w83627ehf_data *data, u16 reg)
+{
+       u16 res;
+
+       res = w83627ehf_read_value(data, reg);
+       if (!is_word_sized(reg))
+               res <<= 8;
+
+       return res;
+}
+
+static int w83627ehf_write_temp(struct w83627ehf_data *data, u16 reg,
+                                      u16 value)
+{
+       if (!is_word_sized(reg))
+               value >>= 8;
+       return w83627ehf_write_value(data, reg, value);
+}
+
 /* This function assumes that the caller holds data->update_lock */
 static void nct6775_write_fan_div(struct w83627ehf_data *data, int nr)
 {
@@ -862,15 +865,15 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
                for (i = 0; i < NUM_REG_TEMP; i++) {
                        if (!(data->have_temp & (1 << i)))
                                continue;
-                       data->temp[i] = w83627ehf_read_value(data,
+                       data->temp[i] = w83627ehf_read_temp(data,
                                                data->reg_temp[i]);
                        if (data->reg_temp_over[i])
                                data->temp_max[i]
-                                 = w83627ehf_read_value(data,
+                                 = w83627ehf_read_temp(data,
                                                data->reg_temp_over[i]);
                        if (data->reg_temp_hyst[i])
                                data->temp_max_hyst[i]
-                                 = w83627ehf_read_value(data,
+                                 = w83627ehf_read_temp(data,
                                                data->reg_temp_hyst[i]);
                }
 
@@ -1166,8 +1169,7 @@ show_##reg(struct device *dev, struct device_attribute *attr, \
        struct sensor_device_attribute *sensor_attr = \
                to_sensor_dev_attr(attr); \
        int nr = sensor_attr->index; \
-       return sprintf(buf, "%d\n", \
-                      temp_from_reg(data->addr[nr], data->reg[nr])); \
+       return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->reg[nr])); \
 }
 show_temp_reg(reg_temp, temp);
 show_temp_reg(reg_temp_over, temp_max);
@@ -1188,9 +1190,8 @@ store_##reg(struct device *dev, struct device_attribute *attr, \
        if (err < 0) \
                return err; \
        mutex_lock(&data->update_lock); \
-       data->reg[nr] = temp_to_reg(data->addr[nr], val); \
-       w83627ehf_write_value(data, data->addr[nr], \
-                             data->reg[nr]); \
+       data->reg[nr] = LM75_TEMP_TO_REG(val); \
+       w83627ehf_write_temp(data, data->addr[nr], data->reg[nr]); \
        mutex_unlock(&data->update_lock); \
        return count; \
 }