hwmon: (lm85) Don't write back cached values
authorJean Delvare <khali@linux-fr.org>
Sat, 12 Apr 2008 17:56:35 +0000 (19:56 +0200)
committerMark M. Hoffman <mhoffman@lightlink.com>
Fri, 1 Aug 2008 03:44:03 +0000 (23:44 -0400)
In set_pwm_auto_pwm_minctl, we write cached register bits back to the
chip. This is a bad idea as we have no guarantee that the cache is
up-to-date. Better read a fresh register value from the chip, it's
safer and in fact it is also more simple.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Juerg Haefliger <juergh at gmail.com>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
drivers/hwmon/lm85.c

index 0d31435b333cf738eec2de726404bfde343c434d..645b98c187c2056789f52904211ec300d3477142 100644 (file)
@@ -308,10 +308,8 @@ struct lm85_data {
        u8 pwm[3];              /* Register value */
        u8 temp_ext[3];         /* Decoded values */
        u8 in_ext[8];           /* Decoded values */
-       u8 smooth[1];           /* Register encoding */
        u8 vid;                 /* Register value */
        u8 vrm;                 /* VRM version */
-       u8 syncpwm3;            /* Saved PWM3 for TACH 2,3,4 config */
        u32 alarms;             /* Register encoding, combined */
        struct lm85_autofan autofan[3];
        struct lm85_zone zone[3];
@@ -756,14 +754,15 @@ static ssize_t set_pwm_auto_pwm_minctl(struct device *dev,
        struct i2c_client *client = to_i2c_client(dev);
        struct lm85_data *data = i2c_get_clientdata(client);
        long val = simple_strtol(buf, NULL, 10);
+       u8 tmp;
 
        mutex_lock(&data->update_lock);
        data->autofan[nr].min_off = val;
-       lm85_write_value(client, LM85_REG_AFAN_SPIKE1, data->smooth[0]
-               | data->syncpwm3
-               | (data->autofan[0].min_off ? 0x20 : 0)
-               | (data->autofan[1].min_off ? 0x40 : 0)
-               | (data->autofan[2].min_off ? 0x80 : 0));
+       tmp = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
+       tmp &= ~(0x20 << nr);
+       if (data->autofan[nr].min_off)
+               tmp |= 0x20 << nr;
+       lm85_write_value(client, LM85_REG_AFAN_SPIKE1, tmp);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -1531,8 +1530,6 @@ static struct lm85_data *lm85_update_device(struct device *dev)
                }
 
                i = lm85_read_value(client, LM85_REG_AFAN_SPIKE1);
-               data->smooth[0] = i & 0x0f;
-               data->syncpwm3 = i & 0x10;  /* Save PWM3 config */
                data->autofan[0].min_off = (i & 0x20) != 0;
                data->autofan[1].min_off = (i & 0x40) != 0;
                data->autofan[2].min_off = (i & 0x80) != 0;