Commit f790674d3f87df6390828ac21a7d1530f71b59c8
Committed by
Jean Delvare
1 parent
014bcd28a0
Exists in
master
and in
7 other branches
hwmon: (via686a) Initialize fan_div values
Functions set_fan_min() and set_fan_div() assume that the fan_div values have already been read from the register. The driver currently doesn't initialize them at load time, they are only set when function via686a_update_device() is called. This means that set_fan_min() and set_fan_div() misbehave if, for example, "sensors -s" is called before any monitoring application (e.g. "sensors") is has been run. Fix the problem by always initializing the fan_div values at device bind time. Signed-off-by: Jean Delvare <khali@linux-fr.org> Cc: stable@kernel.org Acked-by: Guenter Roeck <guenter.roeck@ericsson.com>
Showing 1 changed file with 11 additions and 3 deletions Side-by-side Diff
drivers/hwmon/via686a.c
... | ... | @@ -689,6 +689,13 @@ |
689 | 689 | return 0; |
690 | 690 | } |
691 | 691 | |
692 | +static void via686a_update_fan_div(struct via686a_data *data) | |
693 | +{ | |
694 | + int reg = via686a_read_value(data, VIA686A_REG_FANDIV); | |
695 | + data->fan_div[0] = (reg >> 4) & 0x03; | |
696 | + data->fan_div[1] = reg >> 6; | |
697 | +} | |
698 | + | |
692 | 699 | static void __devinit via686a_init_device(struct via686a_data *data) |
693 | 700 | { |
694 | 701 | u8 reg; |
... | ... | @@ -702,6 +709,9 @@ |
702 | 709 | via686a_write_value(data, VIA686A_REG_TEMP_MODE, |
703 | 710 | (reg & ~VIA686A_TEMP_MODE_MASK) |
704 | 711 | | VIA686A_TEMP_MODE_CONTINUOUS); |
712 | + | |
713 | + /* Pre-read fan clock divisor values */ | |
714 | + via686a_update_fan_div(data); | |
705 | 715 | } |
706 | 716 | |
707 | 717 | static struct via686a_data *via686a_update_device(struct device *dev) |
... | ... | @@ -753,9 +763,7 @@ |
753 | 763 | (via686a_read_value(data, VIA686A_REG_TEMP_LOW23) & |
754 | 764 | 0xc0) >> 6; |
755 | 765 | |
756 | - i = via686a_read_value(data, VIA686A_REG_FANDIV); | |
757 | - data->fan_div[0] = (i >> 4) & 0x03; | |
758 | - data->fan_div[1] = i >> 6; | |
766 | + via686a_update_fan_div(data); | |
759 | 767 | data->alarms = |
760 | 768 | via686a_read_value(data, |
761 | 769 | VIA686A_REG_ALARM1) | |