]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/hwmon/tmp421.c
hwmon: (tmp421) Fix temperature conversions
[net-next-2.6.git] / drivers / hwmon / tmp421.c
index 4f7c051e2d7b0425308489fcbbc6c04eda68947d..bb9760d7e8b6d92644feba51595bf542375ff166 100644 (file)
@@ -61,9 +61,9 @@ static const u8 TMP421_TEMP_LSB[4]            = { 0x10, 0x11, 0x12, 0x13 };
 #define TMP423_DEVICE_ID                       0x23
 
 static const struct i2c_device_id tmp421_id[] = {
-       { "tmp421", tmp421 },
-       { "tmp422", tmp422 },
-       { "tmp423", tmp423 },
+       { "tmp421", 2 },
+       { "tmp422", 3 },
+       { "tmp423", 4 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, tmp421_id);
@@ -73,21 +73,23 @@ struct tmp421_data {
        struct mutex update_lock;
        char valid;
        unsigned long last_updated;
-       int kind;
+       int channels;
        u8 config;
        s16 temp[4];
 };
 
 static int temp_from_s16(s16 reg)
 {
-       int temp = reg;
+       /* Mask out status bits */
+       int temp = reg & ~0xf;
 
        return (temp * 1000 + 128) / 256;
 }
 
 static int temp_from_u16(u16 reg)
 {
-       int temp = reg;
+       /* Mask out status bits */
+       int temp = reg & ~0xf;
 
        /* Add offset for extended temperature range. */
        temp -= 64 * 256;
@@ -107,7 +109,7 @@ static struct tmp421_data *tmp421_update_device(struct device *dev)
                data->config = i2c_smbus_read_byte_data(client,
                        TMP421_CONFIG_REG_1);
 
-               for (i = 0; i <= data->kind; i++) {
+               for (i = 0; i < data->channels; i++) {
                        data->temp[i] = i2c_smbus_read_byte_data(client,
                                TMP421_TEMP_MSB[i]) << 8;
                        data->temp[i] |= i2c_smbus_read_byte_data(client,
@@ -166,7 +168,7 @@ static mode_t tmp421_is_visible(struct kobject *kobj, struct attribute *a,
        devattr = container_of(a, struct device_attribute, attr);
        index = to_sensor_dev_attr(devattr)->index;
 
-       if (data->kind > index)
+       if (index < data->channels)
                return a->mode;
 
        return 0;
@@ -271,7 +273,7 @@ static int tmp421_probe(struct i2c_client *client,
 
        i2c_set_clientdata(client, data);
        mutex_init(&data->update_lock);
-       data->kind = id->driver_data;
+       data->channels = id->driver_data;
 
        err = tmp421_init_client(client);
        if (err)