Lines Matching +full:msb +full:- +full:justified
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * f75375s.c - driver for the Fintek F75375/SP, F75373 and
5 * Copyright (C) 2006-2007 Riku Voipio
22 #include <linux/hwmon-sysfs.h>
105 * f75387: For remote temperature reading, it uses signed 11-bit
106 * values with LSB = 0.125 degree Celsius, left-justified in 16-bit
107 * registers. For original 8-bit temp readings, the LSB just is 0.
169 if (data->kind == f75387) in f75375_write_pwm()
170 f75375_write16(client, F75375_REG_FAN_EXP(nr), data->pwm[nr]); in f75375_write_pwm()
173 data->pwm[nr]); in f75375_write_pwm()
182 mutex_lock(&data->update_lock); in f75375_update_device()
185 if (time_after(jiffies, data->last_limits + 60 * HZ) in f75375_update_device()
186 || !data->valid) { in f75375_update_device()
188 data->temp_high[nr] = in f75375_update_device()
190 data->temp_max_hyst[nr] = in f75375_update_device()
192 data->fan_max[nr] = in f75375_update_device()
194 data->fan_min[nr] = in f75375_update_device()
196 data->fan_target[nr] = in f75375_update_device()
200 data->in_max[nr] = in f75375_update_device()
202 data->in_min[nr] = in f75375_update_device()
205 data->fan_timer = f75375_read8(client, F75375_REG_FAN_TIMER); in f75375_update_device()
206 data->last_limits = jiffies; in f75375_update_device()
210 if (time_after(jiffies, data->last_updated + 2 * HZ) in f75375_update_device()
211 || !data->valid) { in f75375_update_device()
213 data->pwm[nr] = f75375_read8(client, in f75375_update_device()
215 /* assign MSB, therefore shift it by 8 bits */ in f75375_update_device()
216 data->temp11[nr] = in f75375_update_device()
218 if (data->kind == f75387) in f75375_update_device()
219 /* merge F75387's temperature LSB (11-bit) */ in f75375_update_device()
220 data->temp11[nr] |= in f75375_update_device()
223 data->fan[nr] = in f75375_update_device()
227 data->in[nr] = in f75375_update_device()
230 data->last_updated = jiffies; in f75375_update_device()
231 data->valid = true; in f75375_update_device()
234 mutex_unlock(&data->update_lock); in f75375_update_device()
287 int nr = to_sensor_dev_attr(attr)->index; in set_fan_min()
297 mutex_lock(&data->update_lock); in set_fan_min()
298 data->fan_min[nr] = rpm_to_reg(val); in set_fan_min()
299 f75375_write16(client, F75375_REG_FAN_MIN(nr), data->fan_min[nr]); in set_fan_min()
300 mutex_unlock(&data->update_lock); in set_fan_min()
307 int nr = to_sensor_dev_attr(attr)->index; in set_fan_target()
317 if (auto_mode_enabled(data->pwm_enable[nr])) in set_fan_target()
318 return -EINVAL; in set_fan_target()
319 if (data->kind == f75387 && duty_mode_enabled(data->pwm_enable[nr])) in set_fan_target()
320 return -EINVAL; in set_fan_target()
322 mutex_lock(&data->update_lock); in set_fan_target()
323 data->fan_target[nr] = rpm_to_reg(val); in set_fan_target()
324 f75375_write16(client, F75375_REG_FAN_EXP(nr), data->fan_target[nr]); in set_fan_target()
325 mutex_unlock(&data->update_lock); in set_fan_target()
332 int nr = to_sensor_dev_attr(attr)->index; in set_pwm()
342 if (auto_mode_enabled(data->pwm_enable[nr]) || in set_pwm()
343 !duty_mode_enabled(data->pwm_enable[nr])) in set_pwm()
344 return -EINVAL; in set_pwm()
346 mutex_lock(&data->update_lock); in set_pwm()
347 data->pwm[nr] = clamp_val(val, 0, 255); in set_pwm()
349 mutex_unlock(&data->update_lock); in set_pwm()
356 int nr = to_sensor_dev_attr(attr)->index; in show_pwm_enable()
358 return sprintf(buf, "%d\n", data->pwm_enable[nr]); in show_pwm_enable()
367 return -EINVAL; in set_pwm_enable_direct()
370 if (data->kind == f75387) { in set_pwm_enable_direct()
372 if (duty_mode_enabled(data->pwm_enable[nr]) != in set_pwm_enable_direct()
374 return -EOPNOTSUPP; in set_pwm_enable_direct()
382 data->pwm[nr] = 255; in set_pwm_enable_direct()
403 data->pwm[nr] = 255; in set_pwm_enable_direct()
414 return -EINVAL; in set_pwm_enable_direct()
419 data->pwm_enable[nr] = val; in set_pwm_enable_direct()
428 int nr = to_sensor_dev_attr(attr)->index; in set_pwm_enable()
438 mutex_lock(&data->update_lock); in set_pwm_enable()
440 mutex_unlock(&data->update_lock); in set_pwm_enable()
447 int nr = to_sensor_dev_attr(attr)->index; in set_pwm_mode()
460 return -EINVAL; in set_pwm_mode()
463 if (data->kind == f75373 && val == 0) in set_pwm_mode()
464 return -EINVAL; in set_pwm_mode()
467 if (data->kind == f75387) { in set_pwm_mode()
475 mutex_lock(&data->update_lock); in set_pwm_mode()
483 data->pwm_mode[nr] = val; in set_pwm_mode()
484 mutex_unlock(&data->update_lock); in set_pwm_mode()
491 int nr = to_sensor_dev_attr(attr)->index; in show_pwm()
493 return sprintf(buf, "%d\n", data->pwm[nr]); in show_pwm()
499 int nr = to_sensor_dev_attr(attr)->index; in show_pwm_mode()
501 return sprintf(buf, "%d\n", data->pwm_mode[nr]); in show_pwm_mode()
510 int nr = to_sensor_dev_attr(attr)->index; in show_in()
512 return sprintf(buf, "%d\n", VOLT_FROM_REG(data->in[nr])); in show_in()
518 int nr = to_sensor_dev_attr(attr)->index; in show_in_max()
520 return sprintf(buf, "%d\n", VOLT_FROM_REG(data->in_max[nr])); in show_in_max()
526 int nr = to_sensor_dev_attr(attr)->index; in show_in_min()
528 return sprintf(buf, "%d\n", VOLT_FROM_REG(data->in_min[nr])); in show_in_min()
534 int nr = to_sensor_dev_attr(attr)->index; in set_in_max()
545 mutex_lock(&data->update_lock); in set_in_max()
546 data->in_max[nr] = val; in set_in_max()
547 f75375_write8(client, F75375_REG_VOLT_HIGH(nr), data->in_max[nr]); in set_in_max()
548 mutex_unlock(&data->update_lock); in set_in_max()
555 int nr = to_sensor_dev_attr(attr)->index; in set_in_min()
566 mutex_lock(&data->update_lock); in set_in_min()
567 data->in_min[nr] = val; in set_in_min()
568 f75375_write8(client, F75375_REG_VOLT_LOW(nr), data->in_min[nr]); in set_in_min()
569 mutex_unlock(&data->update_lock); in set_in_min()
579 int nr = to_sensor_dev_attr(attr)->index; in show_temp11()
581 return sprintf(buf, "%d\n", TEMP11_FROM_REG(data->temp11[nr])); in show_temp11()
587 int nr = to_sensor_dev_attr(attr)->index; in show_temp_max()
589 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_high[nr])); in show_temp_max()
595 int nr = to_sensor_dev_attr(attr)->index; in show_temp_max_hyst()
597 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max_hyst[nr])); in show_temp_max_hyst()
603 int nr = to_sensor_dev_attr(attr)->index; in set_temp_max()
614 mutex_lock(&data->update_lock); in set_temp_max()
615 data->temp_high[nr] = val; in set_temp_max()
616 f75375_write8(client, F75375_REG_TEMP_HIGH(nr), data->temp_high[nr]); in set_temp_max()
617 mutex_unlock(&data->update_lock); in set_temp_max()
624 int nr = to_sensor_dev_attr(attr)->index; in set_temp_max_hyst()
635 mutex_lock(&data->update_lock); in set_temp_max_hyst()
636 data->temp_max_hyst[nr] = val; in set_temp_max_hyst()
638 data->temp_max_hyst[nr]); in set_temp_max_hyst()
639 mutex_unlock(&data->update_lock); in set_temp_max_hyst()
647 int nr = to_sensor_dev_attr(attr)->index;\
649 return sprintf(buf, "%d\n", rpm_from_reg(data->thing[nr])); \
764 if (data->kind == f75387) { in f75375_init()
768 data->pwm_mode[nr] = 1; in f75375_init()
774 data->pwm_enable[nr] = 4; in f75375_init()
777 data->pwm_enable[nr] = 3; in f75375_init()
780 data->pwm_enable[nr] = 2; in f75375_init()
783 data->pwm_enable[nr] = 1; in f75375_init()
786 data->pwm_mode[nr] = 1; in f75375_init()
790 data->pwm_enable[nr] = 3; in f75375_init()
793 data->pwm_enable[nr] = 2; in f75375_init()
796 data->pwm_enable[nr] = 1; in f75375_init()
804 set_pwm_enable_direct(client, 0, f75375s_pdata->pwm_enable[0]); in f75375_init()
805 set_pwm_enable_direct(client, 1, f75375s_pdata->pwm_enable[1]); in f75375_init()
807 if (auto_mode_enabled(f75375s_pdata->pwm_enable[nr]) || in f75375_init()
808 !duty_mode_enabled(f75375s_pdata->pwm_enable[nr])) in f75375_init()
810 data->pwm[nr] = clamp_val(f75375s_pdata->pwm[nr], 0, 255); in f75375_init()
820 dev_get_platdata(&client->dev); in f75375_probe()
823 if (!i2c_check_functionality(client->adapter, in f75375_probe()
825 return -EIO; in f75375_probe()
826 data = devm_kzalloc(&client->dev, sizeof(struct f75375_data), in f75375_probe()
829 return -ENOMEM; in f75375_probe()
832 mutex_init(&data->update_lock); in f75375_probe()
833 data->kind = i2c_match_id(f75375_id, client)->driver_data; in f75375_probe()
835 err = sysfs_create_group(&client->dev.kobj, &f75375_group); in f75375_probe()
839 if (data->kind != f75373) { in f75375_probe()
840 err = sysfs_chmod_file(&client->dev.kobj, in f75375_probe()
845 err = sysfs_chmod_file(&client->dev.kobj, in f75375_probe()
852 data->hwmon_dev = hwmon_device_register(&client->dev); in f75375_probe()
853 if (IS_ERR(data->hwmon_dev)) { in f75375_probe()
854 err = PTR_ERR(data->hwmon_dev); in f75375_probe()
863 sysfs_remove_group(&client->dev.kobj, &f75375_group); in f75375_probe()
870 hwmon_device_unregister(data->hwmon_dev); in f75375_remove()
871 sysfs_remove_group(&client->dev.kobj, &f75375_group); in f75375_remove()
874 /* Return 0 if detection is successful, -ENODEV otherwise */
878 struct i2c_adapter *adapter = client->adapter; in f75375_detect()
886 return -ENODEV; in f75375_detect()
895 return -ENODEV; in f75375_detect()
898 dev_info(&adapter->dev, "found %s version: %02X\n", name, version); in f75375_detect()
899 strscpy(info->type, name, I2C_NAME_SIZE); in f75375_detect()