Lines Matching refs:data
190 static inline int temp8_from_reg(struct lm63_data *data, int nr) in temp8_from_reg() argument
192 if (data->remote_unsigned) in temp8_from_reg()
193 return TEMP8_FROM_REG((u8)data->temp8[nr]); in temp8_from_reg()
194 return TEMP8_FROM_REG(data->temp8[nr]); in temp8_from_reg()
197 static inline int lut_temp_from_reg(struct lm63_data *data, int nr) in lut_temp_from_reg() argument
199 return data->temp8[nr] * (data->lut_temp_highres ? 500 : 1000); in lut_temp_from_reg()
202 static inline int lut_temp_to_reg(struct lm63_data *data, long val) in lut_temp_to_reg() argument
204 val -= data->temp2_offset; in lut_temp_to_reg()
205 if (data->lut_temp_highres) in lut_temp_to_reg()
215 static void lm63_update_lut(struct lm63_data *data) in lm63_update_lut() argument
217 struct i2c_client *client = data->client; in lm63_update_lut()
220 if (time_after(jiffies, data->lut_last_updated + 5 * HZ) || in lm63_update_lut()
221 !data->lut_valid) { in lm63_update_lut()
222 for (i = 0; i < data->lut_size; i++) { in lm63_update_lut()
223 data->pwm1[1 + i] = i2c_smbus_read_byte_data(client, in lm63_update_lut()
225 data->temp8[3 + i] = i2c_smbus_read_byte_data(client, in lm63_update_lut()
228 data->lut_temp_hyst = i2c_smbus_read_byte_data(client, in lm63_update_lut()
231 data->lut_last_updated = jiffies; in lm63_update_lut()
232 data->lut_valid = 1; in lm63_update_lut()
238 struct lm63_data *data = dev_get_drvdata(dev); in lm63_update_device() local
239 struct i2c_client *client = data->client; in lm63_update_device()
242 mutex_lock(&data->update_lock); in lm63_update_device()
244 next_update = data->last_updated + in lm63_update_device()
245 msecs_to_jiffies(data->update_interval); in lm63_update_device()
246 if (time_after(jiffies, next_update) || !data->valid) { in lm63_update_device()
247 if (data->config & 0x04) { /* tachometer enabled */ in lm63_update_device()
249 data->fan[0] = i2c_smbus_read_byte_data(client, in lm63_update_device()
251 data->fan[0] |= i2c_smbus_read_byte_data(client, in lm63_update_device()
253 data->fan[1] = (i2c_smbus_read_byte_data(client, in lm63_update_device()
259 data->pwm1_freq = i2c_smbus_read_byte_data(client, in lm63_update_device()
261 if (data->pwm1_freq == 0) in lm63_update_device()
262 data->pwm1_freq = 1; in lm63_update_device()
263 data->pwm1[0] = i2c_smbus_read_byte_data(client, in lm63_update_device()
266 data->temp8[0] = i2c_smbus_read_byte_data(client, in lm63_update_device()
268 data->temp8[1] = i2c_smbus_read_byte_data(client, in lm63_update_device()
272 data->temp11[0] = i2c_smbus_read_byte_data(client, in lm63_update_device()
274 data->temp11[0] |= i2c_smbus_read_byte_data(client, in lm63_update_device()
276 data->temp11[1] = (i2c_smbus_read_byte_data(client, in lm63_update_device()
280 data->temp11[2] = (i2c_smbus_read_byte_data(client, in lm63_update_device()
284 data->temp11[3] = (i2c_smbus_read_byte_data(client, in lm63_update_device()
289 if (data->kind == lm96163) in lm63_update_device()
290 data->temp11u = (i2c_smbus_read_byte_data(client, in lm63_update_device()
295 data->temp8[2] = i2c_smbus_read_byte_data(client, in lm63_update_device()
297 data->temp2_crit_hyst = i2c_smbus_read_byte_data(client, in lm63_update_device()
300 data->alarms = i2c_smbus_read_byte_data(client, in lm63_update_device()
303 data->last_updated = jiffies; in lm63_update_device()
304 data->valid = 1; in lm63_update_device()
307 lm63_update_lut(data); in lm63_update_device()
309 mutex_unlock(&data->update_lock); in lm63_update_device()
311 return data; in lm63_update_device()
318 static int lm63_lut_looks_bad(struct device *dev, struct lm63_data *data) in lm63_lut_looks_bad() argument
322 mutex_lock(&data->update_lock); in lm63_lut_looks_bad()
323 lm63_update_lut(data); in lm63_lut_looks_bad()
325 for (i = 1; i < data->lut_size; i++) { in lm63_lut_looks_bad()
326 if (data->pwm1[1 + i - 1] > data->pwm1[1 + i] in lm63_lut_looks_bad()
327 || data->temp8[3 + i - 1] > data->temp8[3 + i]) { in lm63_lut_looks_bad()
334 mutex_unlock(&data->update_lock); in lm63_lut_looks_bad()
336 return i == data->lut_size ? 0 : 1; in lm63_lut_looks_bad()
347 struct lm63_data *data = lm63_update_device(dev); in show_fan() local
348 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[attr->index])); in show_fan()
354 struct lm63_data *data = dev_get_drvdata(dev); in set_fan() local
355 struct i2c_client *client = data->client; in set_fan()
363 mutex_lock(&data->update_lock); in set_fan()
364 data->fan[1] = FAN_TO_REG(val); in set_fan()
366 data->fan[1] & 0xFF); in set_fan()
368 data->fan[1] >> 8); in set_fan()
369 mutex_unlock(&data->update_lock); in set_fan()
377 struct lm63_data *data = lm63_update_device(dev); in show_pwm1() local
381 if (data->pwm_highres) in show_pwm1()
382 pwm = data->pwm1[nr]; in show_pwm1()
384 pwm = data->pwm1[nr] >= 2 * data->pwm1_freq ? in show_pwm1()
385 255 : (data->pwm1[nr] * 255 + data->pwm1_freq) / in show_pwm1()
386 (2 * data->pwm1_freq); in show_pwm1()
395 struct lm63_data *data = dev_get_drvdata(dev); in set_pwm1() local
396 struct i2c_client *client = data->client; in set_pwm1()
402 if (!(data->config_fan & 0x20)) /* register is read-only */ in set_pwm1()
412 mutex_lock(&data->update_lock); in set_pwm1()
413 data->pwm1[nr] = data->pwm_highres ? val : in set_pwm1()
414 (val * data->pwm1_freq * 2 + 127) / 255; in set_pwm1()
415 i2c_smbus_write_byte_data(client, reg, data->pwm1[nr]); in set_pwm1()
416 mutex_unlock(&data->update_lock); in set_pwm1()
423 struct lm63_data *data = lm63_update_device(dev); in show_pwm1_enable() local
424 return sprintf(buf, "%d\n", data->config_fan & 0x20 ? 1 : 2); in show_pwm1_enable()
431 struct lm63_data *data = dev_get_drvdata(dev); in set_pwm1_enable() local
432 struct i2c_client *client = data->client; in set_pwm1_enable()
446 if (val == 2 && lm63_lut_looks_bad(dev, data)) in set_pwm1_enable()
449 mutex_lock(&data->update_lock); in set_pwm1_enable()
450 data->config_fan = i2c_smbus_read_byte_data(client, in set_pwm1_enable()
453 data->config_fan |= 0x20; in set_pwm1_enable()
455 data->config_fan &= ~0x20; in set_pwm1_enable()
457 data->config_fan); in set_pwm1_enable()
458 mutex_unlock(&data->update_lock); in set_pwm1_enable()
473 struct lm63_data *data = lm63_update_device(dev); in show_local_temp8() local
474 return sprintf(buf, "%d\n", TEMP8_FROM_REG(data->temp8[attr->index])); in show_local_temp8()
482 struct lm63_data *data = lm63_update_device(dev); in show_remote_temp8() local
483 return sprintf(buf, "%d\n", temp8_from_reg(data, attr->index) in show_remote_temp8()
484 + data->temp2_offset); in show_remote_temp8()
492 struct lm63_data *data = lm63_update_device(dev); in show_lut_temp() local
493 return sprintf(buf, "%d\n", lut_temp_from_reg(data, attr->index) in show_lut_temp()
494 + data->temp2_offset); in show_lut_temp()
501 struct lm63_data *data = dev_get_drvdata(dev); in set_temp8() local
502 struct i2c_client *client = data->client; in set_temp8()
513 mutex_lock(&data->update_lock); in set_temp8()
517 if (data->remote_unsigned) in set_temp8()
518 temp = TEMP8U_TO_REG(val - data->temp2_offset); in set_temp8()
520 temp = TEMP8_TO_REG(val - data->temp2_offset); in set_temp8()
528 temp = lut_temp_to_reg(data, val); in set_temp8()
530 data->temp8[nr] = temp; in set_temp8()
532 mutex_unlock(&data->update_lock); in set_temp8()
540 struct lm63_data *data = lm63_update_device(dev); in show_temp11() local
549 if (data->temp11u) in show_temp11()
550 temp = TEMP11_FROM_REG(data->temp11u); in show_temp11()
552 temp = TEMP11_FROM_REG(data->temp11[nr]); in show_temp11()
554 if (data->remote_unsigned && nr == 2) in show_temp11()
555 temp = TEMP11_FROM_REG((u16)data->temp11[nr]); in show_temp11()
557 temp = TEMP11_FROM_REG(data->temp11[nr]); in show_temp11()
559 return sprintf(buf, "%d\n", temp + data->temp2_offset); in show_temp11()
575 struct lm63_data *data = dev_get_drvdata(dev); in set_temp11() local
576 struct i2c_client *client = data->client; in set_temp11()
585 mutex_lock(&data->update_lock); in set_temp11()
586 if (data->remote_unsigned && nr == 2) in set_temp11()
587 data->temp11[nr] = TEMP11U_TO_REG(val - data->temp2_offset); in set_temp11()
589 data->temp11[nr] = TEMP11_TO_REG(val - data->temp2_offset); in set_temp11()
592 data->temp11[nr] >> 8); in set_temp11()
594 data->temp11[nr] & 0xff); in set_temp11()
595 mutex_unlock(&data->update_lock); in set_temp11()
606 struct lm63_data *data = lm63_update_device(dev); in show_temp2_crit_hyst() local
607 return sprintf(buf, "%d\n", temp8_from_reg(data, 2) in show_temp2_crit_hyst()
608 + data->temp2_offset in show_temp2_crit_hyst()
609 - TEMP8_FROM_REG(data->temp2_crit_hyst)); in show_temp2_crit_hyst()
616 struct lm63_data *data = lm63_update_device(dev); in show_lut_temp_hyst() local
618 return sprintf(buf, "%d\n", lut_temp_from_reg(data, attr->index) in show_lut_temp_hyst()
619 + data->temp2_offset in show_lut_temp_hyst()
620 - TEMP8_FROM_REG(data->lut_temp_hyst)); in show_lut_temp_hyst()
631 struct lm63_data *data = dev_get_drvdata(dev); in set_temp2_crit_hyst() local
632 struct i2c_client *client = data->client; in set_temp2_crit_hyst()
641 mutex_lock(&data->update_lock); in set_temp2_crit_hyst()
642 hyst = temp8_from_reg(data, 2) + data->temp2_offset - val; in set_temp2_crit_hyst()
645 mutex_unlock(&data->update_lock); in set_temp2_crit_hyst()
653 static void lm63_set_convrate(struct lm63_data *data, unsigned int interval) in lm63_set_convrate() argument
655 struct i2c_client *client = data->client; in lm63_set_convrate()
664 / data->max_convrate_hz; in lm63_set_convrate()
670 data->update_interval = UPDATE_INTERVAL(data->max_convrate_hz, i); in lm63_set_convrate()
676 struct lm63_data *data = dev_get_drvdata(dev); in show_update_interval() local
678 return sprintf(buf, "%u\n", data->update_interval); in show_update_interval()
685 struct lm63_data *data = dev_get_drvdata(dev); in set_update_interval() local
693 mutex_lock(&data->update_lock); in set_update_interval()
694 lm63_set_convrate(data, clamp_val(val, 0, 100000)); in set_update_interval()
695 mutex_unlock(&data->update_lock); in set_update_interval()
703 struct lm63_data *data = dev_get_drvdata(dev); in show_type() local
705 return sprintf(buf, data->trutherm ? "1\n" : "2\n"); in show_type()
711 struct lm63_data *data = dev_get_drvdata(dev); in set_type() local
712 struct i2c_client *client = data->client; in set_type()
723 mutex_lock(&data->update_lock); in set_type()
724 data->trutherm = val == 1; in set_type()
727 reg | (data->trutherm ? 0x02 : 0x00)); in set_type()
728 data->valid = 0; in set_type()
729 mutex_unlock(&data->update_lock); in set_type()
737 struct lm63_data *data = lm63_update_device(dev); in show_alarms() local
738 return sprintf(buf, "%u\n", data->alarms); in show_alarms()
745 struct lm63_data *data = lm63_update_device(dev); in show_alarm() local
748 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); in show_alarm()
949 struct lm63_data *data = dev_get_drvdata(dev); in lm63_attribute_mode() local
952 && (data->kind == lm64 || in lm63_attribute_mode()
953 (data->kind == lm96163 && (data->config & 0x02)))) in lm63_attribute_mode()
1028 static void lm63_init_client(struct lm63_data *data) in lm63_init_client() argument
1030 struct i2c_client *client = data->client; in lm63_init_client()
1034 data->config = i2c_smbus_read_byte_data(client, LM63_REG_CONFIG1); in lm63_init_client()
1035 data->config_fan = i2c_smbus_read_byte_data(client, in lm63_init_client()
1039 if (data->config & 0x40) { /* standby */ in lm63_init_client()
1041 data->config &= 0xA7; in lm63_init_client()
1043 data->config); in lm63_init_client()
1046 if (data->kind == lm64) in lm63_init_client()
1047 data->config |= 0x04; in lm63_init_client()
1050 data->pwm1_freq = i2c_smbus_read_byte_data(client, LM63_REG_PWM_FREQ); in lm63_init_client()
1051 if (data->pwm1_freq == 0) in lm63_init_client()
1052 data->pwm1_freq = 1; in lm63_init_client()
1054 switch (data->kind) { in lm63_init_client()
1057 data->max_convrate_hz = LM63_MAX_CONVRATE_HZ; in lm63_init_client()
1058 data->lut_size = 8; in lm63_init_client()
1061 data->max_convrate_hz = LM96163_MAX_CONVRATE_HZ; in lm63_init_client()
1062 data->lut_size = 12; in lm63_init_client()
1063 data->trutherm in lm63_init_client()
1071 data->update_interval = UPDATE_INTERVAL(data->max_convrate_hz, in lm63_init_client()
1078 if (data->kind == lm96163) { in lm63_init_client()
1083 data->lut_temp_highres = true; in lm63_init_client()
1085 && !(data->config_fan & 0x08) && data->pwm1_freq == 8) in lm63_init_client()
1086 data->pwm_highres = true; in lm63_init_client()
1088 data->remote_unsigned = true; in lm63_init_client()
1092 if (data->kind == lm63) in lm63_init_client()
1094 (data->config & 0x04) ? "tachometer input" : in lm63_init_client()
1097 (data->config_fan & 0x08) ? "1.4" : "360", in lm63_init_client()
1098 ((data->config_fan & 0x08) ? 700 : 180000) / data->pwm1_freq); in lm63_init_client()
1100 (data->config_fan & 0x10) ? "low" : "high", in lm63_init_client()
1101 (data->config_fan & 0x20) ? "manual" : "auto"); in lm63_init_client()
1109 struct lm63_data *data; in lm63_probe() local
1112 data = devm_kzalloc(dev, sizeof(struct lm63_data), GFP_KERNEL); in lm63_probe()
1113 if (!data) in lm63_probe()
1116 data->client = client; in lm63_probe()
1117 mutex_init(&data->update_lock); in lm63_probe()
1120 data->kind = id->driver_data; in lm63_probe()
1121 if (data->kind == lm64) in lm63_probe()
1122 data->temp2_offset = 16000; in lm63_probe()
1125 lm63_init_client(data); in lm63_probe()
1128 data->groups[groups++] = &lm63_group; in lm63_probe()
1129 if (data->config & 0x04) /* tachometer enabled */ in lm63_probe()
1130 data->groups[groups++] = &lm63_group_fan1; in lm63_probe()
1132 if (data->kind == lm96163) { in lm63_probe()
1133 data->groups[groups++] = &lm63_group_temp2_type; in lm63_probe()
1134 data->groups[groups++] = &lm63_group_extra_lut; in lm63_probe()
1138 data, data->groups); in lm63_probe()