|
@@ -79,6 +79,7 @@ struct thermostat {
|
|
|
u8 limits[3];
|
|
|
int last_speed[2];
|
|
|
int last_var[2];
|
|
|
+ int pwm_inv[2];
|
|
|
};
|
|
|
|
|
|
static enum {ADT7460, ADT7467} therm_type;
|
|
@@ -229,19 +230,23 @@ static void write_fan_speed(struct thermostat *th, int speed, int fan)
|
|
|
|
|
|
if (speed >= 0) {
|
|
|
manual = read_reg(th, MANUAL_MODE[fan]);
|
|
|
+ manual &= ~INVERT_MASK;
|
|
|
write_reg(th, MANUAL_MODE[fan],
|
|
|
- (manual|MANUAL_MASK) & (~INVERT_MASK));
|
|
|
+ manual | MANUAL_MASK | th->pwm_inv[fan]);
|
|
|
write_reg(th, FAN_SPD_SET[fan], speed);
|
|
|
} else {
|
|
|
/* back to automatic */
|
|
|
if(therm_type == ADT7460) {
|
|
|
manual = read_reg(th,
|
|
|
MANUAL_MODE[fan]) & (~MANUAL_MASK);
|
|
|
-
|
|
|
+ manual &= ~INVERT_MASK;
|
|
|
+ manual |= th->pwm_inv[fan];
|
|
|
write_reg(th,
|
|
|
MANUAL_MODE[fan], manual|REM_CONTROL[fan]);
|
|
|
} else {
|
|
|
manual = read_reg(th, MANUAL_MODE[fan]);
|
|
|
+ manual &= ~INVERT_MASK;
|
|
|
+ manual |= th->pwm_inv[fan];
|
|
|
write_reg(th, MANUAL_MODE[fan], manual&(~AUTO_MASK));
|
|
|
}
|
|
|
}
|
|
@@ -418,6 +423,10 @@ static int probe_thermostat(struct i2c_client *client,
|
|
|
|
|
|
thermostat = th;
|
|
|
|
|
|
+ /* record invert bit status because fw can corrupt it after suspend */
|
|
|
+ th->pwm_inv[0] = read_reg(th, MANUAL_MODE[0]) & INVERT_MASK;
|
|
|
+ th->pwm_inv[1] = read_reg(th, MANUAL_MODE[1]) & INVERT_MASK;
|
|
|
+
|
|
|
/* be sure to really write fan speed the first time */
|
|
|
th->last_speed[0] = -2;
|
|
|
th->last_speed[1] = -2;
|