Lines Matching +full:nr +full:- +full:outputs
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * nct6683 - Driver for the hardware monitoring functionality of
6 * Copyright (C) 2013 Guenter Roeck <linux@roeck-us.net>
9 * Copyright (C) 2012, 2013 Guenter Roeck <linux@roeck-us.net>
31 #include <linux/hwmon-sysfs.h>
58 * Super-I/O constants and functions
104 return -EBUSY; in superio_enter()
301 /* ------------------------------------------------------- */
358 u8 nr; member
363 bool s2; /* true if both index and nr are used */
389 .u.s.nr = _nr, \
423 return ERR_PTR(-EINVAL); in nct6683_create_attr_group()
425 t = tg->templates; in nct6683_create_attr_group()
430 return ERR_PTR(-EINVAL); in nct6683_create_attr_group()
434 return ERR_PTR(-ENOMEM); in nct6683_create_attr_group()
439 return ERR_PTR(-ENOMEM); in nct6683_create_attr_group()
444 return ERR_PTR(-ENOMEM); in nct6683_create_attr_group()
446 group->attrs = attrs; in nct6683_create_attr_group()
447 group->is_visible = tg->is_visible; in nct6683_create_attr_group()
450 t = tg->templates; in nct6683_create_attr_group()
452 snprintf(su->name, sizeof(su->name), in nct6683_create_attr_group()
453 (*t)->dev_attr.attr.name, tg->base + i); in nct6683_create_attr_group()
454 if ((*t)->s2) { in nct6683_create_attr_group()
455 a2 = &su->u.a2; in nct6683_create_attr_group()
456 sysfs_attr_init(&a2->dev_attr.attr); in nct6683_create_attr_group()
457 a2->dev_attr.attr.name = su->name; in nct6683_create_attr_group()
458 a2->nr = (*t)->u.s.nr + i; in nct6683_create_attr_group()
459 a2->index = (*t)->u.s.index; in nct6683_create_attr_group()
460 a2->dev_attr.attr.mode = in nct6683_create_attr_group()
461 (*t)->dev_attr.attr.mode; in nct6683_create_attr_group()
462 a2->dev_attr.show = (*t)->dev_attr.show; in nct6683_create_attr_group()
463 a2->dev_attr.store = (*t)->dev_attr.store; in nct6683_create_attr_group()
464 *attrs = &a2->dev_attr.attr; in nct6683_create_attr_group()
466 a = &su->u.a1; in nct6683_create_attr_group()
467 sysfs_attr_init(&a->dev_attr.attr); in nct6683_create_attr_group()
468 a->dev_attr.attr.name = su->name; in nct6683_create_attr_group()
469 a->index = (*t)->u.index + i; in nct6683_create_attr_group()
470 a->dev_attr.attr.mode = in nct6683_create_attr_group()
471 (*t)->dev_attr.attr.mode; in nct6683_create_attr_group()
472 a->dev_attr.show = (*t)->dev_attr.show; in nct6683_create_attr_group()
473 a->dev_attr.store = (*t)->dev_attr.store; in nct6683_create_attr_group()
474 *attrs = &a->dev_attr.attr; in nct6683_create_attr_group()
505 outb_p(0xff, data->addr + EC_PAGE_REG); /* unlock */ in nct6683_read()
506 outb_p(reg >> 8, data->addr + EC_PAGE_REG); in nct6683_read()
507 outb_p(reg & 0xff, data->addr + EC_INDEX_REG); in nct6683_read()
508 res = inb_p(data->addr + EC_DATA_REG); in nct6683_read()
519 outb_p(0xff, data->addr + EC_PAGE_REG); /* unlock */ in nct6683_write()
520 outb_p(reg >> 8, data->addr + EC_PAGE_REG); in nct6683_write()
521 outb_p(reg & 0xff, data->addr + EC_INDEX_REG); in nct6683_write()
522 outb_p(value & 0xff, data->addr + EC_DATA_REG); in nct6683_write()
525 static int get_in_reg(struct nct6683_data *data, int nr, int index) in get_in_reg() argument
527 int ch = data->in_index[index]; in get_in_reg()
528 int reg = -EINVAL; in get_in_reg()
530 switch (nr) { in get_in_reg()
535 if (data->customer_id != NCT6683_CUSTOMER_ID_INTEL) in get_in_reg()
539 if (data->customer_id != NCT6683_CUSTOMER_ID_INTEL) in get_in_reg()
548 static int get_temp_reg(struct nct6683_data *data, int nr, int index) in get_temp_reg() argument
550 int ch = data->temp_index[index]; in get_temp_reg()
551 int reg = -EINVAL; in get_temp_reg()
553 switch (data->customer_id) { in get_temp_reg()
555 switch (nr) { in get_temp_reg()
567 switch (nr) { in get_temp_reg()
593 if (!(data->have_pwm & (1 << i))) in nct6683_update_pwm()
595 data->pwm[i] = nct6683_read(data, NCT6683_REG_PWM(i)); in nct6683_update_pwm()
604 mutex_lock(&data->update_lock); in nct6683_update_device()
606 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { in nct6683_update_device()
608 for (i = 0; i < data->in_num; i++) { in nct6683_update_device()
613 data->in[j][i] = in nct6683_update_device()
619 for (i = 0; i < data->temp_num; i++) { in nct6683_update_device()
620 u8 ch = data->temp_index[i]; in nct6683_update_device()
622 data->temp_in[i] = nct6683_read16(data, in nct6683_update_device()
628 data->temp[j][i] = in nct6683_update_device()
634 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) { in nct6683_update_device()
635 if (!(data->have_fan & (1 << i))) in nct6683_update_device()
638 data->rpm[i] = nct6683_read16(data, in nct6683_update_device()
640 data->fan_min[i] = nct6683_read16(data, in nct6683_update_device()
646 data->last_updated = jiffies; in nct6683_update_device()
647 data->valid = true; in nct6683_update_device()
650 mutex_unlock(&data->update_lock); in nct6683_update_device()
662 int nr = sattr->index; in show_in_label() local
664 return sprintf(buf, "%s\n", nct6683_mon_label[data->in_src[nr]]); in show_in_label()
672 int index = sattr->index; in show_in_reg()
673 int nr = sattr->nr; in show_in_reg() local
676 in_from_reg(data->in[index][nr], data->in_index[index])); in show_in_reg()
684 int nr = index % 4; /* attribute */ in nct6683_in_is_visible() local
690 if ((nr == 2 || nr == 3) && in nct6683_in_is_visible()
691 data->customer_id == NCT6683_CUSTOMER_ID_INTEL) in nct6683_in_is_visible()
694 return attr->mode; in nct6683_in_is_visible()
721 return sprintf(buf, "%d\n", data->rpm[sattr->index]); in show_fan()
729 int nr = sattr->index; in show_fan_min() local
731 return sprintf(buf, "%d\n", data->fan_min[nr]); in show_fan_min()
741 ((data->fanin_cfg[sattr->index] >> 5) & 0x03) + 1); in show_fan_pulses()
750 int nr = index % 3; /* attribute index */ in nct6683_fan_is_visible() local
752 if (!(data->have_fan & (1 << fan))) in nct6683_fan_is_visible()
759 if (nr == 2 && data->customer_id == NCT6683_CUSTOMER_ID_INTEL) in nct6683_fan_is_visible()
762 return attr->mode; in nct6683_fan_is_visible()
792 int nr = sattr->index; in show_temp_label() local
794 return sprintf(buf, "%s\n", nct6683_mon_label[data->temp_src[nr]]); in show_temp_label()
802 int index = sattr->index; in show_temp8()
803 int nr = sattr->nr; in show_temp8() local
805 return sprintf(buf, "%d\n", data->temp[index][nr] * 1000); in show_temp8()
813 int nr = sattr->index; in show_temp_hyst() local
814 int temp = data->temp[1][nr] - data->temp[2][nr]; in show_temp_hyst()
824 int index = sattr->index; in show_temp16()
826 return sprintf(buf, "%d\n", (data->temp_in[index] / 128) * 500); in show_temp16()
858 int nr = sattr->index; in show_temp_type() local
859 return sprintf(buf, "%d\n", get_temp_type(data->temp_src[nr])); in show_temp_type()
868 int nr = index % 7; /* attribute index */ in nct6683_temp_is_visible() local
874 if ((nr == 2 || nr == 4) && in nct6683_temp_is_visible()
875 data->customer_id == NCT6683_CUSTOMER_ID_INTEL) in nct6683_temp_is_visible()
878 if (nr == 6 && get_temp_type(data->temp_src[temp]) == 0) in nct6683_temp_is_visible()
881 return attr->mode; in nct6683_temp_is_visible()
920 int index = sattr->index; in show_pwm()
922 return sprintf(buf, "%d\n", data->pwm[index]); in show_pwm()
931 int index = sattr->index; in store_pwm()
935 return -EINVAL; in store_pwm()
937 mutex_lock(&data->update_lock); in store_pwm()
942 mutex_unlock(&data->update_lock); in store_pwm()
956 if (!(data->have_pwm & (1 << pwm))) in nct6683_pwm_is_visible()
960 if (data->customer_id == NCT6683_CUSTOMER_ID_MITAC) in nct6683_pwm_is_visible()
961 return attr->mode | S_IWUSR; in nct6683_pwm_is_visible()
963 return attr->mode; in nct6683_pwm_is_visible()
984 mutex_lock(&data->update_lock); in beep_enable_show()
986 ret = superio_enter(data->sioreg); in beep_enable_show()
989 superio_select(data->sioreg, NCT6683_LD_HWM); in beep_enable_show()
990 reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP); in beep_enable_show()
991 superio_exit(data->sioreg); in beep_enable_show()
993 mutex_unlock(&data->update_lock); in beep_enable_show()
998 mutex_unlock(&data->update_lock); in beep_enable_show()
1012 return -EINVAL; in beep_enable_store()
1014 mutex_lock(&data->update_lock); in beep_enable_store()
1016 ret = superio_enter(data->sioreg); in beep_enable_store()
1022 superio_select(data->sioreg, NCT6683_LD_HWM); in beep_enable_store()
1023 reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP); in beep_enable_store()
1028 superio_outb(data->sioreg, NCT6683_REG_CR_BEEP, reg); in beep_enable_store()
1029 superio_exit(data->sioreg); in beep_enable_store()
1031 mutex_unlock(&data->update_lock); in beep_enable_store()
1045 mutex_lock(&data->update_lock); in intrusion0_alarm_show()
1047 ret = superio_enter(data->sioreg); in intrusion0_alarm_show()
1050 superio_select(data->sioreg, NCT6683_LD_ACPI); in intrusion0_alarm_show()
1051 reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN); in intrusion0_alarm_show()
1052 superio_exit(data->sioreg); in intrusion0_alarm_show()
1054 mutex_unlock(&data->update_lock); in intrusion0_alarm_show()
1059 mutex_unlock(&data->update_lock); in intrusion0_alarm_show()
1073 return -EINVAL; in intrusion0_alarm_store()
1075 mutex_lock(&data->update_lock); in intrusion0_alarm_store()
1082 ret = superio_enter(data->sioreg); in intrusion0_alarm_store()
1088 superio_select(data->sioreg, NCT6683_LD_ACPI); in intrusion0_alarm_store()
1089 reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN); in intrusion0_alarm_store()
1091 superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg); in intrusion0_alarm_store()
1093 superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg); in intrusion0_alarm_store()
1094 superio_exit(data->sioreg); in intrusion0_alarm_store()
1096 data->valid = false; /* Force cache refresh */ in intrusion0_alarm_store()
1098 mutex_unlock(&data->update_lock); in intrusion0_alarm_store()
1128 * or as output. A maximum of 16 inputs and 8 outputs is configurable.
1139 data->have_fan |= 1 << i; in nct6683_setup_fans()
1140 data->fanin_cfg[i] = reg; in nct6683_setup_fans()
1145 data->have_pwm |= 1 << i; in nct6683_setup_fans()
1146 data->fanout_cfg[i] = reg; in nct6683_setup_fans()
1171 data->temp_num = 0; in nct6683_setup_sensors()
1172 data->in_num = 0; in nct6683_setup_sensors()
1182 data->temp_index[data->temp_num] = i; in nct6683_setup_sensors()
1183 data->temp_src[data->temp_num] = reg; in nct6683_setup_sensors()
1184 data->temp_num++; in nct6683_setup_sensors()
1186 data->in_index[data->in_num] = i; in nct6683_setup_sensors()
1187 data->in_src[data->in_num] = reg; in nct6683_setup_sensors()
1188 data->in_num++; in nct6683_setup_sensors()
1195 struct device *dev = &pdev->dev; in nct6683_probe()
1196 struct nct6683_sio_data *sio_data = dev->platform_data; in nct6683_probe()
1205 if (!devm_request_region(dev, res->start, IOREGION_LENGTH, DRVNAME)) in nct6683_probe()
1206 return -EBUSY; in nct6683_probe()
1210 return -ENOMEM; in nct6683_probe()
1212 data->kind = sio_data->kind; in nct6683_probe()
1213 data->sioreg = sio_data->sioreg; in nct6683_probe()
1214 data->addr = res->start; in nct6683_probe()
1215 mutex_init(&data->update_lock); in nct6683_probe()
1218 data->customer_id = nct6683_read16(data, NCT6683_REG_CUSTOMER_ID); in nct6683_probe()
1221 switch (data->customer_id) { in nct6683_probe()
1244 return -ENODEV; in nct6683_probe()
1245 dev_warn(dev, "Enabling support for unknown customer ID 0x%04x\n", data->customer_id); in nct6683_probe()
1255 if (data->have_pwm) { in nct6683_probe()
1258 fls(data->have_pwm)); in nct6683_probe()
1261 data->groups[groups++] = group; in nct6683_probe()
1264 if (data->in_num) { in nct6683_probe()
1267 data->in_num); in nct6683_probe()
1270 data->groups[groups++] = group; in nct6683_probe()
1273 if (data->have_fan) { in nct6683_probe()
1276 fls(data->have_fan)); in nct6683_probe()
1279 data->groups[groups++] = group; in nct6683_probe()
1282 if (data->temp_num) { in nct6683_probe()
1285 data->temp_num); in nct6683_probe()
1288 data->groups[groups++] = group; in nct6683_probe()
1290 data->groups[groups++] = &nct6683_group_other; in nct6683_probe()
1292 if (data->customer_id == NCT6683_CUSTOMER_ID_INTEL) in nct6683_probe()
1304 nct6683_chip_names[data->kind], in nct6683_probe()
1310 nct6683_device_names[data->kind], data, data->groups); in nct6683_probe()
1319 mutex_lock(&data->update_lock); in nct6683_suspend()
1320 data->hwm_cfg = nct6683_read(data, NCT6683_HWM_CFG); in nct6683_suspend()
1321 mutex_unlock(&data->update_lock); in nct6683_suspend()
1330 mutex_lock(&data->update_lock); in nct6683_resume()
1332 nct6683_write(data, NCT6683_HWM_CFG, data->hwm_cfg); in nct6683_resume()
1334 /* Force re-reading all values */ in nct6683_resume()
1335 data->valid = false; in nct6683_resume()
1336 mutex_unlock(&data->update_lock); in nct6683_resume()
1376 sio_data->kind = nct6683; in nct6683_find()
1379 sio_data->kind = nct6686; in nct6683_find()
1382 sio_data->kind = nct6687; in nct6683_find()
1409 nct6683_chip_names[sio_data->kind], sioaddr, addr); in nct6683_find()
1410 sio_data->sioreg = sioaddr; in nct6683_find()
1416 return -ENODEV; in nct6683_find()
1420 * when Super-I/O functions move to a separate file, the Super-I/O
1441 * initialize sio_data->kind and sio_data->sioreg. in sensors_nct6683_init()
1443 * when Super-I/O functions move to a separate file, the Super-I/O in sensors_nct6683_init()
1444 * driver will probe 0x2e and 0x4e and auto-detect the presence of a in sensors_nct6683_init()
1456 err = -ENOMEM; in sensors_nct6683_init()
1468 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; in sensors_nct6683_init()
1488 err = -ENODEV; in sensors_nct6683_init()
1497 while (--i >= 0) { in sensors_nct6683_init()
1517 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");