Lines Matching +full:num +full:- +full:addresses

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * asb100.c - Part of lm_sensors, Linux kernel modules for hardware
10 * Copyright (C) 1998 - 2003 Frodo Looijaard <frodol@dds.nl>,
17 * ASB100-A "BACH".
19 * ASB100-A supports pwm1, while plain ASB100 does not. There is no known
32 #include <linux/hwmon-sysfs.h>
33 #include <linux/hwmon-vid.h>
40 /* I2C addresses to scan */
46 "List of subclient addresses: {bus, clientaddr, subclientaddr1, subclientaddr2}");
48 /* Voltage IN registers 0-6 */
53 /* FAN IN registers 1-3 */
57 /* TEMPERATURE registers 1-4 */
86 /* bit 7 -> enable, bits 0-3 -> duty cycle */
115 if (rpm == -1) in FAN_TO_REG()
125 return val == 0 ? -1 : val == 255 ? 0 : 1350000 / (val * div); in FAN_FROM_REG()
129 #define ASB100_TEMP_MIN -128000
133 * TEMP: 0.001C/bit (-128C to +127C)
139 ntemp += (ntemp < 0 ? -500 : 500); in TEMP_TO_REG()
149 * PWM: 0 - 255 per sensors documentation
176 * data is pointed to by client->data. The structure itself is
238 int nr = to_sensor_dev_attr(attr)->index; \
240 return sprintf(buf, "%d\n", IN_FROM_REG(data->reg[nr])); \
251 int nr = to_sensor_dev_attr(attr)->index; \
258 mutex_lock(&data->update_lock); \
259 data->in_##reg[nr] = IN_TO_REG(val); \
261 data->in_##reg[nr]); \
262 mutex_unlock(&data->update_lock); \
289 int nr = to_sensor_dev_attr(attr)->index; in show_fan()
291 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr], in show_fan()
292 DIV_FROM_REG(data->fan_div[nr]))); in show_fan()
298 int nr = to_sensor_dev_attr(attr)->index; in show_fan_min()
300 return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr], in show_fan_min()
301 DIV_FROM_REG(data->fan_div[nr]))); in show_fan_min()
307 int nr = to_sensor_dev_attr(attr)->index; in show_fan_div()
309 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr])); in show_fan_div()
315 int nr = to_sensor_dev_attr(attr)->index; in set_fan_min()
325 mutex_lock(&data->update_lock); in set_fan_min()
326 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); in set_fan_min()
327 asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); in set_fan_min()
328 mutex_unlock(&data->update_lock); in set_fan_min()
341 int nr = to_sensor_dev_attr(attr)->index; in set_fan_div()
353 mutex_lock(&data->update_lock); in set_fan_div()
355 min = FAN_FROM_REG(data->fan_min[nr], in set_fan_div()
356 DIV_FROM_REG(data->fan_div[nr])); in set_fan_div()
357 data->fan_div[nr] = DIV_TO_REG(val); in set_fan_div()
362 reg = (reg & 0xcf) | (data->fan_div[0] << 4); in set_fan_div()
368 reg = (reg & 0x3f) | (data->fan_div[1] << 6); in set_fan_div()
374 reg = (reg & 0x3f) | (data->fan_div[2] << 6); in set_fan_div()
379 data->fan_min[nr] = in set_fan_div()
380 FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); in set_fan_div()
381 asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); in set_fan_div()
383 mutex_unlock(&data->update_lock); in set_fan_div()
390 show_fan, NULL, offset - 1); \
392 show_fan_min, set_fan_min, offset - 1); \
394 show_fan_div, set_fan_div, offset - 1)
420 int nr = to_sensor_dev_attr(attr)->index; \
422 return sprintf_temp_from_reg(data->reg[nr], buf, nr); \
433 int nr = to_sensor_dev_attr(attr)->index; \
440 mutex_lock(&data->update_lock); \
443 data->reg[nr] = LM75_TEMP_TO_REG(val); \
446 data->reg[nr] = TEMP_TO_REG(val); \
450 data->reg[nr]); \
451 mutex_unlock(&data->update_lock); \
458 #define sysfs_temp(num) \ argument
459 static SENSOR_DEVICE_ATTR(temp##num##_input, S_IRUGO, \
460 show_temp, NULL, num - 1); \
461 static SENSOR_DEVICE_ATTR(temp##num##_max, S_IRUGO | S_IWUSR, \
462 show_temp_max, set_temp_max, num - 1); \
463 static SENSOR_DEVICE_ATTR(temp##num##_max_hyst, S_IRUGO | S_IWUSR, \
464 show_temp_hyst, set_temp_hyst, num - 1)
476 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in cpu0_vid_show()
486 return sprintf(buf, "%d\n", data->vrm); in vrm_show()
501 return -EINVAL; in vrm_store()
503 data->vrm = val; in vrm_store()
514 return sprintf(buf, "%u\n", data->alarms); in alarms_show()
522 int bitnr = to_sensor_dev_attr(attr)->index; in show_alarm()
524 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); in show_alarm()
543 return sprintf(buf, "%d\n", ASB100_PWM_FROM_REG(data->pwm & 0x0f)); in pwm1_show()
558 mutex_lock(&data->update_lock); in pwm1_store()
559 data->pwm &= 0x80; /* keep the enable bit */ in pwm1_store()
560 data->pwm |= (0x0f & ASB100_PWM_TO_REG(val)); in pwm1_store()
561 asb100_write_value(client, ASB100_REG_PWM1, data->pwm); in pwm1_store()
562 mutex_unlock(&data->update_lock); in pwm1_store()
570 return sprintf(buf, "%d\n", (data->pwm & 0x80) ? 1 : 0); in pwm1_enable_show()
586 mutex_lock(&data->update_lock); in pwm1_enable_store()
587 data->pwm &= 0x0f; /* keep the duty cycle bits */ in pwm1_enable_store()
588 data->pwm |= (val ? 0x80 : 0x00); in pwm1_enable_store()
589 asb100_write_value(client, ASB100_REG_PWM1, data->pwm); in pwm1_enable_store()
590 mutex_unlock(&data->update_lock); in pwm1_enable_store()
671 int address = client->addr; in asb100_detect_subclients()
674 struct i2c_adapter *adapter = client->adapter; in asb100_detect_subclients()
682 dev_err(&client->dev, in asb100_detect_subclients()
683 "invalid subclient address %d; must be 0x48-0x4f\n", in asb100_detect_subclients()
685 err = -ENODEV; in asb100_detect_subclients()
701 dev_err(&client->dev, in asb100_detect_subclients()
702 "duplicate addresses 0x%x for subclients\n", in asb100_detect_subclients()
704 err = -ENODEV; in asb100_detect_subclients()
708 data->lm75[0] = i2c_new_dummy_device(adapter, sc_addr[0]); in asb100_detect_subclients()
709 if (IS_ERR(data->lm75[0])) { in asb100_detect_subclients()
710 dev_err(&client->dev, in asb100_detect_subclients()
713 err = PTR_ERR(data->lm75[0]); in asb100_detect_subclients()
717 data->lm75[1] = i2c_new_dummy_device(adapter, sc_addr[1]); in asb100_detect_subclients()
718 if (IS_ERR(data->lm75[1])) { in asb100_detect_subclients()
719 dev_err(&client->dev, in asb100_detect_subclients()
722 err = PTR_ERR(data->lm75[1]); in asb100_detect_subclients()
730 i2c_unregister_device(data->lm75[0]); in asb100_detect_subclients()
735 /* Return 0 if detection is successful, -ENODEV otherwise */
739 struct i2c_adapter *adapter = client->adapter; in asb100_detect()
744 return -ENODEV; in asb100_detect()
757 return -ENODEV; in asb100_detect()
770 return -ENODEV; in asb100_detect()
772 strscpy(info->type, "asb100", I2C_NAME_SIZE); in asb100_detect()
782 data = devm_kzalloc(&client->dev, sizeof(struct asb100_data), in asb100_probe()
785 return -ENOMEM; in asb100_probe()
788 mutex_init(&data->lock); in asb100_probe()
789 mutex_init(&data->update_lock); in asb100_probe()
800 data->fan_min[0] = asb100_read_value(client, ASB100_REG_FAN_MIN(0)); in asb100_probe()
801 data->fan_min[1] = asb100_read_value(client, ASB100_REG_FAN_MIN(1)); in asb100_probe()
802 data->fan_min[2] = asb100_read_value(client, ASB100_REG_FAN_MIN(2)); in asb100_probe()
805 err = sysfs_create_group(&client->dev.kobj, &asb100_group); in asb100_probe()
809 data->hwmon_dev = hwmon_device_register(&client->dev); in asb100_probe()
810 if (IS_ERR(data->hwmon_dev)) { in asb100_probe()
811 err = PTR_ERR(data->hwmon_dev); in asb100_probe()
818 sysfs_remove_group(&client->dev.kobj, &asb100_group); in asb100_probe()
820 i2c_unregister_device(data->lm75[1]); in asb100_probe()
821 i2c_unregister_device(data->lm75[0]); in asb100_probe()
829 hwmon_device_unregister(data->hwmon_dev); in asb100_remove()
830 sysfs_remove_group(&client->dev.kobj, &asb100_group); in asb100_remove()
832 i2c_unregister_device(data->lm75[1]); in asb100_remove()
833 i2c_unregister_device(data->lm75[0]); in asb100_remove()
846 mutex_lock(&data->lock); in asb100_read_value()
857 cl = data->lm75[bank - 1]; in asb100_read_value()
859 /* convert from ISA to LM75 I2C addresses */ in asb100_read_value()
880 mutex_unlock(&data->lock); in asb100_read_value()
891 mutex_lock(&data->lock); in asb100_write_value()
902 cl = data->lm75[bank - 1]; in asb100_write_value()
904 /* convert from ISA to LM75 I2C addresses */ in asb100_write_value()
921 mutex_unlock(&data->lock); in asb100_write_value()
928 data->vrm = vid_which_vrm(); in asb100_init_client()
941 mutex_lock(&data->update_lock); in asb100_update_device()
943 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) in asb100_update_device()
944 || !data->valid) { in asb100_update_device()
946 dev_dbg(&client->dev, "starting device update...\n"); in asb100_update_device()
950 data->in[i] = asb100_read_value(client, in asb100_update_device()
952 data->in_min[i] = asb100_read_value(client, in asb100_update_device()
954 data->in_max[i] = asb100_read_value(client, in asb100_update_device()
960 data->fan[i] = asb100_read_value(client, in asb100_update_device()
962 data->fan_min[i] = asb100_read_value(client, in asb100_update_device()
968 data->temp[i-1] = asb100_read_value(client, in asb100_update_device()
970 data->temp_max[i-1] = asb100_read_value(client, in asb100_update_device()
972 data->temp_hyst[i-1] = asb100_read_value(client, in asb100_update_device()
978 data->vid = i & 0x0f; in asb100_update_device()
979 data->vid |= (asb100_read_value(client, in asb100_update_device()
981 data->fan_div[0] = (i >> 4) & 0x03; in asb100_update_device()
982 data->fan_div[1] = (i >> 6) & 0x03; in asb100_update_device()
983 data->fan_div[2] = (asb100_read_value(client, in asb100_update_device()
987 data->pwm = asb100_read_value(client, ASB100_REG_PWM1); in asb100_update_device()
990 data->alarms = asb100_read_value(client, ASB100_REG_ALARM1) + in asb100_update_device()
993 data->last_updated = jiffies; in asb100_update_device()
994 data->valid = true; in asb100_update_device()
996 dev_dbg(&client->dev, "... device update complete\n"); in asb100_update_device()
999 mutex_unlock(&data->update_lock); in asb100_update_device()