hwmon: (adm1031) Fix register overwrite in set_fan_div()

Don't rely on the register cache when setting a new fan clock divider.
For one thing, the cache might not have been initialized at all if the
driver has just been loaded. For another, the cached values may be old
and you never know what can happen in the driver's back.

Also invalidate the cache instead of trying to adjust the measured fan
speed: the whole point of changing the clock divider is to get a better
reading.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>

authored by

Jean Delvare and committed by
Mark M. Hoffman
38a1f0e9 d5b0b5d6

+10 -2
+10 -2
drivers/hwmon/adm1031.c
··· 542 return -EINVAL; 543 544 mutex_lock(&data->update_lock); 545 old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); 546 data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]); 547 new_min = data->fan_min[nr] * old_div / 548 FAN_DIV_FROM_REG(data->fan_div[nr]); 549 data->fan_min[nr] = new_min > 0xff ? 0xff : new_min; 550 - data->fan[nr] = data->fan[nr] * old_div / 551 - FAN_DIV_FROM_REG(data->fan_div[nr]); 552 553 adm1031_write_value(client, ADM1031_REG_FAN_DIV(nr), 554 data->fan_div[nr]); 555 adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), 556 data->fan_min[nr]); 557 mutex_unlock(&data->update_lock); 558 return count; 559 }
··· 542 return -EINVAL; 543 544 mutex_lock(&data->update_lock); 545 + /* Get fresh readings */ 546 + data->fan_div[nr] = adm1031_read_value(client, 547 + ADM1031_REG_FAN_DIV(nr)); 548 + data->fan_min[nr] = adm1031_read_value(client, 549 + ADM1031_REG_FAN_MIN(nr)); 550 + 551 + /* Write the new clock divider and fan min */ 552 old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); 553 data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]); 554 new_min = data->fan_min[nr] * old_div / 555 FAN_DIV_FROM_REG(data->fan_div[nr]); 556 data->fan_min[nr] = new_min > 0xff ? 0xff : new_min; 557 558 adm1031_write_value(client, ADM1031_REG_FAN_DIV(nr), 559 data->fan_div[nr]); 560 adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), 561 data->fan_min[nr]); 562 + 563 + /* Invalidate the cache: fan speed is no longer valid */ 564 + data->valid = 0; 565 mutex_unlock(&data->update_lock); 566 return count; 567 }