Lines Matching +full:reg +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * nct6775 - Driver for the hardware monitoring functionality of
4 * Nuvoton NCT677x Super-I/O chips
6 * Copyright (C) 2012 Guenter Roeck <linux@roeck-us.net>
9 * Copyright (C) 2005-2012 Jean Delvare <jdelvare@suse.de>
14 * Copyright (C) 2010 Sheng-Yuan Huang (Nuvoton) (PS00)
49 #include <linux/hwmon-sysfs.h>
50 #include <linux/hwmon-vid.h>
65 /* used to set data->name = nct6775_device_names[data->sio_kind] */
107 * Super-I/O constants and functions
137 superio_outb(int ioreg, int reg, int val) in superio_outb() argument
139 outb(reg, ioreg); in superio_outb()
144 superio_inb(int ioreg, int reg) in superio_inb() argument
146 outb(reg, ioreg); in superio_inb()
164 return -EBUSY; in superio_enter()
210 /* Common and NCT6775 specific data */
239 17, -1, -1, -1, -1, -1, -1, /* in8..in14 */
240 -1, /* unused */
241 6, 7, 11, -1, -1, /* fan1..fan5 */
242 -1, -1, -1, /* unused */
243 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
244 12, -1 }; /* intrusion0, intrusion1 */
258 17, -1, -1, -1, -1, -1, -1, /* in8..in14 */
260 6, 7, 11, 28, -1, /* fan1..fan5 */
261 -1, -1, -1, /* unused */
262 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
263 12, -1 }; /* intrusion0, intrusion1 */
340 #define NCT6775_AUTO_TEMP(data, nr, p) ((data)->REG_AUTO_TEMP[nr] + (p)) argument
341 #define NCT6775_AUTO_PWM(data, nr, p) ((data)->REG_AUTO_PWM[nr] + (p)) argument
355 "AMD SB-TSI",
394 /* NCT6776 specific data */
402 17, -1, -1, -1, -1, -1, -1, /* in8..in14 */
403 -1, /* unused */
405 -1, -1, -1, /* unused */
406 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
413 8, -1, -1, -1, -1, -1, -1, /* in8..in14 */
416 -1, -1, -1, /* unused */
477 /* NCT6779 specific data */
489 -1, /* unused */
491 -1, -1, -1, /* unused */
492 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
500 -1, -1, -1, /* unused */
501 16, 17, -1, -1, -1, -1, /* temp1..temp6 */
578 /* NCT6791 specific data */
595 -1, /* unused */
597 -1, -1, /* unused */
598 4, 5, 13, -1, -1, -1, /* temp1..temp6 */
601 /* NCT6792/NCT6793 specific data */
798 /* NCT6102D/NCT6106D specific data */
869 9, -1, -1, -1, -1, -1, -1, /* in8..in14 */
870 -1, /* unused */
871 32, 33, 34, -1, -1, /* fan1..fan5 */
872 -1, -1, -1, /* unused */
874 48, -1 /* intrusion0, intrusion1 */
882 9, 10, 11, 12, -1, -1, -1, /* in8..in14 */
885 -1, -1, -1, /* unused */
887 34, -1 /* intrusion0, intrusion1 */
901 /* NCT6112D/NCT6114D/NCT6116D specific data */
947 9, -1, -1, -1, -1, -1, -1, /* in8..in9 */
948 -1, /* unused */
950 -1, -1, -1, /* unused */
951 16, 17, 18, -1, -1, -1, /* temp1..temp6 */
952 48, -1 /* intrusion0, intrusion1 */
957 9, 10, 11, 12, -1, -1, -1, /* in8..in14 */
960 -1, -1, -1, /* unused */
961 16, 17, 18, -1, -1, -1, /* temp1..temp6 */
962 34, -1 /* intrusion0, intrusion1 */
976 return mode - 1; in pwm_enable_to_reg()
984 static unsigned int step_time_from_reg(u8 reg, u8 mode) in step_time_from_reg() argument
986 return mode ? 400 * reg : 100 * reg; in step_time_from_reg()
995 static unsigned int fan_from_reg8(u16 reg, unsigned int divreg) in fan_from_reg8() argument
997 if (reg == 0 || reg == 255) in fan_from_reg8()
999 return 1350000U / (reg << divreg); in fan_from_reg8()
1002 static unsigned int fan_from_reg13(u16 reg, unsigned int divreg) in fan_from_reg13() argument
1004 if ((reg & 0xff1f) == 0xff1f) in fan_from_reg13()
1007 reg = (reg & 0x1f) | ((reg & 0xff00) >> 3); in fan_from_reg13()
1009 if (reg == 0) in fan_from_reg13()
1012 return 1350000U / reg; in fan_from_reg13()
1015 static unsigned int fan_from_reg16(u16 reg, unsigned int divreg) in fan_from_reg16() argument
1017 if (reg == 0 || reg == 0xffff) in fan_from_reg16()
1024 return 1350000U / (reg << divreg); in fan_from_reg16()
1027 static unsigned int fan_from_reg_rpm(u16 reg, unsigned int divreg) in fan_from_reg_rpm() argument
1029 return reg; in fan_from_reg_rpm()
1041 div_from_reg(u8 reg) in div_from_reg() argument
1043 return BIT(reg); in div_from_reg()
1055 static inline long in_from_reg(u8 reg, u8 nr) in in_from_reg() argument
1057 return DIV_ROUND_CLOSEST(reg * scale_in[nr], 100); in in_from_reg()
1066 * Data structures and manipulation thereof
1136 unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg);
1137 unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg);
1167 u8 pwm_mode[NUM_FAN]; /* 0->DC variable voltage,
1168 * 1->PWM variable duty cycle
1171 /* 0->off
1172 * 1->manual
1173 * 2->thermal cruise mode (also called SmartFan I)
1174 * 3->fan speed cruise mode
1175 * 4->SmartFan III
1176 * 5->enhanced variable thermal cruise (SmartFan IV)
1200 u8 weight_temp[3][NUM_FAN]; /* 0->temp_step, 1->temp_step_tol,
1201 * 2->temp_base
1294 return ERR_PTR(-EINVAL); in nct6775_create_attr_group()
1296 t = tg->templates; in nct6775_create_attr_group()
1301 return ERR_PTR(-EINVAL); in nct6775_create_attr_group()
1305 return ERR_PTR(-ENOMEM); in nct6775_create_attr_group()
1310 return ERR_PTR(-ENOMEM); in nct6775_create_attr_group()
1315 return ERR_PTR(-ENOMEM); in nct6775_create_attr_group()
1317 group->attrs = attrs; in nct6775_create_attr_group()
1318 group->is_visible = tg->is_visible; in nct6775_create_attr_group()
1321 t = tg->templates; in nct6775_create_attr_group()
1323 snprintf(su->name, sizeof(su->name), in nct6775_create_attr_group()
1324 (*t)->dev_attr.attr.name, tg->base + i); in nct6775_create_attr_group()
1325 if ((*t)->s2) { in nct6775_create_attr_group()
1326 a2 = &su->u.a2; in nct6775_create_attr_group()
1327 sysfs_attr_init(&a2->dev_attr.attr); in nct6775_create_attr_group()
1328 a2->dev_attr.attr.name = su->name; in nct6775_create_attr_group()
1329 a2->nr = (*t)->u.s.nr + i; in nct6775_create_attr_group()
1330 a2->index = (*t)->u.s.index; in nct6775_create_attr_group()
1331 a2->dev_attr.attr.mode = in nct6775_create_attr_group()
1332 (*t)->dev_attr.attr.mode; in nct6775_create_attr_group()
1333 a2->dev_attr.show = (*t)->dev_attr.show; in nct6775_create_attr_group()
1334 a2->dev_attr.store = (*t)->dev_attr.store; in nct6775_create_attr_group()
1335 *attrs = &a2->dev_attr.attr; in nct6775_create_attr_group()
1337 a = &su->u.a1; in nct6775_create_attr_group()
1338 sysfs_attr_init(&a->dev_attr.attr); in nct6775_create_attr_group()
1339 a->dev_attr.attr.name = su->name; in nct6775_create_attr_group()
1340 a->index = (*t)->u.index + i; in nct6775_create_attr_group()
1341 a->dev_attr.attr.mode = in nct6775_create_attr_group()
1342 (*t)->dev_attr.attr.mode; in nct6775_create_attr_group()
1343 a->dev_attr.show = (*t)->dev_attr.show; in nct6775_create_attr_group()
1344 a->dev_attr.store = (*t)->dev_attr.store; in nct6775_create_attr_group()
1345 *attrs = &a->dev_attr.attr; in nct6775_create_attr_group()
1356 static bool is_word_sized(struct nct6775_data *data, u16 reg) in is_word_sized() argument
1358 switch (data->kind) { in is_word_sized()
1360 return reg == 0x20 || reg == 0x22 || reg == 0x24 || in is_word_sized()
1361 reg == 0xe0 || reg == 0xe2 || reg == 0xe4 || in is_word_sized()
1362 reg == 0x111 || reg == 0x121 || reg == 0x131; in is_word_sized()
1364 return reg == 0x20 || reg == 0x22 || reg == 0x24 || in is_word_sized()
1365 reg == 0x26 || reg == 0x28 || reg == 0xe0 || reg == 0xe2 || in is_word_sized()
1366 reg == 0xe4 || reg == 0xe6 || reg == 0xe8 || reg == 0x111 || in is_word_sized()
1367 reg == 0x121 || reg == 0x131 || reg == 0x191 || reg == 0x1a1; in is_word_sized()
1369 return (((reg & 0xff00) == 0x100 || in is_word_sized()
1370 (reg & 0xff00) == 0x200) && in is_word_sized()
1371 ((reg & 0x00ff) == 0x50 || in is_word_sized()
1372 (reg & 0x00ff) == 0x53 || in is_word_sized()
1373 (reg & 0x00ff) == 0x55)) || in is_word_sized()
1374 (reg & 0xfff0) == 0x630 || in is_word_sized()
1375 reg == 0x640 || reg == 0x642 || in is_word_sized()
1376 reg == 0x662 || in is_word_sized()
1377 ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) || in is_word_sized()
1378 reg == 0x73 || reg == 0x75 || reg == 0x77; in is_word_sized()
1380 return (((reg & 0xff00) == 0x100 || in is_word_sized()
1381 (reg & 0xff00) == 0x200) && in is_word_sized()
1382 ((reg & 0x00ff) == 0x50 || in is_word_sized()
1383 (reg & 0x00ff) == 0x53 || in is_word_sized()
1384 (reg & 0x00ff) == 0x55)) || in is_word_sized()
1385 (reg & 0xfff0) == 0x630 || in is_word_sized()
1386 reg == 0x402 || in is_word_sized()
1387 reg == 0x640 || reg == 0x642 || in is_word_sized()
1388 ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) || in is_word_sized()
1389 reg == 0x73 || reg == 0x75 || reg == 0x77; in is_word_sized()
1398 return reg == 0x150 || reg == 0x153 || reg == 0x155 || in is_word_sized()
1399 (reg & 0xfff0) == 0x4c0 || in is_word_sized()
1400 reg == 0x402 || in is_word_sized()
1401 reg == 0x63a || reg == 0x63c || reg == 0x63e || in is_word_sized()
1402 reg == 0x640 || reg == 0x642 || reg == 0x64a || in is_word_sized()
1403 reg == 0x64c || in is_word_sized()
1404 reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 || in is_word_sized()
1405 reg == 0x7b || reg == 0x7d; in is_word_sized()
1411 * On older chips, only registers 0x50-0x5f are banked.
1416 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg) in nct6775_set_bank() argument
1418 u8 bank = reg >> 8; in nct6775_set_bank()
1420 if (data->bank != bank) { in nct6775_set_bank()
1421 outb_p(NCT6775_REG_BANK, data->addr + ADDR_REG_OFFSET); in nct6775_set_bank()
1422 outb_p(bank, data->addr + DATA_REG_OFFSET); in nct6775_set_bank()
1423 data->bank = bank; in nct6775_set_bank()
1427 static u16 nct6775_read_value(struct nct6775_data *data, u16 reg) in nct6775_read_value() argument
1429 int res, word_sized = is_word_sized(data, reg); in nct6775_read_value()
1431 nct6775_set_bank(data, reg); in nct6775_read_value()
1432 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1433 res = inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1435 outb_p((reg & 0xff) + 1, in nct6775_read_value()
1436 data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1437 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1442 static int nct6775_write_value(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_value() argument
1444 int word_sized = is_word_sized(data, reg); in nct6775_write_value()
1446 nct6775_set_bank(data, reg); in nct6775_write_value()
1447 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1449 outb_p(value >> 8, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1450 outb_p((reg & 0xff) + 1, in nct6775_write_value()
1451 data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1453 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1457 /* We left-align 8-bit temperature values to make the code simpler */
1458 static u16 nct6775_read_temp(struct nct6775_data *data, u16 reg) in nct6775_read_temp() argument
1462 res = nct6775_read_value(data, reg); in nct6775_read_temp()
1463 if (!is_word_sized(data, reg)) in nct6775_read_temp()
1469 static int nct6775_write_temp(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_temp() argument
1471 if (!is_word_sized(data, reg)) in nct6775_write_temp()
1473 return nct6775_write_value(data, reg, value); in nct6775_write_temp()
1476 /* This function assumes that the caller holds data->update_lock */
1477 static void nct6775_write_fan_div(struct nct6775_data *data, int nr) in nct6775_write_fan_div() argument
1479 u8 reg; in nct6775_write_fan_div() local
1483 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x70) in nct6775_write_fan_div()
1484 | (data->fan_div[0] & 0x7); in nct6775_write_fan_div()
1485 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1488 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x7) in nct6775_write_fan_div()
1489 | ((data->fan_div[1] << 4) & 0x70); in nct6775_write_fan_div()
1490 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1493 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x70) in nct6775_write_fan_div()
1494 | (data->fan_div[2] & 0x7); in nct6775_write_fan_div()
1495 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1498 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x7) in nct6775_write_fan_div()
1499 | ((data->fan_div[3] << 4) & 0x70); in nct6775_write_fan_div()
1500 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1505 static void nct6775_write_fan_div_common(struct nct6775_data *data, int nr) in nct6775_write_fan_div_common() argument
1507 if (data->kind == nct6775) in nct6775_write_fan_div_common()
1508 nct6775_write_fan_div(data, nr); in nct6775_write_fan_div_common()
1511 static void nct6775_update_fan_div(struct nct6775_data *data) in nct6775_update_fan_div() argument
1515 i = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_update_fan_div()
1516 data->fan_div[0] = i & 0x7; in nct6775_update_fan_div()
1517 data->fan_div[1] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1518 i = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_update_fan_div()
1519 data->fan_div[2] = i & 0x7; in nct6775_update_fan_div()
1520 if (data->has_fan & BIT(3)) in nct6775_update_fan_div()
1521 data->fan_div[3] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1524 static void nct6775_update_fan_div_common(struct nct6775_data *data) in nct6775_update_fan_div_common() argument
1526 if (data->kind == nct6775) in nct6775_update_fan_div_common()
1527 nct6775_update_fan_div(data); in nct6775_update_fan_div_common()
1530 static void nct6775_init_fan_div(struct nct6775_data *data) in nct6775_init_fan_div() argument
1534 nct6775_update_fan_div_common(data); in nct6775_init_fan_div()
1541 for (i = 0; i < ARRAY_SIZE(data->fan_div); i++) { in nct6775_init_fan_div()
1542 if (!(data->has_fan & BIT(i))) in nct6775_init_fan_div()
1544 if (data->fan_div[i] == 0) { in nct6775_init_fan_div()
1545 data->fan_div[i] = 7; in nct6775_init_fan_div()
1546 nct6775_write_fan_div_common(data, i); in nct6775_init_fan_div()
1552 struct nct6775_data *data) in nct6775_init_fan_common() argument
1555 u8 reg; in nct6775_init_fan_common() local
1557 if (data->has_fan_div) in nct6775_init_fan_common()
1558 nct6775_init_fan_div(data); in nct6775_init_fan_common()
1564 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_init_fan_common()
1565 if (data->has_fan_min & BIT(i)) { in nct6775_init_fan_common()
1566 reg = nct6775_read_value(data, data->REG_FAN_MIN[i]); in nct6775_init_fan_common()
1567 if (!reg) in nct6775_init_fan_common()
1568 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_init_fan_common()
1569 data->has_fan_div ? 0xff in nct6775_init_fan_common()
1576 struct nct6775_data *data, int nr, u16 reg) in nct6775_select_fan_div() argument
1578 u8 fan_div = data->fan_div[nr]; in nct6775_select_fan_div()
1581 if (!data->has_fan_div) in nct6775_select_fan_div()
1589 if (reg == 0x00 && fan_div < 0x07) in nct6775_select_fan_div()
1591 else if (reg != 0x00 && reg < 0x30 && fan_div > 0) in nct6775_select_fan_div()
1592 fan_div--; in nct6775_select_fan_div()
1594 if (fan_div != data->fan_div[nr]) { in nct6775_select_fan_div()
1596 nr + 1, div_from_reg(data->fan_div[nr]), in nct6775_select_fan_div()
1600 if (data->has_fan_min & BIT(nr)) { in nct6775_select_fan_div()
1601 fan_min = data->fan_min[nr]; in nct6775_select_fan_div()
1602 if (fan_div > data->fan_div[nr]) { in nct6775_select_fan_div()
1612 if (fan_min != data->fan_min[nr]) { in nct6775_select_fan_div()
1613 data->fan_min[nr] = fan_min; in nct6775_select_fan_div()
1614 nct6775_write_value(data, data->REG_FAN_MIN[nr], in nct6775_select_fan_div()
1618 data->fan_div[nr] = fan_div; in nct6775_select_fan_div()
1619 nct6775_write_fan_div_common(data, nr); in nct6775_select_fan_div()
1625 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm() local
1627 int fanmodecfg, reg; in nct6775_update_pwm() local
1630 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm()
1631 if (!(data->has_pwm & BIT(i))) in nct6775_update_pwm()
1634 duty_is_dc = data->REG_PWM_MODE[i] && in nct6775_update_pwm()
1635 (nct6775_read_value(data, data->REG_PWM_MODE[i]) in nct6775_update_pwm()
1636 & data->PWM_MODE_MASK[i]); in nct6775_update_pwm()
1637 data->pwm_mode[i] = !duty_is_dc; in nct6775_update_pwm()
1639 fanmodecfg = nct6775_read_value(data, data->REG_FAN_MODE[i]); in nct6775_update_pwm()
1640 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) { in nct6775_update_pwm()
1641 if (data->REG_PWM[j] && data->REG_PWM[j][i]) { in nct6775_update_pwm()
1642 data->pwm[j][i] in nct6775_update_pwm()
1643 = nct6775_read_value(data, in nct6775_update_pwm()
1644 data->REG_PWM[j][i]); in nct6775_update_pwm()
1648 data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i], in nct6775_update_pwm()
1651 if (!data->temp_tolerance[0][i] || in nct6775_update_pwm()
1652 data->pwm_enable[i] != speed_cruise) in nct6775_update_pwm()
1653 data->temp_tolerance[0][i] = fanmodecfg & 0x0f; in nct6775_update_pwm()
1654 if (!data->target_speed_tolerance[i] || in nct6775_update_pwm()
1655 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm()
1658 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm()
1659 t |= (nct6775_read_value(data, in nct6775_update_pwm()
1660 data->REG_TOLERANCE_H[i]) & 0x70) >> 1; in nct6775_update_pwm()
1662 data->target_speed_tolerance[i] = t; in nct6775_update_pwm()
1665 data->temp_tolerance[1][i] = in nct6775_update_pwm()
1666 nct6775_read_value(data, in nct6775_update_pwm()
1667 data->REG_CRITICAL_TEMP_TOLERANCE[i]); in nct6775_update_pwm()
1669 reg = nct6775_read_value(data, data->REG_TEMP_SEL[i]); in nct6775_update_pwm()
1670 data->pwm_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1672 if (reg & 0x80) in nct6775_update_pwm()
1673 data->pwm[2][i] = 0; in nct6775_update_pwm()
1675 if (!data->REG_WEIGHT_TEMP_SEL[i]) in nct6775_update_pwm()
1678 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); in nct6775_update_pwm()
1679 data->pwm_weight_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1681 if (!(reg & 0x80)) in nct6775_update_pwm()
1682 data->pwm_weight_temp_sel[i] = 0; in nct6775_update_pwm()
1684 /* Weight temp data */ in nct6775_update_pwm()
1685 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) { in nct6775_update_pwm()
1686 data->weight_temp[j][i] in nct6775_update_pwm()
1687 = nct6775_read_value(data, in nct6775_update_pwm()
1688 data->REG_WEIGHT_TEMP[j][i]); in nct6775_update_pwm()
1695 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm_limits() local
1697 u8 reg; in nct6775_update_pwm_limits() local
1700 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm_limits()
1701 if (!(data->has_pwm & BIT(i))) in nct6775_update_pwm_limits()
1704 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) { in nct6775_update_pwm_limits()
1705 data->fan_time[j][i] = in nct6775_update_pwm_limits()
1706 nct6775_read_value(data, data->REG_FAN_TIME[j][i]); in nct6775_update_pwm_limits()
1709 reg_t = nct6775_read_value(data, data->REG_TARGET[i]); in nct6775_update_pwm_limits()
1711 if (!data->target_temp[i] || in nct6775_update_pwm_limits()
1712 data->pwm_enable[i] == thermal_cruise) in nct6775_update_pwm_limits()
1713 data->target_temp[i] = reg_t & data->target_temp_mask; in nct6775_update_pwm_limits()
1714 if (!data->target_speed[i] || in nct6775_update_pwm_limits()
1715 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm_limits()
1716 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm_limits()
1717 reg_t |= (nct6775_read_value(data, in nct6775_update_pwm_limits()
1718 data->REG_TOLERANCE_H[i]) & 0x0f) << 8; in nct6775_update_pwm_limits()
1720 data->target_speed[i] = reg_t; in nct6775_update_pwm_limits()
1723 for (j = 0; j < data->auto_pwm_num; j++) { in nct6775_update_pwm_limits()
1724 data->auto_pwm[i][j] = in nct6775_update_pwm_limits()
1725 nct6775_read_value(data, in nct6775_update_pwm_limits()
1726 NCT6775_AUTO_PWM(data, i, j)); in nct6775_update_pwm_limits()
1727 data->auto_temp[i][j] = in nct6775_update_pwm_limits()
1728 nct6775_read_value(data, in nct6775_update_pwm_limits()
1729 NCT6775_AUTO_TEMP(data, i, j)); in nct6775_update_pwm_limits()
1732 /* critical auto_pwm temperature data */ in nct6775_update_pwm_limits()
1733 data->auto_temp[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1734 nct6775_read_value(data, data->REG_CRITICAL_TEMP[i]); in nct6775_update_pwm_limits()
1736 switch (data->kind) { in nct6775_update_pwm_limits()
1738 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1740 data->auto_pwm[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1741 (reg & 0x02) ? 0xff : 0x00; in nct6775_update_pwm_limits()
1744 data->auto_pwm[i][data->auto_pwm_num] = 0xff; in nct6775_update_pwm_limits()
1756 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1757 data->REG_CRITICAL_PWM_ENABLE[i]); in nct6775_update_pwm_limits()
1758 if (reg & data->CRITICAL_PWM_ENABLE_MASK) in nct6775_update_pwm_limits()
1759 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1760 data->REG_CRITICAL_PWM[i]); in nct6775_update_pwm_limits()
1762 reg = 0xff; in nct6775_update_pwm_limits()
1763 data->auto_pwm[i][data->auto_pwm_num] = reg; in nct6775_update_pwm_limits()
1771 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_device() local
1774 mutex_lock(&data->update_lock); in nct6775_update_device()
1776 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) in nct6775_update_device()
1777 || !data->valid) { in nct6775_update_device()
1779 nct6775_update_fan_div_common(data); in nct6775_update_device()
1782 for (i = 0; i < data->in_num; i++) { in nct6775_update_device()
1783 if (!(data->have_in & BIT(i))) in nct6775_update_device()
1786 data->in[i][0] = nct6775_read_value(data, in nct6775_update_device()
1787 data->REG_VIN[i]); in nct6775_update_device()
1788 data->in[i][1] = nct6775_read_value(data, in nct6775_update_device()
1789 data->REG_IN_MINMAX[0][i]); in nct6775_update_device()
1790 data->in[i][2] = nct6775_read_value(data, in nct6775_update_device()
1791 data->REG_IN_MINMAX[1][i]); in nct6775_update_device()
1795 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) { in nct6775_update_device()
1796 u16 reg; in nct6775_update_device() local
1798 if (!(data->has_fan & BIT(i))) in nct6775_update_device()
1801 reg = nct6775_read_value(data, data->REG_FAN[i]); in nct6775_update_device()
1802 data->rpm[i] = data->fan_from_reg(reg, in nct6775_update_device()
1803 data->fan_div[i]); in nct6775_update_device()
1805 if (data->has_fan_min & BIT(i)) in nct6775_update_device()
1806 data->fan_min[i] = nct6775_read_value(data, in nct6775_update_device()
1807 data->REG_FAN_MIN[i]); in nct6775_update_device()
1809 if (data->REG_FAN_PULSES[i]) { in nct6775_update_device()
1810 data->fan_pulses[i] = in nct6775_update_device()
1811 (nct6775_read_value(data, in nct6775_update_device()
1812 data->REG_FAN_PULSES[i]) in nct6775_update_device()
1813 >> data->FAN_PULSE_SHIFT[i]) & 0x03; in nct6775_update_device()
1816 nct6775_select_fan_div(dev, data, i, reg); in nct6775_update_device()
1824 if (!(data->have_temp & BIT(i))) in nct6775_update_device()
1826 for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) { in nct6775_update_device()
1827 if (data->reg_temp[j][i]) in nct6775_update_device()
1828 data->temp[j][i] in nct6775_update_device()
1829 = nct6775_read_temp(data, in nct6775_update_device()
1830 data->reg_temp[j][i]); in nct6775_update_device()
1833 !(data->have_temp_fixed & BIT(i))) in nct6775_update_device()
1835 data->temp_offset[i] in nct6775_update_device()
1836 = nct6775_read_value(data, data->REG_TEMP_OFFSET[i]); in nct6775_update_device()
1839 data->alarms = 0; in nct6775_update_device()
1843 if (!data->REG_ALARM[i]) in nct6775_update_device()
1845 alarm = nct6775_read_value(data, data->REG_ALARM[i]); in nct6775_update_device()
1846 data->alarms |= ((u64)alarm) << (i << 3); in nct6775_update_device()
1849 data->beeps = 0; in nct6775_update_device()
1853 if (!data->REG_BEEP[i]) in nct6775_update_device()
1855 beep = nct6775_read_value(data, data->REG_BEEP[i]); in nct6775_update_device()
1856 data->beeps |= ((u64)beep) << (i << 3); in nct6775_update_device()
1859 data->last_updated = jiffies; in nct6775_update_device()
1860 data->valid = true; in nct6775_update_device()
1863 mutex_unlock(&data->update_lock); in nct6775_update_device()
1864 return data; in nct6775_update_device()
1873 struct nct6775_data *data = nct6775_update_device(dev); in show_in_reg() local
1875 int index = sattr->index; in show_in_reg()
1876 int nr = sattr->nr; in show_in_reg()
1878 return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr)); in show_in_reg()
1885 struct nct6775_data *data = dev_get_drvdata(dev); in store_in_reg() local
1887 int index = sattr->index; in store_in_reg()
1888 int nr = sattr->nr; in store_in_reg()
1895 mutex_lock(&data->update_lock); in store_in_reg()
1896 data->in[nr][index] = in_to_reg(val, nr); in store_in_reg()
1897 nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], in store_in_reg()
1898 data->in[nr][index]); in store_in_reg()
1899 mutex_unlock(&data->update_lock); in store_in_reg()
1906 struct nct6775_data *data = nct6775_update_device(dev); in show_alarm() local
1908 int nr = data->ALARM_BITS[sattr->index]; in show_alarm()
1911 (unsigned int)((data->alarms >> nr) & 0x01)); in show_alarm()
1914 static int find_temp_source(struct nct6775_data *data, int index, int count) in find_temp_source() argument
1916 int source = data->temp_src[index]; in find_temp_source()
1922 src = nct6775_read_value(data, in find_temp_source()
1923 data->REG_TEMP_SOURCE[nr]) & 0x1f; in find_temp_source()
1927 return -ENODEV; in find_temp_source()
1934 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_alarm() local
1942 nr = find_temp_source(data, sattr->index, data->num_temp_alarms); in show_temp_alarm()
1944 int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE]; in show_temp_alarm()
1946 alarm = (data->alarms >> bit) & 0x01; in show_temp_alarm()
1955 struct nct6775_data *data = nct6775_update_device(dev); in show_beep() local
1956 int nr = data->BEEP_BITS[sattr->index]; in show_beep()
1959 (unsigned int)((data->beeps >> nr) & 0x01)); in show_beep()
1967 struct nct6775_data *data = dev_get_drvdata(dev); in store_beep() local
1968 int nr = data->BEEP_BITS[sattr->index]; in store_beep()
1977 return -EINVAL; in store_beep()
1979 mutex_lock(&data->update_lock); in store_beep()
1981 data->beeps |= (1ULL << nr); in store_beep()
1983 data->beeps &= ~(1ULL << nr); in store_beep()
1984 nct6775_write_value(data, data->REG_BEEP[regindex], in store_beep()
1985 (data->beeps >> (regindex << 3)) & 0xff); in store_beep()
1986 mutex_unlock(&data->update_lock); in store_beep()
1994 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_beep() local
2003 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in show_temp_beep()
2005 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in show_temp_beep()
2007 beep = (data->beeps >> bit) & 0x01; in show_temp_beep()
2017 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_beep() local
2026 return -EINVAL; in store_temp_beep()
2028 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in store_temp_beep()
2032 bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in store_temp_beep()
2035 mutex_lock(&data->update_lock); in store_temp_beep()
2037 data->beeps |= (1ULL << bit); in store_temp_beep()
2039 data->beeps &= ~(1ULL << bit); in store_temp_beep()
2040 nct6775_write_value(data, data->REG_BEEP[regindex], in store_temp_beep()
2041 (data->beeps >> (regindex << 3)) & 0xff); in store_temp_beep()
2042 mutex_unlock(&data->update_lock); in store_temp_beep()
2051 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_in_is_visible() local
2054 if (!(data->have_in & BIT(in))) in nct6775_in_is_visible()
2057 return attr->mode; in nct6775_in_is_visible()
2091 struct nct6775_data *data = nct6775_update_device(dev); in show_fan() local
2093 int nr = sattr->index; in show_fan()
2095 return sprintf(buf, "%d\n", data->rpm[nr]); in show_fan()
2101 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_min() local
2103 int nr = sattr->index; in show_fan_min()
2106 data->fan_from_reg_min(data->fan_min[nr], in show_fan_min()
2107 data->fan_div[nr])); in show_fan_min()
2113 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_div() local
2115 int nr = sattr->index; in show_fan_div()
2117 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr])); in show_fan_div()
2124 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_min() local
2126 int nr = sattr->index; in store_fan_min()
2128 unsigned int reg; in store_fan_min() local
2136 mutex_lock(&data->update_lock); in store_fan_min()
2137 if (!data->has_fan_div) { in store_fan_min()
2147 data->fan_min[nr] = val; in store_fan_min()
2152 data->fan_min[nr] = 255; in store_fan_min()
2153 new_div = data->fan_div[nr]; /* No change */ in store_fan_min()
2157 reg = 1350000U / val; in store_fan_min()
2158 if (reg >= 128 * 255) { in store_fan_min()
2163 data->fan_min[nr] = 254; in store_fan_min()
2167 nr + 1, val, data->fan_from_reg_min(254, 7)); in store_fan_min()
2168 } else if (!reg) { in store_fan_min()
2173 data->fan_min[nr] = 1; in store_fan_min()
2177 nr + 1, val, data->fan_from_reg_min(1, 0)); in store_fan_min()
2185 while (reg > 192 && new_div < 7) { in store_fan_min()
2186 reg >>= 1; in store_fan_min()
2189 data->fan_min[nr] = reg; in store_fan_min()
2197 if (new_div != data->fan_div[nr]) { in store_fan_min()
2199 nr + 1, div_from_reg(data->fan_div[nr]), in store_fan_min()
2201 data->fan_div[nr] = new_div; in store_fan_min()
2202 nct6775_write_fan_div_common(data, nr); in store_fan_min()
2204 data->last_updated = jiffies; in store_fan_min()
2208 nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); in store_fan_min()
2209 mutex_unlock(&data->update_lock); in store_fan_min()
2217 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_pulses() local
2219 int p = data->fan_pulses[sattr->index]; in show_fan_pulses()
2228 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_pulses() local
2230 int nr = sattr->index; in store_fan_pulses()
2233 u8 reg; in store_fan_pulses() local
2240 return -EINVAL; in store_fan_pulses()
2242 mutex_lock(&data->update_lock); in store_fan_pulses()
2243 data->fan_pulses[nr] = val & 3; in store_fan_pulses()
2244 reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]); in store_fan_pulses()
2245 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]); in store_fan_pulses()
2246 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr]; in store_fan_pulses()
2247 nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg); in store_fan_pulses()
2248 mutex_unlock(&data->update_lock); in store_fan_pulses()
2257 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_fan_is_visible() local
2261 if (!(data->has_fan & BIT(fan))) in nct6775_fan_is_visible()
2264 if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2266 if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2268 if (nr == 3 && !data->REG_FAN_PULSES[fan]) in nct6775_fan_is_visible()
2270 if (nr == 4 && !(data->has_fan_min & BIT(fan))) in nct6775_fan_is_visible()
2272 if (nr == 5 && data->kind != nct6775) in nct6775_fan_is_visible()
2275 return attr->mode; in nct6775_fan_is_visible()
2313 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_label() local
2315 int nr = sattr->index; in show_temp_label()
2317 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]); in show_temp_label()
2323 struct nct6775_data *data = nct6775_update_device(dev); in show_temp() local
2325 int nr = sattr->nr; in show_temp()
2326 int index = sattr->index; in show_temp()
2328 return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr])); in show_temp()
2335 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp() local
2337 int nr = sattr->nr; in store_temp()
2338 int index = sattr->index; in store_temp()
2346 mutex_lock(&data->update_lock); in store_temp()
2347 data->temp[index][nr] = LM75_TEMP_TO_REG(val); in store_temp()
2348 nct6775_write_temp(data, data->reg_temp[index][nr], in store_temp()
2349 data->temp[index][nr]); in store_temp()
2350 mutex_unlock(&data->update_lock); in store_temp()
2357 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_offset() local
2360 return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000); in show_temp_offset()
2367 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_offset() local
2369 int nr = sattr->index; in store_temp_offset()
2377 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127); in store_temp_offset()
2379 mutex_lock(&data->update_lock); in store_temp_offset()
2380 data->temp_offset[nr] = val; in store_temp_offset()
2381 nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val); in store_temp_offset()
2382 mutex_unlock(&data->update_lock); in store_temp_offset()
2390 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_type() local
2392 int nr = sattr->index; in show_temp_type()
2394 return sprintf(buf, "%d\n", (int)data->temp_type[nr]); in show_temp_type()
2401 struct nct6775_data *data = nct6775_update_device(dev); in store_temp_type() local
2403 int nr = sattr->index; in store_temp_type()
2413 return -EINVAL; in store_temp_type()
2415 mutex_lock(&data->update_lock); in store_temp_type()
2417 data->temp_type[nr] = val; in store_temp_type()
2419 dbit = data->DIODE_MASK << nr; in store_temp_type()
2420 vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit; in store_temp_type()
2421 diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit; in store_temp_type()
2433 nct6775_write_value(data, data->REG_VBAT, vbat); in store_temp_type()
2434 nct6775_write_value(data, data->REG_DIODE, diode); in store_temp_type()
2436 mutex_unlock(&data->update_lock); in store_temp_type()
2444 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_temp_is_visible() local
2448 if (!(data->have_temp & BIT(temp))) in nct6775_temp_is_visible()
2451 if (nr == 1 && !data->temp_label) in nct6775_temp_is_visible()
2454 if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0) in nct6775_temp_is_visible()
2457 if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0) in nct6775_temp_is_visible()
2460 if (nr == 4 && !data->reg_temp[1][temp]) /* max */ in nct6775_temp_is_visible()
2463 if (nr == 5 && !data->reg_temp[2][temp]) /* max_hyst */ in nct6775_temp_is_visible()
2466 if (nr == 6 && !data->reg_temp[3][temp]) /* crit */ in nct6775_temp_is_visible()
2469 if (nr == 7 && !data->reg_temp[4][temp]) /* lcrit */ in nct6775_temp_is_visible()
2473 if (nr > 7 && !(data->have_temp_fixed & BIT(temp))) in nct6775_temp_is_visible()
2476 return attr->mode; in nct6775_temp_is_visible()
2525 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_mode() local
2528 return sprintf(buf, "%d\n", data->pwm_mode[sattr->index]); in show_pwm_mode()
2535 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_mode() local
2537 int nr = sattr->index; in store_pwm_mode()
2540 u8 reg; in store_pwm_mode() local
2547 return -EINVAL; in store_pwm_mode()
2550 if (data->REG_PWM_MODE[nr] == 0) { in store_pwm_mode()
2552 return -EINVAL; in store_pwm_mode()
2556 mutex_lock(&data->update_lock); in store_pwm_mode()
2557 data->pwm_mode[nr] = val; in store_pwm_mode()
2558 reg = nct6775_read_value(data, data->REG_PWM_MODE[nr]); in store_pwm_mode()
2559 reg &= ~data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2561 reg |= data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2562 nct6775_write_value(data, data->REG_PWM_MODE[nr], reg); in store_pwm_mode()
2563 mutex_unlock(&data->update_lock); in store_pwm_mode()
2570 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm() local
2572 int nr = sattr->nr; in show_pwm()
2573 int index = sattr->index; in show_pwm()
2580 if (index == 0 && data->pwm_enable[nr] > manual) in show_pwm()
2581 pwm = nct6775_read_value(data, data->REG_PWM_READ[nr]); in show_pwm()
2583 pwm = data->pwm[index][nr]; in show_pwm()
2592 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm() local
2594 int nr = sattr->nr; in store_pwm()
2595 int index = sattr->index; in store_pwm()
2597 int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 }; in store_pwm()
2599 = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 }; in store_pwm()
2601 u8 reg; in store_pwm() local
2608 mutex_lock(&data->update_lock); in store_pwm()
2609 data->pwm[index][nr] = val; in store_pwm()
2610 nct6775_write_value(data, data->REG_PWM[index][nr], val); in store_pwm()
2612 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm()
2613 reg &= 0x7f; in store_pwm()
2615 reg |= 0x80; in store_pwm()
2616 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm()
2618 mutex_unlock(&data->update_lock); in store_pwm()
2622 /* Returns 0 if OK, -EINVAL otherwise */
2623 static int check_trip_points(struct nct6775_data *data, int nr) in check_trip_points() argument
2627 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2628 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
2629 return -EINVAL; in check_trip_points()
2631 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2632 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) in check_trip_points()
2633 return -EINVAL; in check_trip_points()
2636 if (data->auto_pwm[nr][data->auto_pwm_num]) { in check_trip_points()
2637 if (data->auto_temp[nr][data->auto_pwm_num - 1] > in check_trip_points()
2638 data->auto_temp[nr][data->auto_pwm_num] || in check_trip_points()
2639 data->auto_pwm[nr][data->auto_pwm_num - 1] > in check_trip_points()
2640 data->auto_pwm[nr][data->auto_pwm_num]) in check_trip_points()
2641 return -EINVAL; in check_trip_points()
2646 static void pwm_update_registers(struct nct6775_data *data, int nr) in pwm_update_registers() argument
2648 u8 reg; in pwm_update_registers() local
2650 switch (data->pwm_enable[nr]) { in pwm_update_registers()
2655 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2656 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2657 (data->target_speed_tolerance[nr] & data->tolerance_mask); in pwm_update_registers()
2658 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2659 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2660 data->target_speed[nr] & 0xff); in pwm_update_registers()
2661 if (data->REG_TOLERANCE_H) { in pwm_update_registers()
2662 reg = (data->target_speed[nr] >> 8) & 0x0f; in pwm_update_registers()
2663 reg |= (data->target_speed_tolerance[nr] & 0x38) << 1; in pwm_update_registers()
2664 nct6775_write_value(data, in pwm_update_registers()
2665 data->REG_TOLERANCE_H[nr], in pwm_update_registers()
2666 reg); in pwm_update_registers()
2670 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2671 data->target_temp[nr]); in pwm_update_registers()
2674 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2675 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2676 data->temp_tolerance[0][nr]; in pwm_update_registers()
2677 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2685 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_enable() local
2688 return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]); in show_pwm_enable()
2695 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_enable() local
2697 int nr = sattr->index; in store_pwm_enable()
2700 u16 reg; in store_pwm_enable() local
2707 return -EINVAL; in store_pwm_enable()
2709 if (val == sf3 && data->kind != nct6775) in store_pwm_enable()
2710 return -EINVAL; in store_pwm_enable()
2712 if (val == sf4 && check_trip_points(data, nr)) { in store_pwm_enable()
2715 return -EINVAL; in store_pwm_enable()
2718 mutex_lock(&data->update_lock); in store_pwm_enable()
2719 data->pwm_enable[nr] = val; in store_pwm_enable()
2724 data->pwm[0][nr] = 255; in store_pwm_enable()
2725 nct6775_write_value(data, data->REG_PWM[0][nr], 255); in store_pwm_enable()
2727 pwm_update_registers(data, nr); in store_pwm_enable()
2728 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in store_pwm_enable()
2729 reg &= 0x0f; in store_pwm_enable()
2730 reg |= pwm_enable_to_reg(val) << 4; in store_pwm_enable()
2731 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in store_pwm_enable()
2732 mutex_unlock(&data->update_lock); in store_pwm_enable()
2737 show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src) in show_pwm_temp_sel_common() argument
2742 if (!(data->have_temp & BIT(i))) in show_pwm_temp_sel_common()
2744 if (src == data->temp_src[i]) { in show_pwm_temp_sel_common()
2756 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_temp_sel() local
2758 int index = sattr->index; in show_pwm_temp_sel()
2760 return show_pwm_temp_sel_common(data, buf, data->pwm_temp_sel[index]); in show_pwm_temp_sel()
2767 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_temp_sel() local
2769 int nr = sattr->index; in store_pwm_temp_sel()
2771 int err, reg, src; in store_pwm_temp_sel() local
2777 return -EINVAL; in store_pwm_temp_sel()
2778 if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1]) in store_pwm_temp_sel()
2779 return -EINVAL; in store_pwm_temp_sel()
2781 mutex_lock(&data->update_lock); in store_pwm_temp_sel()
2782 src = data->temp_src[val - 1]; in store_pwm_temp_sel()
2783 data->pwm_temp_sel[nr] = src; in store_pwm_temp_sel()
2784 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm_temp_sel()
2785 reg &= 0xe0; in store_pwm_temp_sel()
2786 reg |= src; in store_pwm_temp_sel()
2787 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm_temp_sel()
2788 mutex_unlock(&data->update_lock); in store_pwm_temp_sel()
2797 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_weight_temp_sel() local
2799 int index = sattr->index; in show_pwm_weight_temp_sel()
2801 return show_pwm_temp_sel_common(data, buf, in show_pwm_weight_temp_sel()
2802 data->pwm_weight_temp_sel[index]); in show_pwm_weight_temp_sel()
2809 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_weight_temp_sel() local
2811 int nr = sattr->index; in store_pwm_weight_temp_sel()
2813 int err, reg, src; in store_pwm_weight_temp_sel() local
2819 return -EINVAL; in store_pwm_weight_temp_sel()
2821 if (val && (!(data->have_temp & BIT(val - 1)) || in store_pwm_weight_temp_sel()
2822 !data->temp_src[val - 1])) in store_pwm_weight_temp_sel()
2823 return -EINVAL; in store_pwm_weight_temp_sel()
2825 mutex_lock(&data->update_lock); in store_pwm_weight_temp_sel()
2827 src = data->temp_src[val - 1]; in store_pwm_weight_temp_sel()
2828 data->pwm_weight_temp_sel[nr] = src; in store_pwm_weight_temp_sel()
2829 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2830 reg &= 0xe0; in store_pwm_weight_temp_sel()
2831 reg |= (src | 0x80); in store_pwm_weight_temp_sel()
2832 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2834 data->pwm_weight_temp_sel[nr] = 0; in store_pwm_weight_temp_sel()
2835 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2836 reg &= 0x7f; in store_pwm_weight_temp_sel()
2837 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2839 mutex_unlock(&data->update_lock); in store_pwm_weight_temp_sel()
2847 struct nct6775_data *data = nct6775_update_device(dev); in show_target_temp() local
2850 return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000); in show_target_temp()
2857 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_temp() local
2859 int nr = sattr->index; in store_target_temp()
2868 data->target_temp_mask); in store_target_temp()
2870 mutex_lock(&data->update_lock); in store_target_temp()
2871 data->target_temp[nr] = val; in store_target_temp()
2872 pwm_update_registers(data, nr); in store_target_temp()
2873 mutex_unlock(&data->update_lock); in store_target_temp()
2880 struct nct6775_data *data = nct6775_update_device(dev); in show_target_speed() local
2882 int nr = sattr->index; in show_target_speed()
2885 fan_from_reg16(data->target_speed[nr], in show_target_speed()
2886 data->fan_div[nr])); in show_target_speed()
2893 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_speed() local
2895 int nr = sattr->index; in store_target_speed()
2905 speed = fan_to_reg(val, data->fan_div[nr]); in store_target_speed()
2907 mutex_lock(&data->update_lock); in store_target_speed()
2908 data->target_speed[nr] = speed; in store_target_speed()
2909 pwm_update_registers(data, nr); in store_target_speed()
2910 mutex_unlock(&data->update_lock); in store_target_speed()
2918 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_tolerance() local
2920 int nr = sattr->nr; in show_temp_tolerance()
2921 int index = sattr->index; in show_temp_tolerance()
2923 return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000); in show_temp_tolerance()
2930 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_tolerance() local
2932 int nr = sattr->nr; in store_temp_tolerance()
2933 int index = sattr->index; in store_temp_tolerance()
2942 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask); in store_temp_tolerance()
2944 mutex_lock(&data->update_lock); in store_temp_tolerance()
2945 data->temp_tolerance[index][nr] = val; in store_temp_tolerance()
2947 pwm_update_registers(data, nr); in store_temp_tolerance()
2949 nct6775_write_value(data, in store_temp_tolerance()
2950 data->REG_CRITICAL_TEMP_TOLERANCE[nr], in store_temp_tolerance()
2952 mutex_unlock(&data->update_lock); in store_temp_tolerance()
2967 struct nct6775_data *data = nct6775_update_device(dev); in show_speed_tolerance() local
2969 int nr = sattr->index; in show_speed_tolerance()
2970 int target = data->target_speed[nr]; in show_speed_tolerance()
2974 int low = target - data->target_speed_tolerance[nr]; in show_speed_tolerance()
2975 int high = target + data->target_speed_tolerance[nr]; in show_speed_tolerance()
2984 tolerance = (fan_from_reg16(low, data->fan_div[nr]) in show_speed_tolerance()
2985 - fan_from_reg16(high, data->fan_div[nr])) / 2; in show_speed_tolerance()
2995 struct nct6775_data *data = dev_get_drvdata(dev); in store_speed_tolerance() local
2997 int nr = sattr->index; in store_speed_tolerance()
3006 high = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
3007 data->fan_div[nr]) + val; in store_speed_tolerance()
3008 low = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
3009 data->fan_div[nr]) - val; in store_speed_tolerance()
3015 val = (fan_to_reg(low, data->fan_div[nr]) - in store_speed_tolerance()
3016 fan_to_reg(high, data->fan_div[nr])) / 2; in store_speed_tolerance()
3019 val = clamp_val(val, 0, data->speed_tolerance_limit); in store_speed_tolerance()
3021 mutex_lock(&data->update_lock); in store_speed_tolerance()
3022 data->target_speed_tolerance[nr] = val; in store_speed_tolerance()
3023 pwm_update_registers(data, nr); in store_speed_tolerance()
3024 mutex_unlock(&data->update_lock); in store_speed_tolerance()
3047 struct nct6775_data *data = nct6775_update_device(dev); in show_weight_temp() local
3049 int nr = sattr->nr; in show_weight_temp()
3050 int index = sattr->index; in show_weight_temp()
3052 return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000); in show_weight_temp()
3059 struct nct6775_data *data = dev_get_drvdata(dev); in store_weight_temp() local
3061 int nr = sattr->nr; in store_weight_temp()
3062 int index = sattr->index; in store_weight_temp()
3072 mutex_lock(&data->update_lock); in store_weight_temp()
3073 data->weight_temp[index][nr] = val; in store_weight_temp()
3074 nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); in store_weight_temp()
3075 mutex_unlock(&data->update_lock); in store_weight_temp()
3095 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_time() local
3097 int nr = sattr->nr; in show_fan_time()
3098 int index = sattr->index; in show_fan_time()
3101 step_time_from_reg(data->fan_time[index][nr], in show_fan_time()
3102 data->pwm_mode[nr])); in show_fan_time()
3109 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_time() local
3111 int nr = sattr->nr; in store_fan_time()
3112 int index = sattr->index; in store_fan_time()
3120 val = step_time_to_reg(val, data->pwm_mode[nr]); in store_fan_time()
3121 mutex_lock(&data->update_lock); in store_fan_time()
3122 data->fan_time[index][nr] = val; in store_fan_time()
3123 nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val); in store_fan_time()
3124 mutex_unlock(&data->update_lock); in store_fan_time()
3131 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_pwm() local
3134 return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]); in show_auto_pwm()
3141 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_pwm() local
3143 int nr = sattr->nr; in store_auto_pwm()
3144 int point = sattr->index; in store_auto_pwm()
3147 u8 reg; in store_auto_pwm() local
3153 return -EINVAL; in store_auto_pwm()
3155 if (point == data->auto_pwm_num) { in store_auto_pwm()
3156 if (data->kind != nct6775 && !val) in store_auto_pwm()
3157 return -EINVAL; in store_auto_pwm()
3158 if (data->kind != nct6779 && val) in store_auto_pwm()
3162 mutex_lock(&data->update_lock); in store_auto_pwm()
3163 data->auto_pwm[nr][point] = val; in store_auto_pwm()
3164 if (point < data->auto_pwm_num) { in store_auto_pwm()
3165 nct6775_write_value(data, in store_auto_pwm()
3166 NCT6775_AUTO_PWM(data, nr, point), in store_auto_pwm()
3167 data->auto_pwm[nr][point]); in store_auto_pwm()
3169 switch (data->kind) { in store_auto_pwm()
3172 reg = nct6775_read_value(data, in store_auto_pwm()
3175 reg |= 0x02; in store_auto_pwm()
3177 reg &= ~0x02; in store_auto_pwm()
3178 nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], in store_auto_pwm()
3179 reg); in store_auto_pwm()
3193 nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], in store_auto_pwm()
3195 reg = nct6775_read_value(data, in store_auto_pwm()
3196 data->REG_CRITICAL_PWM_ENABLE[nr]); in store_auto_pwm()
3198 reg &= ~data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
3200 reg |= data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
3201 nct6775_write_value(data, in store_auto_pwm()
3202 data->REG_CRITICAL_PWM_ENABLE[nr], in store_auto_pwm()
3203 reg); in store_auto_pwm()
3207 mutex_unlock(&data->update_lock); in store_auto_pwm()
3214 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_temp() local
3216 int nr = sattr->nr; in show_auto_temp()
3217 int point = sattr->index; in show_auto_temp()
3223 return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000); in show_auto_temp()
3230 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_temp() local
3232 int nr = sattr->nr; in store_auto_temp()
3233 int point = sattr->index; in store_auto_temp()
3241 return -EINVAL; in store_auto_temp()
3243 mutex_lock(&data->update_lock); in store_auto_temp()
3244 data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000); in store_auto_temp()
3245 if (point < data->auto_pwm_num) { in store_auto_temp()
3246 nct6775_write_value(data, in store_auto_temp()
3247 NCT6775_AUTO_TEMP(data, nr, point), in store_auto_temp()
3248 data->auto_temp[nr][point]); in store_auto_temp()
3250 nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr], in store_auto_temp()
3251 data->auto_temp[nr][point]); in store_auto_temp()
3253 mutex_unlock(&data->update_lock); in store_auto_temp()
3261 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_pwm_is_visible() local
3265 if (!(data->has_pwm & BIT(pwm))) in nct6775_pwm_is_visible()
3269 if (!data->REG_WEIGHT_TEMP_SEL[pwm]) in nct6775_pwm_is_visible()
3271 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */ in nct6775_pwm_is_visible()
3273 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */ in nct6775_pwm_is_visible()
3275 if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */ in nct6775_pwm_is_visible()
3279 int api = (nr - 22) / 2; /* auto point index */ in nct6775_pwm_is_visible()
3281 if (api > data->auto_pwm_num) in nct6775_pwm_is_visible()
3284 return attr->mode; in nct6775_pwm_is_visible()
3399 struct nct6775_data *data = dev_get_drvdata(dev); in cpu0_vid_show() local
3401 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in cpu0_vid_show()
3412 struct nct6775_data *data = dev_get_drvdata(dev); in clear_caseopen() local
3413 int nr = to_sensor_dev_attr(attr)->index - INTRUSION_ALARM_BASE; in clear_caseopen()
3415 u8 reg; in clear_caseopen() local
3419 return -EINVAL; in clear_caseopen()
3421 mutex_lock(&data->update_lock); in clear_caseopen()
3428 ret = superio_enter(data->sioreg); in clear_caseopen()
3434 superio_select(data->sioreg, NCT6775_LD_ACPI); in clear_caseopen()
3435 reg = superio_inb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]); in clear_caseopen()
3436 reg |= NCT6775_CR_CASEOPEN_CLR_MASK[nr]; in clear_caseopen()
3437 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3438 reg &= ~NCT6775_CR_CASEOPEN_CLR_MASK[nr]; in clear_caseopen()
3439 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3440 superio_exit(data->sioreg); in clear_caseopen()
3442 data->valid = false; /* Force cache refresh */ in clear_caseopen()
3444 mutex_unlock(&data->update_lock); in clear_caseopen()
3463 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_other_is_visible() local
3465 if (index == 0 && !data->have_vid) in nct6775_other_is_visible()
3469 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + index - 1] < 0) in nct6775_other_is_visible()
3474 if (data->BEEP_BITS[INTRUSION_ALARM_BASE + index - 3] < 0) in nct6775_other_is_visible()
3478 return attr->mode; in nct6775_other_is_visible()
3502 static inline void nct6775_init_device(struct nct6775_data *data) in nct6775_init_device() argument
3508 if (data->REG_CONFIG) { in nct6775_init_device()
3509 tmp = nct6775_read_value(data, data->REG_CONFIG); in nct6775_init_device()
3511 nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01); in nct6775_init_device()
3516 if (!(data->have_temp & BIT(i))) in nct6775_init_device()
3518 if (!data->reg_temp_config[i]) in nct6775_init_device()
3520 tmp = nct6775_read_value(data, data->reg_temp_config[i]); in nct6775_init_device()
3522 nct6775_write_value(data, data->reg_temp_config[i], in nct6775_init_device()
3527 tmp = nct6775_read_value(data, data->REG_VBAT); in nct6775_init_device()
3529 nct6775_write_value(data, data->REG_VBAT, tmp | 0x01); in nct6775_init_device()
3531 diode = nct6775_read_value(data, data->REG_DIODE); in nct6775_init_device()
3533 for (i = 0; i < data->temp_fixed_num; i++) { in nct6775_init_device()
3534 if (!(data->have_temp_fixed & BIT(i))) in nct6775_init_device()
3536 if ((tmp & (data->DIODE_MASK << i))) /* diode */ in nct6775_init_device()
3537 data->temp_type[i] in nct6775_init_device()
3538 = 3 - ((diode >> i) & data->DIODE_MASK); in nct6775_init_device()
3540 data->temp_type[i] = 4; in nct6775_init_device()
3545 nct6775_check_fan_inputs(struct nct6775_data *data) in nct6775_check_fan_inputs() argument
3551 int sioreg = data->sioreg; in nct6775_check_fan_inputs()
3555 data->sio_reg_enable = superio_inb(sioreg, SIO_REG_ENABLE); in nct6775_check_fan_inputs()
3558 if (data->kind == nct6775) { in nct6775_check_fan_inputs()
3566 } else if (data->kind == nct6776) { in nct6775_check_fan_inputs()
3577 * Z77 Pro4-M if booted in UEFI Ultra-FastBoot mode. in nct6775_check_fan_inputs()
3580 if (!strcmp(board_name, "Z77 Pro4-M")) { in nct6775_check_fan_inputs()
3581 if ((data->sio_reg_enable & 0xe0) != 0xe0) { in nct6775_check_fan_inputs()
3582 data->sio_reg_enable |= 0xe0; in nct6775_check_fan_inputs()
3584 data->sio_reg_enable); in nct6775_check_fan_inputs()
3589 if (data->sio_reg_enable & 0x80) in nct6775_check_fan_inputs()
3594 if (data->sio_reg_enable & 0x40) in nct6775_check_fan_inputs()
3599 if (data->sio_reg_enable & 0x20) in nct6775_check_fan_inputs()
3606 } else if (data->kind == nct6106) { in nct6775_check_fan_inputs()
3611 } else if (data->kind == nct6116) { in nct6775_check_fan_inputs()
3660 switch (data->kind) { in nct6775_check_fan_inputs()
3758 data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) | in nct6775_check_fan_inputs()
3760 data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) | in nct6775_check_fan_inputs()
3762 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | in nct6775_check_fan_inputs()
3766 static void add_temp_sensors(struct nct6775_data *data, const u16 *regp, in add_temp_sensors() argument
3772 for (i = 0; i < data->pwm_num && *available; i++) { in add_temp_sensors()
3777 src = nct6775_read_value(data, regp[i]); in add_temp_sensors()
3781 if (!(data->temp_mask & BIT(src))) in add_temp_sensors()
3785 nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src); in add_temp_sensors()
3793 struct device *dev = &pdev->dev; in nct6775_probe()
3795 struct nct6775_data *data; in nct6775_probe() local
3809 if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH, in nct6775_probe()
3811 return -EBUSY; in nct6775_probe()
3813 data = devm_kzalloc(&pdev->dev, sizeof(struct nct6775_data), in nct6775_probe()
3815 if (!data) in nct6775_probe()
3816 return -ENOMEM; in nct6775_probe()
3818 data->kind = sio_data->kind; in nct6775_probe()
3819 data->sioreg = sio_data->sioreg; in nct6775_probe()
3820 data->addr = res->start; in nct6775_probe()
3821 mutex_init(&data->update_lock); in nct6775_probe()
3822 data->name = nct6775_device_names[data->kind]; in nct6775_probe()
3823 data->bank = 0xff; /* Force initial bank selection */ in nct6775_probe()
3824 platform_set_drvdata(pdev, data); in nct6775_probe()
3826 switch (data->kind) { in nct6775_probe()
3828 data->in_num = 9; in nct6775_probe()
3829 data->pwm_num = 3; in nct6775_probe()
3830 data->auto_pwm_num = 4; in nct6775_probe()
3831 data->temp_fixed_num = 3; in nct6775_probe()
3832 data->num_temp_alarms = 6; in nct6775_probe()
3833 data->num_temp_beeps = 6; in nct6775_probe()
3835 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3836 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3838 data->temp_label = nct6776_temp_label; in nct6775_probe()
3839 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3840 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3842 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3843 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3844 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3845 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3846 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3847 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3848 data->REG_TARGET = NCT6106_REG_TARGET; in nct6775_probe()
3849 data->REG_FAN = NCT6106_REG_FAN; in nct6775_probe()
3850 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE; in nct6775_probe()
3851 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN; in nct6775_probe()
3852 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES; in nct6775_probe()
3853 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT; in nct6775_probe()
3854 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME; in nct6775_probe()
3855 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3856 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3857 data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H; in nct6775_probe()
3858 data->REG_PWM[0] = NCT6116_REG_PWM; in nct6775_probe()
3859 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; in nct6775_probe()
3860 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3861 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3862 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3863 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3864 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3865 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3866 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP; in nct6775_probe()
3867 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM; in nct6775_probe()
3868 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP; in nct6775_probe()
3869 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3871 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3872 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3874 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM; in nct6775_probe()
3875 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3876 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE; in nct6775_probe()
3877 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL; in nct6775_probe()
3878 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3879 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3880 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3881 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3882 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3883 data->ALARM_BITS = NCT6106_ALARM_BITS; in nct6775_probe()
3884 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3885 data->BEEP_BITS = NCT6106_BEEP_BITS; in nct6775_probe()
3901 data->in_num = 9; in nct6775_probe()
3902 data->pwm_num = 3; in nct6775_probe()
3903 data->auto_pwm_num = 4; in nct6775_probe()
3904 data->temp_fixed_num = 3; in nct6775_probe()
3905 data->num_temp_alarms = 3; in nct6775_probe()
3906 data->num_temp_beeps = 3; in nct6775_probe()
3908 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3909 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3911 data->temp_label = nct6776_temp_label; in nct6775_probe()
3912 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3913 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3915 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3916 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3917 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3918 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3919 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3920 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3921 data->REG_TARGET = NCT6116_REG_TARGET; in nct6775_probe()
3922 data->REG_FAN = NCT6116_REG_FAN; in nct6775_probe()
3923 data->REG_FAN_MODE = NCT6116_REG_FAN_MODE; in nct6775_probe()
3924 data->REG_FAN_MIN = NCT6116_REG_FAN_MIN; in nct6775_probe()
3925 data->REG_FAN_PULSES = NCT6116_REG_FAN_PULSES; in nct6775_probe()
3926 data->FAN_PULSE_SHIFT = NCT6116_FAN_PULSE_SHIFT; in nct6775_probe()
3927 data->REG_FAN_TIME[0] = NCT6116_REG_FAN_STOP_TIME; in nct6775_probe()
3928 data->REG_FAN_TIME[1] = NCT6116_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3929 data->REG_FAN_TIME[2] = NCT6116_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3930 data->REG_TOLERANCE_H = NCT6116_REG_TOLERANCE_H; in nct6775_probe()
3931 data->REG_PWM[0] = NCT6116_REG_PWM; in nct6775_probe()
3932 data->REG_PWM[1] = NCT6116_REG_FAN_START_OUTPUT; in nct6775_probe()
3933 data->REG_PWM[2] = NCT6116_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3934 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3935 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3936 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3937 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3938 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3939 data->REG_AUTO_TEMP = NCT6116_REG_AUTO_TEMP; in nct6775_probe()
3940 data->REG_AUTO_PWM = NCT6116_REG_AUTO_PWM; in nct6775_probe()
3941 data->REG_CRITICAL_TEMP = NCT6116_REG_CRITICAL_TEMP; in nct6775_probe()
3942 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3944 data->REG_CRITICAL_PWM_ENABLE = NCT6116_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3945 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3947 data->REG_CRITICAL_PWM = NCT6116_REG_CRITICAL_PWM; in nct6775_probe()
3948 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3949 data->REG_TEMP_SOURCE = NCT6116_REG_TEMP_SOURCE; in nct6775_probe()
3950 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL; in nct6775_probe()
3951 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3952 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3953 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3954 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3955 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3956 data->ALARM_BITS = NCT6116_ALARM_BITS; in nct6775_probe()
3957 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3958 data->BEEP_BITS = NCT6116_BEEP_BITS; in nct6775_probe()
3974 data->in_num = 9; in nct6775_probe()
3975 data->pwm_num = 3; in nct6775_probe()
3976 data->auto_pwm_num = 6; in nct6775_probe()
3977 data->has_fan_div = true; in nct6775_probe()
3978 data->temp_fixed_num = 3; in nct6775_probe()
3979 data->num_temp_alarms = 3; in nct6775_probe()
3980 data->num_temp_beeps = 3; in nct6775_probe()
3982 data->ALARM_BITS = NCT6775_ALARM_BITS; in nct6775_probe()
3983 data->BEEP_BITS = NCT6775_BEEP_BITS; in nct6775_probe()
3985 data->fan_from_reg = fan_from_reg16; in nct6775_probe()
3986 data->fan_from_reg_min = fan_from_reg8; in nct6775_probe()
3987 data->target_temp_mask = 0x7f; in nct6775_probe()
3988 data->tolerance_mask = 0x0f; in nct6775_probe()
3989 data->speed_tolerance_limit = 15; in nct6775_probe()
3991 data->temp_label = nct6775_temp_label; in nct6775_probe()
3992 data->temp_mask = NCT6775_TEMP_MASK; in nct6775_probe()
3993 data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK; in nct6775_probe()
3995 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3996 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3997 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3998 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3999 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
4000 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
4001 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
4002 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
4003 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
4004 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
4005 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN; in nct6775_probe()
4006 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES; in nct6775_probe()
4007 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
4008 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
4009 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; in nct6775_probe()
4010 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
4011 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
4012 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
4013 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
4014 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT; in nct6775_probe()
4015 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT; in nct6775_probe()
4016 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
4017 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
4018 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE; in nct6775_probe()
4019 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK; in nct6775_probe()
4020 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
4021 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
4022 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
4023 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
4025 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
4026 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
4027 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
4028 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
4029 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
4030 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
4031 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
4032 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
4033 data->REG_BEEP = NCT6775_REG_BEEP; in nct6775_probe()
4047 data->in_num = 9; in nct6775_probe()
4048 data->pwm_num = 3; in nct6775_probe()
4049 data->auto_pwm_num = 4; in nct6775_probe()
4050 data->has_fan_div = false; in nct6775_probe()
4051 data->temp_fixed_num = 3; in nct6775_probe()
4052 data->num_temp_alarms = 3; in nct6775_probe()
4053 data->num_temp_beeps = 6; in nct6775_probe()
4055 data->ALARM_BITS = NCT6776_ALARM_BITS; in nct6775_probe()
4056 data->BEEP_BITS = NCT6776_BEEP_BITS; in nct6775_probe()
4058 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
4059 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
4060 data->target_temp_mask = 0xff; in nct6775_probe()
4061 data->tolerance_mask = 0x07; in nct6775_probe()
4062 data->speed_tolerance_limit = 63; in nct6775_probe()
4064 data->temp_label = nct6776_temp_label; in nct6775_probe()
4065 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
4066 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
4068 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
4069 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
4070 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
4071 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
4072 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
4073 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
4074 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
4075 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
4076 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
4077 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
4078 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
4079 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; in nct6775_probe()
4080 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
4081 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
4082 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
4083 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
4084 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
4085 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
4086 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
4087 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
4088 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
4089 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
4090 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
4091 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
4092 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
4093 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
4094 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
4095 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
4096 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
4098 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
4099 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
4100 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
4101 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
4102 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
4103 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
4104 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
4105 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
4106 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
4120 data->in_num = 15; in nct6775_probe()
4121 data->pwm_num = 5; in nct6775_probe()
4122 data->auto_pwm_num = 4; in nct6775_probe()
4123 data->has_fan_div = false; in nct6775_probe()
4124 data->temp_fixed_num = 6; in nct6775_probe()
4125 data->num_temp_alarms = 2; in nct6775_probe()
4126 data->num_temp_beeps = 2; in nct6775_probe()
4128 data->ALARM_BITS = NCT6779_ALARM_BITS; in nct6775_probe()
4129 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
4131 data->fan_from_reg = fan_from_reg_rpm; in nct6775_probe()
4132 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
4133 data->target_temp_mask = 0xff; in nct6775_probe()
4134 data->tolerance_mask = 0x07; in nct6775_probe()
4135 data->speed_tolerance_limit = 63; in nct6775_probe()
4137 data->temp_label = nct6779_temp_label; in nct6775_probe()
4138 data->temp_mask = NCT6779_TEMP_MASK; in nct6775_probe()
4139 data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK; in nct6775_probe()
4141 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
4142 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
4143 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
4144 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
4145 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
4146 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
4147 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
4148 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
4149 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
4150 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
4151 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
4152 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
4153 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
4154 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
4155 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
4156 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
4157 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
4158 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
4159 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
4160 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
4161 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
4162 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
4163 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
4164 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
4165 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
4166 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
4167 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
4168 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
4169 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
4171 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
4172 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
4174 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
4175 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
4176 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
4177 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
4178 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
4179 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
4180 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
4181 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
4182 data->REG_ALARM = NCT6779_REG_ALARM; in nct6775_probe()
4183 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
4203 data->in_num = 15; in nct6775_probe()
4204 data->pwm_num = (data->kind == nct6796 || in nct6775_probe()
4205 data->kind == nct6797 || in nct6775_probe()
4206 data->kind == nct6798) ? 7 : 6; in nct6775_probe()
4207 data->auto_pwm_num = 4; in nct6775_probe()
4208 data->has_fan_div = false; in nct6775_probe()
4209 data->temp_fixed_num = 6; in nct6775_probe()
4210 data->num_temp_alarms = 2; in nct6775_probe()
4211 data->num_temp_beeps = 2; in nct6775_probe()
4213 data->ALARM_BITS = NCT6791_ALARM_BITS; in nct6775_probe()
4214 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
4216 data->fan_from_reg = fan_from_reg_rpm; in nct6775_probe()
4217 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
4218 data->target_temp_mask = 0xff; in nct6775_probe()
4219 data->tolerance_mask = 0x07; in nct6775_probe()
4220 data->speed_tolerance_limit = 63; in nct6775_probe()
4222 switch (data->kind) { in nct6775_probe()
4225 data->temp_label = nct6779_temp_label; in nct6775_probe()
4226 data->temp_mask = NCT6791_TEMP_MASK; in nct6775_probe()
4227 data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK; in nct6775_probe()
4230 data->temp_label = nct6792_temp_label; in nct6775_probe()
4231 data->temp_mask = NCT6792_TEMP_MASK; in nct6775_probe()
4232 data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK; in nct6775_probe()
4235 data->temp_label = nct6793_temp_label; in nct6775_probe()
4236 data->temp_mask = NCT6793_TEMP_MASK; in nct6775_probe()
4237 data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK; in nct6775_probe()
4241 data->temp_label = nct6795_temp_label; in nct6775_probe()
4242 data->temp_mask = NCT6795_TEMP_MASK; in nct6775_probe()
4243 data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK; in nct6775_probe()
4246 data->temp_label = nct6796_temp_label; in nct6775_probe()
4247 data->temp_mask = NCT6796_TEMP_MASK; in nct6775_probe()
4248 data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK; in nct6775_probe()
4251 data->temp_label = nct6798_temp_label; in nct6775_probe()
4252 data->temp_mask = NCT6798_TEMP_MASK; in nct6775_probe()
4253 data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK; in nct6775_probe()
4257 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
4258 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
4259 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
4260 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
4261 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
4262 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
4263 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
4264 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
4265 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
4266 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
4267 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
4268 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
4269 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
4270 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
4271 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
4272 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
4273 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
4274 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
4275 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
4276 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
4277 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
4278 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
4279 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
4280 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
4281 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
4282 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
4283 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
4284 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
4285 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
4287 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
4288 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
4290 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
4291 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
4292 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
4293 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
4294 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
4295 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
4296 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
4297 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
4298 data->REG_ALARM = NCT6791_REG_ALARM; in nct6775_probe()
4299 if (data->kind == nct6791) in nct6775_probe()
4300 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
4302 data->REG_BEEP = NCT6792_REG_BEEP; in nct6775_probe()
4306 if (data->kind == nct6791) { in nct6775_probe()
4321 return -ENODEV; in nct6775_probe()
4323 data->have_in = BIT(data->in_num) - 1; in nct6775_probe()
4324 data->have_temp = 0; in nct6775_probe()
4340 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
4351 add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask); in nct6775_probe()
4352 add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask); in nct6775_probe()
4360 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
4364 if (!(data->temp_mask & BIT(src))) { in nct6775_probe()
4367 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]); in nct6775_probe()
4374 if (src <= data->temp_fixed_num) { in nct6775_probe()
4375 data->have_temp |= BIT(src - 1); in nct6775_probe()
4376 data->have_temp_fixed |= BIT(src - 1); in nct6775_probe()
4377 data->reg_temp[0][src - 1] = reg_temp[i]; in nct6775_probe()
4378 data->reg_temp[1][src - 1] = reg_temp_over[i]; in nct6775_probe()
4379 data->reg_temp[2][src - 1] = reg_temp_hyst[i]; in nct6775_probe()
4381 data->reg_temp[3][src - 1] = reg_temp_crit_h[i]; in nct6775_probe()
4382 else if (reg_temp_crit[src - 1]) in nct6775_probe()
4383 data->reg_temp[3][src - 1] in nct6775_probe()
4384 = reg_temp_crit[src - 1]; in nct6775_probe()
4386 data->reg_temp[4][src - 1] = reg_temp_crit_l[i]; in nct6775_probe()
4387 data->reg_temp_config[src - 1] = reg_temp_config[i]; in nct6775_probe()
4388 data->temp_src[src - 1] = src; in nct6775_probe()
4396 data->have_temp |= BIT(s); in nct6775_probe()
4397 data->reg_temp[0][s] = reg_temp[i]; in nct6775_probe()
4398 data->reg_temp[1][s] = reg_temp_over[i]; in nct6775_probe()
4399 data->reg_temp[2][s] = reg_temp_hyst[i]; in nct6775_probe()
4400 data->reg_temp_config[s] = reg_temp_config[i]; in nct6775_probe()
4402 data->reg_temp[3][s] = reg_temp_crit_h[i]; in nct6775_probe()
4403 else if (reg_temp_crit[src - 1]) in nct6775_probe()
4404 data->reg_temp[3][s] = reg_temp_crit[src - 1]; in nct6775_probe()
4406 data->reg_temp[4][s] = reg_temp_crit_l[i]; in nct6775_probe()
4408 data->temp_src[s] = src; in nct6775_probe()
4420 src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; in nct6775_probe()
4424 if (!(data->temp_mask & BIT(src))) { in nct6775_probe()
4427 src, i, data->REG_TEMP_SEL[i], in nct6775_probe()
4437 if (!(data->virt_temp_mask & BIT(src))) { in nct6775_probe()
4444 if (src <= data->temp_fixed_num) { in nct6775_probe()
4445 if (data->have_temp & BIT(src - 1)) in nct6775_probe()
4447 data->have_temp |= BIT(src - 1); in nct6775_probe()
4448 data->have_temp_fixed |= BIT(src - 1); in nct6775_probe()
4449 data->reg_temp[0][src - 1] = reg_temp_mon[i]; in nct6775_probe()
4450 data->temp_src[src - 1] = src; in nct6775_probe()
4458 data->have_temp |= BIT(s); in nct6775_probe()
4459 data->reg_temp[0][s] = reg_temp_mon[i]; in nct6775_probe()
4460 data->temp_src[s] = src; in nct6775_probe()
4472 if (!(data->temp_mask & BIT(i + 1))) in nct6775_probe()
4478 if (i < data->temp_fixed_num) { in nct6775_probe()
4479 if (data->have_temp & BIT(i)) in nct6775_probe()
4481 data->have_temp |= BIT(i); in nct6775_probe()
4482 data->have_temp_fixed |= BIT(i); in nct6775_probe()
4483 data->reg_temp[0][i] = reg_temp_alternate[i]; in nct6775_probe()
4485 data->reg_temp[1][i] = reg_temp_over[i]; in nct6775_probe()
4486 data->reg_temp[2][i] = reg_temp_hyst[i]; in nct6775_probe()
4488 data->temp_src[i] = i + 1; in nct6775_probe()
4495 data->have_temp |= BIT(s); in nct6775_probe()
4496 data->reg_temp[0][s] = reg_temp_alternate[i]; in nct6775_probe()
4497 data->temp_src[s] = i + 1; in nct6775_probe()
4503 nct6775_init_device(data); in nct6775_probe()
4505 err = superio_enter(sio_data->sioreg); in nct6775_probe()
4509 cr2a = superio_inb(sio_data->sioreg, 0x2a); in nct6775_probe()
4510 switch (data->kind) { in nct6775_probe()
4512 data->have_vid = (cr2a & 0x40); in nct6775_probe()
4515 data->have_vid = (cr2a & 0x60) == 0x40; in nct6775_probe()
4534 if (data->have_vid) { in nct6775_probe()
4535 superio_select(sio_data->sioreg, NCT6775_LD_VID); in nct6775_probe()
4536 data->vid = superio_inb(sio_data->sioreg, 0xe3); in nct6775_probe()
4537 data->vrm = vid_which_vrm(); in nct6775_probe()
4543 superio_select(sio_data->sioreg, NCT6775_LD_HWM); in nct6775_probe()
4544 tmp = superio_inb(sio_data->sioreg, in nct6775_probe()
4546 switch (data->kind) { in nct6775_probe()
4568 superio_outb(sio_data->sioreg, NCT6775_REG_CR_FAN_DEBOUNCE, in nct6775_probe()
4570 dev_info(&pdev->dev, "Enabled fan debounce for chip %s\n", in nct6775_probe()
4571 data->name); in nct6775_probe()
4574 nct6775_check_fan_inputs(data); in nct6775_probe()
4576 superio_exit(sio_data->sioreg); in nct6775_probe()
4579 nct6775_init_fan_common(dev, data); in nct6775_probe()
4583 data->pwm_num); in nct6775_probe()
4587 data->groups[num_attr_groups++] = group; in nct6775_probe()
4590 fls(data->have_in)); in nct6775_probe()
4594 data->groups[num_attr_groups++] = group; in nct6775_probe()
4597 fls(data->has_fan)); in nct6775_probe()
4601 data->groups[num_attr_groups++] = group; in nct6775_probe()
4604 fls(data->have_temp)); in nct6775_probe()
4608 data->groups[num_attr_groups++] = group; in nct6775_probe()
4609 data->groups[num_attr_groups++] = &nct6775_group_other; in nct6775_probe()
4611 hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name, in nct6775_probe()
4612 data, data->groups); in nct6775_probe()
4630 struct nct6775_data *data = nct6775_update_device(dev); in nct6775_suspend() local
4632 mutex_lock(&data->update_lock); in nct6775_suspend()
4633 data->vbat = nct6775_read_value(data, data->REG_VBAT); in nct6775_suspend()
4634 if (data->kind == nct6775) { in nct6775_suspend()
4635 data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_suspend()
4636 data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_suspend()
4638 mutex_unlock(&data->update_lock); in nct6775_suspend()
4645 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_resume() local
4646 int sioreg = data->sioreg; in nct6775_resume()
4648 u8 reg; in nct6775_resume() local
4650 mutex_lock(&data->update_lock); in nct6775_resume()
4651 data->bank = 0xff; /* Force initial bank selection */ in nct6775_resume()
4658 reg = superio_inb(sioreg, SIO_REG_ENABLE); in nct6775_resume()
4659 if (reg != data->sio_reg_enable) in nct6775_resume()
4660 superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable); in nct6775_resume()
4662 if (data->kind == nct6791 || data->kind == nct6792 || in nct6775_resume()
4663 data->kind == nct6793 || data->kind == nct6795 || in nct6775_resume()
4664 data->kind == nct6796 || data->kind == nct6797 || in nct6775_resume()
4665 data->kind == nct6798) in nct6775_resume()
4671 for (i = 0; i < data->in_num; i++) { in nct6775_resume()
4672 if (!(data->have_in & BIT(i))) in nct6775_resume()
4675 nct6775_write_value(data, data->REG_IN_MINMAX[0][i], in nct6775_resume()
4676 data->in[i][1]); in nct6775_resume()
4677 nct6775_write_value(data, data->REG_IN_MINMAX[1][i], in nct6775_resume()
4678 data->in[i][2]); in nct6775_resume()
4681 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_resume()
4682 if (!(data->has_fan_min & BIT(i))) in nct6775_resume()
4685 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_resume()
4686 data->fan_min[i]); in nct6775_resume()
4690 if (!(data->have_temp & BIT(i))) in nct6775_resume()
4693 for (j = 1; j < ARRAY_SIZE(data->reg_temp); j++) in nct6775_resume()
4694 if (data->reg_temp[j][i]) in nct6775_resume()
4695 nct6775_write_temp(data, data->reg_temp[j][i], in nct6775_resume()
4696 data->temp[j][i]); in nct6775_resume()
4700 nct6775_write_value(data, data->REG_VBAT, data->vbat); in nct6775_resume()
4701 if (data->kind == nct6775) { in nct6775_resume()
4702 nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); in nct6775_resume()
4703 nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); in nct6775_resume()
4707 /* Force re-reading all values */ in nct6775_resume()
4708 data->valid = false; in nct6775_resume()
4709 mutex_unlock(&data->update_lock); in nct6775_resume()
4724 /* nct6775_find() looks for a '627 in the Super-I/O config space */
4742 sio_data->kind = nct6106; in nct6775_find()
4745 sio_data->kind = nct6116; in nct6775_find()
4748 sio_data->kind = nct6775; in nct6775_find()
4751 sio_data->kind = nct6776; in nct6775_find()
4754 sio_data->kind = nct6779; in nct6775_find()
4757 sio_data->kind = nct6791; in nct6775_find()
4760 sio_data->kind = nct6792; in nct6775_find()
4763 sio_data->kind = nct6793; in nct6775_find()
4766 sio_data->kind = nct6795; in nct6775_find()
4769 sio_data->kind = nct6796; in nct6775_find()
4772 sio_data->kind = nct6797; in nct6775_find()
4775 sio_data->kind = nct6798; in nct6775_find()
4781 return -ENODEV; in nct6775_find()
4790 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n"); in nct6775_find()
4792 return -ENODEV; in nct6775_find()
4798 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n"); in nct6775_find()
4802 if (sio_data->kind == nct6791 || sio_data->kind == nct6792 || in nct6775_find()
4803 sio_data->kind == nct6793 || sio_data->kind == nct6795 || in nct6775_find()
4804 sio_data->kind == nct6796 || sio_data->kind == nct6797 || in nct6775_find()
4805 sio_data->kind == nct6798) in nct6775_find()
4810 nct6775_sio_names[sio_data->kind], sioaddr, addr); in nct6775_find()
4811 sio_data->sioreg = sioaddr; in nct6775_find()
4817 * when Super-I/O functions move to a separate file, the Super-I/O
4838 * initialize sio_data->kind and sio_data->sioreg. in sensors_nct6775_init()
4840 * when Super-I/O functions move to a separate file, the Super-I/O in sensors_nct6775_init()
4841 * driver will probe 0x2e and 0x4e and auto-detect the presence of a in sensors_nct6775_init()
4853 err = -ENOMEM; in sensors_nct6775_init()
4865 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; in sensors_nct6775_init()
4885 err = -ENODEV; in sensors_nct6775_init()
4894 while (--i >= 0) { in sensors_nct6775_init()
4914 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");