On Wed, Feb 22, 2012 at 05:25:44PM -0800, Guenter Roeck wrote: > On Wed, Feb 22, 2012 at 05:18:47PM -0500, Nikolaus Schulz wrote: > > The F75387 stores its temperature hysteresis in a different register than > > the other chips supported by that driver. > > > > Signed-off-by: Nikolaus Schulz <mail@xxxxxxxxxxxxxx> > > --- > > drivers/hwmon/f75375s.c | 36 ++++++++++++++++++++++++++++++------ > > 1 files changed, 30 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c > > index 944937c..3b06abf 100644 > > --- a/drivers/hwmon/f75375s.c > > +++ b/drivers/hwmon/f75375s.c > > @@ -65,6 +65,7 @@ enum chips { f75373, f75375, f75387 }; > > #define F75387_REG_TEMP11_LSB(nr) (0x1a + (nr)) > > #define F75375_REG_TEMP_HIGH(nr) (0x28 + (nr) * 2) > > #define F75375_REG_TEMP_HYST(nr) (0x29 + (nr) * 2) > > +#define F75387_REG_TEMP_HYST 0x62 > > > > #define F75375_REG_FAN(nr) (0x16 + (nr) * 2) > > #define F75375_REG_FAN_MIN(nr) (0x2C + (nr) * 2) > > @@ -183,23 +184,34 @@ static struct f75375_data *f75375_update_device(struct device *dev) > > struct i2c_client *client = to_i2c_client(dev); > > struct f75375_data *data = i2c_get_clientdata(client); > > int nr; > > + u8 f75387_hyst_reg = 0; > > > > mutex_lock(&data->update_lock); > > > > /* Limit registers cache is refreshed after 60 seconds */ > > if (time_after(jiffies, data->last_limits + 60 * HZ) > > || !data->valid) { > > + if (data->kind == f75387) > > + f75387_hyst_reg = > > + f75375_read8(client, F75387_REG_TEMP_HYST); > > for (nr = 0; nr < 2; nr++) { > > data->temp_high[nr] = > > f75375_read8(client, F75375_REG_TEMP_HIGH(nr)); > > - data->temp_max_hyst[nr] = > > - f75375_read8(client, F75375_REG_TEMP_HYST(nr)); > > data->fan_max[nr] = > > f75375_read16(client, F75375_REG_FAN_FULL(nr)); > > data->fan_min[nr] = > > f75375_read16(client, F75375_REG_FAN_MIN(nr)); > > data->fan_target[nr] = > > f75375_read16(client, F75375_REG_FAN_EXP(nr)); > > + if (data->kind == f75387) { > > + data->temp_max_hyst[nr] = > > + data->temp_high[nr] - > > + (0xf & f75387_hyst_reg); > > I really hate it when people put the constant first, and consider it confusing. > Please change. Ok. > Besides, you can do the masking above, when f75387_hyst_reg is read. > This way it only needs to be done once. Correct. I didn't do that because there is also some fan-specific information encoded in that register, and I am working on code that uses it. But until that code is posted, the register should be masked beforehand. I'll update the patch accordingly. > > + } else { > > + data->temp_max_hyst[nr] = > > + f75375_read8(client, > > + F75375_REG_TEMP_HYST(nr)); > > + } > > } > > for (nr = 0; nr < 4; nr++) { > > data->in_max[nr] = > > @@ -599,11 +611,23 @@ static ssize_t set_temp_max_hyst(struct device *dev, > > if (err < 0) > > return err; > > > > - val = SENSORS_LIMIT(TEMP_TO_REG(val), 0, 127); > > + val = TEMP_TO_REG(val); > > mutex_lock(&data->update_lock); > > - data->temp_max_hyst[nr] = val; > > - f75375_write8(client, F75375_REG_TEMP_HYST(nr), > > - data->temp_max_hyst[nr]); > > + if (data->kind == f75387) { > > + u8 regval; > > + val = SENSORS_LIMIT(val, > > + data->temp_high[nr] - 0xf, > > + data->temp_high[nr]); > > + data->temp_max_hyst[nr] = val; > > + regval = f75375_read8(client, F75387_REG_TEMP_HYST); > > + regval &= 0xf0; > > + regval |= data->temp_high[nr] - val; > > + f75375_write8(client, F75387_REG_TEMP_HYST, regval); > > Unless I am missing something, this affects the other hysteresis values as well, > since there is really only a single hysteresis register. That's correct. > If so, you have to set > data->valid to 0 to ensure that temp_max_hyst[] is updated with the next read cycle. Good catch! I will post an updated patch. > > + } else { > > + val = SENSORS_LIMIT(val, 0, 127); > > + data->temp_max_hyst[nr] = val; > > + f75375_write8(client, F75375_REG_TEMP_HYST(nr), val); > > + } > > mutex_unlock(&data->update_lock); > > return count; > > } > > -- > > 1.7.9.1 _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors