return -EINVAL;
        
        mutex_lock(&data->update_lock);
+       /* Get fresh readings */
+       data->fan_div[nr] = adm1031_read_value(client,
+                                              ADM1031_REG_FAN_DIV(nr));
+       data->fan_min[nr] = adm1031_read_value(client,
+                                              ADM1031_REG_FAN_MIN(nr));
+
+       /* Write the new clock divider and fan min */
        old_div = FAN_DIV_FROM_REG(data->fan_div[nr]);
        data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]);
        new_min = data->fan_min[nr] * old_div / 
                FAN_DIV_FROM_REG(data->fan_div[nr]);
        data->fan_min[nr] = new_min > 0xff ? 0xff : new_min;
-       data->fan[nr] = data->fan[nr] * old_div / 
-               FAN_DIV_FROM_REG(data->fan_div[nr]);
 
        adm1031_write_value(client, ADM1031_REG_FAN_DIV(nr), 
                            data->fan_div[nr]);
        adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), 
                            data->fan_min[nr]);
+
+       /* Invalidate the cache: fan speed is no longer valid */
+       data->valid = 0;
        mutex_unlock(&data->update_lock);
        return count;
 }