/* * Trip points in the lookup table should be in ascending order for both * temperatures and PWM output values. */ static int lm63_lut_looks_bad(struct device *dev, struct lm63_data *data) { int i; mutex_lock(&data->update_lock); lm63_update_lut(data); for (i = 1; i < data->lut_size; i++) { if (data->pwm1[1 + i - 1] > data->pwm1[1 + i] || data->temp8[3 + i - 1] > data->temp8[3 + i]) { dev_warn(dev, "Lookup table doesn't look sane (check entries %d and %d)\n", i, i + 1); break; } } mutex_unlock(&data->update_lock); return i == data->lut_size ? 0 : 1; }
/* * Trip points in the lookup table should be in ascending order for both * temperatures and PWM output values. */ static int lm63_lut_looks_bad(struct i2c_client *client) { struct lm63_data *data = i2c_get_clientdata(client); int i; mutex_lock(&data->update_lock); lm63_update_lut(client); for (i = 1; i < data->lut_size; i++) { if (data->pwm1[1 + i - 1] > data->pwm1[1 + i] || data->temp8[3 + i - 1] > data->temp8[3 + i]) { dev_warn(&client->dev, "Lookup table doesn't look sane (check entries %d and %d)\n", i, i + 1); break; } } mutex_unlock(&data->update_lock); return i == data->lut_size ? 0 : 1; }
static struct lm63_data *lm63_update_device(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct lm63_data *data = i2c_get_clientdata(client); unsigned long next_update; mutex_lock(&data->update_lock); next_update = data->last_updated + msecs_to_jiffies(data->update_interval) + 1; if (time_after(jiffies, next_update) || !data->valid) { if (data->config & 0x04) { /* tachometer enabled */ /* order matters for fan1_input */ data->fan[0] = i2c_smbus_read_byte_data(client, LM63_REG_TACH_COUNT_LSB) & 0xFC; data->fan[0] |= i2c_smbus_read_byte_data(client, LM63_REG_TACH_COUNT_MSB) << 8; data->fan[1] = (i2c_smbus_read_byte_data(client, LM63_REG_TACH_LIMIT_LSB) & 0xFC) | (i2c_smbus_read_byte_data(client, LM63_REG_TACH_LIMIT_MSB) << 8); } data->pwm1_freq = i2c_smbus_read_byte_data(client, LM63_REG_PWM_FREQ); if (data->pwm1_freq == 0) data->pwm1_freq = 1; data->pwm1[0] = i2c_smbus_read_byte_data(client, LM63_REG_PWM_VALUE); data->temp8[0] = i2c_smbus_read_byte_data(client, LM63_REG_LOCAL_TEMP); data->temp8[1] = i2c_smbus_read_byte_data(client, LM63_REG_LOCAL_HIGH); /* order matters for temp2_input */ data->temp11[0] = i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_TEMP_MSB) << 8; data->temp11[0] |= i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_TEMP_LSB); data->temp11[1] = (i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_LOW_MSB) << 8) | i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_LOW_LSB); data->temp11[2] = (i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_HIGH_MSB) << 8) | i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_HIGH_LSB); data->temp11[3] = (i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_OFFSET_MSB) << 8) | i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_OFFSET_LSB); if (data->kind == lm96163) data->temp11u = (i2c_smbus_read_byte_data(client, LM96163_REG_REMOTE_TEMP_U_MSB) << 8) | i2c_smbus_read_byte_data(client, LM96163_REG_REMOTE_TEMP_U_LSB); data->temp8[2] = i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_TCRIT); data->temp2_crit_hyst = i2c_smbus_read_byte_data(client, LM63_REG_REMOTE_TCRIT_HYST); data->alarms = i2c_smbus_read_byte_data(client, LM63_REG_ALERT_STATUS) & 0x7F; data->last_updated = jiffies; data->valid = 1; } lm63_update_lut(client); mutex_unlock(&data->update_lock); return data; }