|
@@ -74,6 +74,7 @@ I2C_CLIENT_INSMOD_1(adt7470);
|
|
|
#define ADT7470_REG_PWM12_CFG 0x68
|
|
|
#define ADT7470_PWM2_AUTO_MASK 0x40
|
|
|
#define ADT7470_PWM1_AUTO_MASK 0x80
|
|
|
+#define ADT7470_PWM_AUTO_MASK 0xC0
|
|
|
#define ADT7470_REG_PWM34_CFG 0x69
|
|
|
#define ADT7470_PWM3_AUTO_MASK 0x40
|
|
|
#define ADT7470_PWM4_AUTO_MASK 0x80
|
|
@@ -223,7 +224,7 @@ static struct adt7470_data *adt7470_update_device(struct device *dev)
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct adt7470_data *data = i2c_get_clientdata(client);
|
|
|
unsigned long local_jiffies = jiffies;
|
|
|
- u8 cfg;
|
|
|
+ u8 cfg, pwm[4], pwm_cfg[2];
|
|
|
int i;
|
|
|
|
|
|
mutex_lock(&data->lock);
|
|
@@ -232,6 +233,24 @@ static struct adt7470_data *adt7470_update_device(struct device *dev)
|
|
|
&& data->sensors_valid)
|
|
|
goto no_sensor_update;
|
|
|
|
|
|
+ /* save pwm[1-4] config register */
|
|
|
+ pwm_cfg[0] = i2c_smbus_read_byte_data(client, ADT7470_REG_PWM_CFG(0));
|
|
|
+ pwm_cfg[1] = i2c_smbus_read_byte_data(client, ADT7470_REG_PWM_CFG(2));
|
|
|
+
|
|
|
+ /* set manual pwm to whatever it is set to now */
|
|
|
+ for (i = 0; i < ADT7470_FAN_COUNT; i++)
|
|
|
+ pwm[i] = i2c_smbus_read_byte_data(client, ADT7470_REG_PWM(i));
|
|
|
+
|
|
|
+ /* put pwm in manual mode */
|
|
|
+ i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_CFG(0),
|
|
|
+ pwm_cfg[0] & ~(ADT7470_PWM_AUTO_MASK));
|
|
|
+ i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_CFG(2),
|
|
|
+ pwm_cfg[1] & ~(ADT7470_PWM_AUTO_MASK));
|
|
|
+
|
|
|
+ /* write pwm control to whatever it was */
|
|
|
+ for (i = 0; i < ADT7470_FAN_COUNT; i++)
|
|
|
+ i2c_smbus_write_byte_data(client, ADT7470_REG_PWM(i), pwm[i]);
|
|
|
+
|
|
|
/* start reading temperature sensors */
|
|
|
cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG);
|
|
|
cfg |= 0x80;
|
|
@@ -249,6 +268,10 @@ static struct adt7470_data *adt7470_update_device(struct device *dev)
|
|
|
cfg &= ~0x80;
|
|
|
i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg);
|
|
|
|
|
|
+ /* restore pwm[1-4] config registers */
|
|
|
+ i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_CFG(0), pwm_cfg[0]);
|
|
|
+ i2c_smbus_write_byte_data(client, ADT7470_REG_PWM_CFG(2), pwm_cfg[1]);
|
|
|
+
|
|
|
for (i = 0; i < ADT7470_TEMP_COUNT; i++)
|
|
|
data->temp[i] = i2c_smbus_read_byte_data(client,
|
|
|
ADT7470_TEMP_REG(i));
|