Lines Matching full:data
74 /* used to set data->name = nct6775_device_names[data->sio_kind] */
210 /* Common and NCT6775 specific data */
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
394 /* NCT6776 specific data */
477 /* NCT6779 specific data */
578 /* NCT6791 specific data */
601 /* NCT6792/NCT6793 specific data */
760 /* NCT6102D/NCT6106D specific data */
966 * Data structures and manipulation thereof
1256 static bool is_word_sized(struct nct6775_data *data, u16 reg) in is_word_sized() argument
1258 switch (data->kind) { in is_word_sized()
1309 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg) in nct6775_set_bank() argument
1313 if (data->bank != bank) { in nct6775_set_bank()
1314 outb_p(NCT6775_REG_BANK, data->addr + ADDR_REG_OFFSET); in nct6775_set_bank()
1315 outb_p(bank, data->addr + DATA_REG_OFFSET); in nct6775_set_bank()
1316 data->bank = bank; in nct6775_set_bank()
1320 static u16 nct6775_read_value(struct nct6775_data *data, u16 reg) in nct6775_read_value() argument
1322 int res, word_sized = is_word_sized(data, reg); in nct6775_read_value()
1324 nct6775_set_bank(data, reg); in nct6775_read_value()
1325 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1326 res = inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1329 data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1330 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1335 static int nct6775_write_value(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_value() argument
1337 int word_sized = is_word_sized(data, reg); in nct6775_write_value()
1339 nct6775_set_bank(data, reg); in nct6775_write_value()
1340 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1342 outb_p(value >> 8, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1344 data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1346 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1351 static u16 nct6775_read_temp(struct nct6775_data *data, u16 reg) in nct6775_read_temp() argument
1355 res = nct6775_read_value(data, reg); in nct6775_read_temp()
1356 if (!is_word_sized(data, reg)) in nct6775_read_temp()
1362 static int nct6775_write_temp(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_temp() argument
1364 if (!is_word_sized(data, reg)) in nct6775_write_temp()
1366 return nct6775_write_value(data, reg, value); in nct6775_write_temp()
1369 /* This function assumes that the caller holds data->update_lock */
1370 static void nct6775_write_fan_div(struct nct6775_data *data, int nr) in nct6775_write_fan_div() argument
1376 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x70) in nct6775_write_fan_div()
1377 | (data->fan_div[0] & 0x7); in nct6775_write_fan_div()
1378 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1381 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x7) in nct6775_write_fan_div()
1382 | ((data->fan_div[1] << 4) & 0x70); in nct6775_write_fan_div()
1383 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1386 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x70) in nct6775_write_fan_div()
1387 | (data->fan_div[2] & 0x7); in nct6775_write_fan_div()
1388 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1391 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x7) in nct6775_write_fan_div()
1392 | ((data->fan_div[3] << 4) & 0x70); in nct6775_write_fan_div()
1393 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1398 static void nct6775_write_fan_div_common(struct nct6775_data *data, int nr) in nct6775_write_fan_div_common() argument
1400 if (data->kind == nct6775) in nct6775_write_fan_div_common()
1401 nct6775_write_fan_div(data, nr); in nct6775_write_fan_div_common()
1404 static void nct6775_update_fan_div(struct nct6775_data *data) in nct6775_update_fan_div() argument
1408 i = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_update_fan_div()
1409 data->fan_div[0] = i & 0x7; in nct6775_update_fan_div()
1410 data->fan_div[1] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1411 i = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_update_fan_div()
1412 data->fan_div[2] = i & 0x7; in nct6775_update_fan_div()
1413 if (data->has_fan & BIT(3)) in nct6775_update_fan_div()
1414 data->fan_div[3] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1417 static void nct6775_update_fan_div_common(struct nct6775_data *data) in nct6775_update_fan_div_common() argument
1419 if (data->kind == nct6775) in nct6775_update_fan_div_common()
1420 nct6775_update_fan_div(data); in nct6775_update_fan_div_common()
1423 static void nct6775_init_fan_div(struct nct6775_data *data) in nct6775_init_fan_div() argument
1427 nct6775_update_fan_div_common(data); in nct6775_init_fan_div()
1434 for (i = 0; i < ARRAY_SIZE(data->fan_div); i++) { in nct6775_init_fan_div()
1435 if (!(data->has_fan & BIT(i))) in nct6775_init_fan_div()
1437 if (data->fan_div[i] == 0) { in nct6775_init_fan_div()
1438 data->fan_div[i] = 7; in nct6775_init_fan_div()
1439 nct6775_write_fan_div_common(data, i); in nct6775_init_fan_div()
1445 struct nct6775_data *data) in nct6775_init_fan_common() argument
1450 if (data->has_fan_div) in nct6775_init_fan_common()
1451 nct6775_init_fan_div(data); in nct6775_init_fan_common()
1457 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_init_fan_common()
1458 if (data->has_fan_min & BIT(i)) { in nct6775_init_fan_common()
1459 reg = nct6775_read_value(data, data->REG_FAN_MIN[i]); in nct6775_init_fan_common()
1461 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_init_fan_common()
1462 data->has_fan_div ? 0xff in nct6775_init_fan_common()
1469 struct nct6775_data *data, int nr, u16 reg) in nct6775_select_fan_div() argument
1471 u8 fan_div = data->fan_div[nr]; in nct6775_select_fan_div()
1474 if (!data->has_fan_div) in nct6775_select_fan_div()
1487 if (fan_div != data->fan_div[nr]) { in nct6775_select_fan_div()
1489 nr + 1, div_from_reg(data->fan_div[nr]), in nct6775_select_fan_div()
1493 if (data->has_fan_min & BIT(nr)) { in nct6775_select_fan_div()
1494 fan_min = data->fan_min[nr]; in nct6775_select_fan_div()
1495 if (fan_div > data->fan_div[nr]) { in nct6775_select_fan_div()
1505 if (fan_min != data->fan_min[nr]) { in nct6775_select_fan_div()
1506 data->fan_min[nr] = fan_min; in nct6775_select_fan_div()
1507 nct6775_write_value(data, data->REG_FAN_MIN[nr], in nct6775_select_fan_div()
1511 data->fan_div[nr] = fan_div; in nct6775_select_fan_div()
1512 nct6775_write_fan_div_common(data, nr); in nct6775_select_fan_div()
1518 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm() local
1523 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm()
1524 if (!(data->has_pwm & BIT(i))) in nct6775_update_pwm()
1527 duty_is_dc = data->REG_PWM_MODE[i] && in nct6775_update_pwm()
1528 (nct6775_read_value(data, data->REG_PWM_MODE[i]) in nct6775_update_pwm()
1529 & data->PWM_MODE_MASK[i]); in nct6775_update_pwm()
1530 data->pwm_mode[i] = !duty_is_dc; in nct6775_update_pwm()
1532 fanmodecfg = nct6775_read_value(data, data->REG_FAN_MODE[i]); in nct6775_update_pwm()
1533 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) { in nct6775_update_pwm()
1534 if (data->REG_PWM[j] && data->REG_PWM[j][i]) { in nct6775_update_pwm()
1535 data->pwm[j][i] in nct6775_update_pwm()
1536 = nct6775_read_value(data, in nct6775_update_pwm()
1537 data->REG_PWM[j][i]); in nct6775_update_pwm()
1541 data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i], in nct6775_update_pwm()
1544 if (!data->temp_tolerance[0][i] || in nct6775_update_pwm()
1545 data->pwm_enable[i] != speed_cruise) in nct6775_update_pwm()
1546 data->temp_tolerance[0][i] = fanmodecfg & 0x0f; in nct6775_update_pwm()
1547 if (!data->target_speed_tolerance[i] || in nct6775_update_pwm()
1548 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm()
1551 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm()
1552 t |= (nct6775_read_value(data, in nct6775_update_pwm()
1553 data->REG_TOLERANCE_H[i]) & 0x70) >> 1; in nct6775_update_pwm()
1555 data->target_speed_tolerance[i] = t; in nct6775_update_pwm()
1558 data->temp_tolerance[1][i] = in nct6775_update_pwm()
1559 nct6775_read_value(data, in nct6775_update_pwm()
1560 data->REG_CRITICAL_TEMP_TOLERANCE[i]); in nct6775_update_pwm()
1562 reg = nct6775_read_value(data, data->REG_TEMP_SEL[i]); in nct6775_update_pwm()
1563 data->pwm_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1566 data->pwm[2][i] = 0; in nct6775_update_pwm()
1568 if (!data->REG_WEIGHT_TEMP_SEL[i]) in nct6775_update_pwm()
1571 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); in nct6775_update_pwm()
1572 data->pwm_weight_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1575 data->pwm_weight_temp_sel[i] = 0; in nct6775_update_pwm()
1577 /* Weight temp data */ in nct6775_update_pwm()
1578 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) { in nct6775_update_pwm()
1579 data->weight_temp[j][i] in nct6775_update_pwm()
1580 = nct6775_read_value(data, in nct6775_update_pwm()
1581 data->REG_WEIGHT_TEMP[j][i]); in nct6775_update_pwm()
1588 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm_limits() local
1593 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm_limits()
1594 if (!(data->has_pwm & BIT(i))) in nct6775_update_pwm_limits()
1597 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) { in nct6775_update_pwm_limits()
1598 data->fan_time[j][i] = in nct6775_update_pwm_limits()
1599 nct6775_read_value(data, data->REG_FAN_TIME[j][i]); in nct6775_update_pwm_limits()
1602 reg_t = nct6775_read_value(data, data->REG_TARGET[i]); in nct6775_update_pwm_limits()
1604 if (!data->target_temp[i] || in nct6775_update_pwm_limits()
1605 data->pwm_enable[i] == thermal_cruise) in nct6775_update_pwm_limits()
1606 data->target_temp[i] = reg_t & data->target_temp_mask; in nct6775_update_pwm_limits()
1607 if (!data->target_speed[i] || in nct6775_update_pwm_limits()
1608 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm_limits()
1609 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm_limits()
1610 reg_t |= (nct6775_read_value(data, in nct6775_update_pwm_limits()
1611 data->REG_TOLERANCE_H[i]) & 0x0f) << 8; in nct6775_update_pwm_limits()
1613 data->target_speed[i] = reg_t; in nct6775_update_pwm_limits()
1616 for (j = 0; j < data->auto_pwm_num; j++) { in nct6775_update_pwm_limits()
1617 data->auto_pwm[i][j] = in nct6775_update_pwm_limits()
1618 nct6775_read_value(data, in nct6775_update_pwm_limits()
1619 NCT6775_AUTO_PWM(data, i, j)); in nct6775_update_pwm_limits()
1620 data->auto_temp[i][j] = in nct6775_update_pwm_limits()
1621 nct6775_read_value(data, in nct6775_update_pwm_limits()
1622 NCT6775_AUTO_TEMP(data, i, j)); in nct6775_update_pwm_limits()
1625 /* critical auto_pwm temperature data */ in nct6775_update_pwm_limits()
1626 data->auto_temp[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1627 nct6775_read_value(data, data->REG_CRITICAL_TEMP[i]); in nct6775_update_pwm_limits()
1629 switch (data->kind) { in nct6775_update_pwm_limits()
1631 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1633 data->auto_pwm[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1637 data->auto_pwm[i][data->auto_pwm_num] = 0xff; in nct6775_update_pwm_limits()
1646 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1647 data->REG_CRITICAL_PWM_ENABLE[i]); in nct6775_update_pwm_limits()
1648 if (reg & data->CRITICAL_PWM_ENABLE_MASK) in nct6775_update_pwm_limits()
1649 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1650 data->REG_CRITICAL_PWM[i]); in nct6775_update_pwm_limits()
1653 data->auto_pwm[i][data->auto_pwm_num] = reg; in nct6775_update_pwm_limits()
1661 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_device() local
1664 mutex_lock(&data->update_lock); in nct6775_update_device()
1666 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) in nct6775_update_device()
1667 || !data->valid) { in nct6775_update_device()
1669 nct6775_update_fan_div_common(data); in nct6775_update_device()
1672 for (i = 0; i < data->in_num; i++) { in nct6775_update_device()
1673 if (!(data->have_in & BIT(i))) in nct6775_update_device()
1676 data->in[i][0] = nct6775_read_value(data, in nct6775_update_device()
1677 data->REG_VIN[i]); in nct6775_update_device()
1678 data->in[i][1] = nct6775_read_value(data, in nct6775_update_device()
1679 data->REG_IN_MINMAX[0][i]); in nct6775_update_device()
1680 data->in[i][2] = nct6775_read_value(data, in nct6775_update_device()
1681 data->REG_IN_MINMAX[1][i]); in nct6775_update_device()
1685 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) { in nct6775_update_device()
1688 if (!(data->has_fan & BIT(i))) in nct6775_update_device()
1691 reg = nct6775_read_value(data, data->REG_FAN[i]); in nct6775_update_device()
1692 data->rpm[i] = data->fan_from_reg(reg, in nct6775_update_device()
1693 data->fan_div[i]); in nct6775_update_device()
1695 if (data->has_fan_min & BIT(i)) in nct6775_update_device()
1696 data->fan_min[i] = nct6775_read_value(data, in nct6775_update_device()
1697 data->REG_FAN_MIN[i]); in nct6775_update_device()
1699 if (data->REG_FAN_PULSES[i]) { in nct6775_update_device()
1700 data->fan_pulses[i] = in nct6775_update_device()
1701 (nct6775_read_value(data, in nct6775_update_device()
1702 data->REG_FAN_PULSES[i]) in nct6775_update_device()
1703 >> data->FAN_PULSE_SHIFT[i]) & 0x03; in nct6775_update_device()
1706 nct6775_select_fan_div(dev, data, i, reg); in nct6775_update_device()
1714 if (!(data->have_temp & BIT(i))) in nct6775_update_device()
1716 for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) { in nct6775_update_device()
1717 if (data->reg_temp[j][i]) in nct6775_update_device()
1718 data->temp[j][i] in nct6775_update_device()
1719 = nct6775_read_temp(data, in nct6775_update_device()
1720 data->reg_temp[j][i]); in nct6775_update_device()
1723 !(data->have_temp_fixed & BIT(i))) in nct6775_update_device()
1725 data->temp_offset[i] in nct6775_update_device()
1726 = nct6775_read_value(data, data->REG_TEMP_OFFSET[i]); in nct6775_update_device()
1729 data->alarms = 0; in nct6775_update_device()
1733 if (!data->REG_ALARM[i]) in nct6775_update_device()
1735 alarm = nct6775_read_value(data, data->REG_ALARM[i]); in nct6775_update_device()
1736 data->alarms |= ((u64)alarm) << (i << 3); in nct6775_update_device()
1739 data->beeps = 0; in nct6775_update_device()
1743 if (!data->REG_BEEP[i]) in nct6775_update_device()
1745 beep = nct6775_read_value(data, data->REG_BEEP[i]); in nct6775_update_device()
1746 data->beeps |= ((u64)beep) << (i << 3); in nct6775_update_device()
1749 data->last_updated = jiffies; in nct6775_update_device()
1750 data->valid = true; in nct6775_update_device()
1753 mutex_unlock(&data->update_lock); in nct6775_update_device()
1754 return data; in nct6775_update_device()
1763 struct nct6775_data *data = nct6775_update_device(dev); in show_in_reg() local
1768 return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr)); in show_in_reg()
1775 struct nct6775_data *data = dev_get_drvdata(dev); in store_in_reg() local
1785 mutex_lock(&data->update_lock); in store_in_reg()
1786 data->in[nr][index] = in_to_reg(val, nr); in store_in_reg()
1787 nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], in store_in_reg()
1788 data->in[nr][index]); in store_in_reg()
1789 mutex_unlock(&data->update_lock); in store_in_reg()
1796 struct nct6775_data *data = nct6775_update_device(dev); in show_alarm() local
1798 int nr = data->ALARM_BITS[sattr->index]; in show_alarm()
1801 (unsigned int)((data->alarms >> nr) & 0x01)); in show_alarm()
1804 static int find_temp_source(struct nct6775_data *data, int index, int count) in find_temp_source() argument
1806 int source = data->temp_src[index]; in find_temp_source()
1812 src = nct6775_read_value(data, in find_temp_source()
1813 data->REG_TEMP_SOURCE[nr]) & 0x1f; in find_temp_source()
1824 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_alarm() local
1832 nr = find_temp_source(data, sattr->index, data->num_temp_alarms); in show_temp_alarm()
1834 int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE]; in show_temp_alarm()
1836 alarm = (data->alarms >> bit) & 0x01; in show_temp_alarm()
1845 struct nct6775_data *data = nct6775_update_device(dev); in show_beep() local
1846 int nr = data->BEEP_BITS[sattr->index]; in show_beep()
1849 (unsigned int)((data->beeps >> nr) & 0x01)); in show_beep()
1857 struct nct6775_data *data = dev_get_drvdata(dev); in store_beep() local
1858 int nr = data->BEEP_BITS[sattr->index]; in store_beep()
1869 mutex_lock(&data->update_lock); in store_beep()
1871 data->beeps |= (1ULL << nr); in store_beep()
1873 data->beeps &= ~(1ULL << nr); in store_beep()
1874 nct6775_write_value(data, data->REG_BEEP[regindex], in store_beep()
1875 (data->beeps >> (regindex << 3)) & 0xff); in store_beep()
1876 mutex_unlock(&data->update_lock); in store_beep()
1884 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_beep() local
1893 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in show_temp_beep()
1895 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in show_temp_beep()
1897 beep = (data->beeps >> bit) & 0x01; in show_temp_beep()
1907 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_beep() local
1918 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in store_temp_beep()
1922 bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in store_temp_beep()
1925 mutex_lock(&data->update_lock); in store_temp_beep()
1927 data->beeps |= (1ULL << bit); in store_temp_beep()
1929 data->beeps &= ~(1ULL << bit); in store_temp_beep()
1930 nct6775_write_value(data, data->REG_BEEP[regindex], in store_temp_beep()
1931 (data->beeps >> (regindex << 3)) & 0xff); in store_temp_beep()
1932 mutex_unlock(&data->update_lock); in store_temp_beep()
1941 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_in_is_visible() local
1944 if (!(data->have_in & BIT(in))) in nct6775_in_is_visible()
1981 struct nct6775_data *data = nct6775_update_device(dev); in show_fan() local
1985 return sprintf(buf, "%d\n", data->rpm[nr]); in show_fan()
1991 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_min() local
1996 data->fan_from_reg_min(data->fan_min[nr], in show_fan_min()
1997 data->fan_div[nr])); in show_fan_min()
2003 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_div() local
2007 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr])); in show_fan_div()
2014 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_min() local
2026 mutex_lock(&data->update_lock); in store_fan_min()
2027 if (!data->has_fan_div) { in store_fan_min()
2037 data->fan_min[nr] = val; in store_fan_min()
2042 data->fan_min[nr] = 255; in store_fan_min()
2043 new_div = data->fan_div[nr]; /* No change */ in store_fan_min()
2053 data->fan_min[nr] = 254; in store_fan_min()
2057 nr + 1, val, data->fan_from_reg_min(254, 7)); in store_fan_min()
2063 data->fan_min[nr] = 1; in store_fan_min()
2067 nr + 1, val, data->fan_from_reg_min(1, 0)); in store_fan_min()
2079 data->fan_min[nr] = reg; in store_fan_min()
2087 if (new_div != data->fan_div[nr]) { in store_fan_min()
2089 nr + 1, div_from_reg(data->fan_div[nr]), in store_fan_min()
2091 data->fan_div[nr] = new_div; in store_fan_min()
2092 nct6775_write_fan_div_common(data, nr); in store_fan_min()
2094 data->last_updated = jiffies; in store_fan_min()
2098 nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); in store_fan_min()
2099 mutex_unlock(&data->update_lock); in store_fan_min()
2107 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_pulses() local
2109 int p = data->fan_pulses[sattr->index]; in show_fan_pulses()
2118 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_pulses() local
2132 mutex_lock(&data->update_lock); in store_fan_pulses()
2133 data->fan_pulses[nr] = val & 3; in store_fan_pulses()
2134 reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]); in store_fan_pulses()
2135 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]); in store_fan_pulses()
2136 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr]; in store_fan_pulses()
2137 nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg); in store_fan_pulses()
2138 mutex_unlock(&data->update_lock); in store_fan_pulses()
2147 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_fan_is_visible() local
2151 if (!(data->has_fan & BIT(fan))) in nct6775_fan_is_visible()
2154 if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2156 if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2158 if (nr == 3 && !data->REG_FAN_PULSES[fan]) in nct6775_fan_is_visible()
2160 if (nr == 4 && !(data->has_fan_min & BIT(fan))) in nct6775_fan_is_visible()
2162 if (nr == 5 && data->kind != nct6775) in nct6775_fan_is_visible()
2203 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_label() local
2207 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]); in show_temp_label()
2213 struct nct6775_data *data = nct6775_update_device(dev); in show_temp() local
2218 return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr])); in show_temp()
2225 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp() local
2236 mutex_lock(&data->update_lock); in store_temp()
2237 data->temp[index][nr] = LM75_TEMP_TO_REG(val); in store_temp()
2238 nct6775_write_temp(data, data->reg_temp[index][nr], in store_temp()
2239 data->temp[index][nr]); in store_temp()
2240 mutex_unlock(&data->update_lock); in store_temp()
2247 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_offset() local
2250 return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000); in show_temp_offset()
2257 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_offset() local
2269 mutex_lock(&data->update_lock); in store_temp_offset()
2270 data->temp_offset[nr] = val; in store_temp_offset()
2271 nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val); in store_temp_offset()
2272 mutex_unlock(&data->update_lock); in store_temp_offset()
2280 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_type() local
2284 return sprintf(buf, "%d\n", (int)data->temp_type[nr]); in show_temp_type()
2291 struct nct6775_data *data = nct6775_update_device(dev); in store_temp_type() local
2305 mutex_lock(&data->update_lock); in store_temp_type()
2307 data->temp_type[nr] = val; in store_temp_type()
2309 dbit = data->DIODE_MASK << nr; in store_temp_type()
2310 vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit; in store_temp_type()
2311 diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit; in store_temp_type()
2323 nct6775_write_value(data, data->REG_VBAT, vbat); in store_temp_type()
2324 nct6775_write_value(data, data->REG_DIODE, diode); in store_temp_type()
2326 mutex_unlock(&data->update_lock); in store_temp_type()
2334 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_temp_is_visible() local
2338 if (!(data->have_temp & BIT(temp))) in nct6775_temp_is_visible()
2341 if (nr == 1 && !data->temp_label) in nct6775_temp_is_visible()
2344 if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0) in nct6775_temp_is_visible()
2347 if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0) in nct6775_temp_is_visible()
2350 if (nr == 4 && !data->reg_temp[1][temp]) /* max */ in nct6775_temp_is_visible()
2353 if (nr == 5 && !data->reg_temp[2][temp]) /* max_hyst */ in nct6775_temp_is_visible()
2356 if (nr == 6 && !data->reg_temp[3][temp]) /* crit */ in nct6775_temp_is_visible()
2359 if (nr == 7 && !data->reg_temp[4][temp]) /* lcrit */ in nct6775_temp_is_visible()
2363 if (nr > 7 && !(data->have_temp_fixed & BIT(temp))) in nct6775_temp_is_visible()
2415 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_mode() local
2418 return sprintf(buf, "%d\n", data->pwm_mode[sattr->index]); in show_pwm_mode()
2425 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_mode() local
2440 if (data->REG_PWM_MODE[nr] == 0) { in store_pwm_mode()
2446 mutex_lock(&data->update_lock); in store_pwm_mode()
2447 data->pwm_mode[nr] = val; in store_pwm_mode()
2448 reg = nct6775_read_value(data, data->REG_PWM_MODE[nr]); in store_pwm_mode()
2449 reg &= ~data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2451 reg |= data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2452 nct6775_write_value(data, data->REG_PWM_MODE[nr], reg); in store_pwm_mode()
2453 mutex_unlock(&data->update_lock); in store_pwm_mode()
2460 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm() local
2470 if (index == 0 && data->pwm_enable[nr] > manual) in show_pwm()
2471 pwm = nct6775_read_value(data, data->REG_PWM_READ[nr]); in show_pwm()
2473 pwm = data->pwm[index][nr]; in show_pwm()
2482 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm() local
2487 int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 }; in store_pwm()
2489 = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 }; in store_pwm()
2498 mutex_lock(&data->update_lock); in store_pwm()
2499 data->pwm[index][nr] = val; in store_pwm()
2500 nct6775_write_value(data, data->REG_PWM[index][nr], val); in store_pwm()
2502 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm()
2506 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm()
2508 mutex_unlock(&data->update_lock); in store_pwm()
2513 static int check_trip_points(struct nct6775_data *data, int nr) in check_trip_points() argument
2517 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2518 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
2521 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2522 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) in check_trip_points()
2526 if (data->auto_pwm[nr][data->auto_pwm_num]) { in check_trip_points()
2527 if (data->auto_temp[nr][data->auto_pwm_num - 1] > in check_trip_points()
2528 data->auto_temp[nr][data->auto_pwm_num] || in check_trip_points()
2529 data->auto_pwm[nr][data->auto_pwm_num - 1] > in check_trip_points()
2530 data->auto_pwm[nr][data->auto_pwm_num]) in check_trip_points()
2536 static void pwm_update_registers(struct nct6775_data *data, int nr) in pwm_update_registers() argument
2540 switch (data->pwm_enable[nr]) { in pwm_update_registers()
2545 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2546 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2547 (data->target_speed_tolerance[nr] & data->tolerance_mask); in pwm_update_registers()
2548 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2549 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2550 data->target_speed[nr] & 0xff); in pwm_update_registers()
2551 if (data->REG_TOLERANCE_H) { in pwm_update_registers()
2552 reg = (data->target_speed[nr] >> 8) & 0x0f; in pwm_update_registers()
2553 reg |= (data->target_speed_tolerance[nr] & 0x38) << 1; in pwm_update_registers()
2554 nct6775_write_value(data, in pwm_update_registers()
2555 data->REG_TOLERANCE_H[nr], in pwm_update_registers()
2560 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2561 data->target_temp[nr]); in pwm_update_registers()
2564 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2565 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2566 data->temp_tolerance[0][nr]; in pwm_update_registers()
2567 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2575 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_enable() local
2578 return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]); in show_pwm_enable()
2585 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_enable() local
2599 if (val == sf3 && data->kind != nct6775) in store_pwm_enable()
2602 if (val == sf4 && check_trip_points(data, nr)) { in store_pwm_enable()
2608 mutex_lock(&data->update_lock); in store_pwm_enable()
2609 data->pwm_enable[nr] = val; in store_pwm_enable()
2614 data->pwm[0][nr] = 255; in store_pwm_enable()
2615 nct6775_write_value(data, data->REG_PWM[0][nr], 255); in store_pwm_enable()
2617 pwm_update_registers(data, nr); in store_pwm_enable()
2618 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in store_pwm_enable()
2621 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in store_pwm_enable()
2622 mutex_unlock(&data->update_lock); in store_pwm_enable()
2627 show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src) in show_pwm_temp_sel_common() argument
2632 if (!(data->have_temp & BIT(i))) in show_pwm_temp_sel_common()
2634 if (src == data->temp_src[i]) { in show_pwm_temp_sel_common()
2646 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_temp_sel() local
2650 return show_pwm_temp_sel_common(data, buf, data->pwm_temp_sel[index]); in show_pwm_temp_sel()
2657 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_temp_sel() local
2668 if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1]) in store_pwm_temp_sel()
2671 mutex_lock(&data->update_lock); in store_pwm_temp_sel()
2672 src = data->temp_src[val - 1]; in store_pwm_temp_sel()
2673 data->pwm_temp_sel[nr] = src; in store_pwm_temp_sel()
2674 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm_temp_sel()
2677 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm_temp_sel()
2678 mutex_unlock(&data->update_lock); in store_pwm_temp_sel()
2687 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_weight_temp_sel() local
2691 return show_pwm_temp_sel_common(data, buf, in show_pwm_weight_temp_sel()
2692 data->pwm_weight_temp_sel[index]); in show_pwm_weight_temp_sel()
2699 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_weight_temp_sel() local
2711 if (val && (!(data->have_temp & BIT(val - 1)) || in store_pwm_weight_temp_sel()
2712 !data->temp_src[val - 1])) in store_pwm_weight_temp_sel()
2715 mutex_lock(&data->update_lock); in store_pwm_weight_temp_sel()
2717 src = data->temp_src[val - 1]; in store_pwm_weight_temp_sel()
2718 data->pwm_weight_temp_sel[nr] = src; in store_pwm_weight_temp_sel()
2719 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2722 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2724 data->pwm_weight_temp_sel[nr] = 0; in store_pwm_weight_temp_sel()
2725 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2727 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2729 mutex_unlock(&data->update_lock); in store_pwm_weight_temp_sel()
2737 struct nct6775_data *data = nct6775_update_device(dev); in show_target_temp() local
2740 return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000); in show_target_temp()
2747 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_temp() local
2758 data->target_temp_mask); in store_target_temp()
2760 mutex_lock(&data->update_lock); in store_target_temp()
2761 data->target_temp[nr] = val; in store_target_temp()
2762 pwm_update_registers(data, nr); in store_target_temp()
2763 mutex_unlock(&data->update_lock); in store_target_temp()
2770 struct nct6775_data *data = nct6775_update_device(dev); in show_target_speed() local
2775 fan_from_reg16(data->target_speed[nr], in show_target_speed()
2776 data->fan_div[nr])); in show_target_speed()
2783 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_speed() local
2795 speed = fan_to_reg(val, data->fan_div[nr]); in store_target_speed()
2797 mutex_lock(&data->update_lock); in store_target_speed()
2798 data->target_speed[nr] = speed; in store_target_speed()
2799 pwm_update_registers(data, nr); in store_target_speed()
2800 mutex_unlock(&data->update_lock); in store_target_speed()
2808 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_tolerance() local
2813 return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000); in show_temp_tolerance()
2820 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_tolerance() local
2832 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask); in store_temp_tolerance()
2834 mutex_lock(&data->update_lock); in store_temp_tolerance()
2835 data->temp_tolerance[index][nr] = val; in store_temp_tolerance()
2837 pwm_update_registers(data, nr); in store_temp_tolerance()
2839 nct6775_write_value(data, in store_temp_tolerance()
2840 data->REG_CRITICAL_TEMP_TOLERANCE[nr], in store_temp_tolerance()
2842 mutex_unlock(&data->update_lock); in store_temp_tolerance()
2855 struct nct6775_data *data = nct6775_update_device(dev); in show_speed_tolerance() local
2858 int low = data->target_speed[nr] - data->target_speed_tolerance[nr]; in show_speed_tolerance()
2859 int high = data->target_speed[nr] + data->target_speed_tolerance[nr]; in show_speed_tolerance()
2869 tolerance = (fan_from_reg16(low, data->fan_div[nr]) in show_speed_tolerance()
2870 - fan_from_reg16(high, data->fan_div[nr])) / 2; in show_speed_tolerance()
2879 struct nct6775_data *data = dev_get_drvdata(dev); in store_speed_tolerance() local
2890 high = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
2891 data->fan_div[nr]) + val; in store_speed_tolerance()
2892 low = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
2893 data->fan_div[nr]) - val; in store_speed_tolerance()
2899 val = (fan_to_reg(low, data->fan_div[nr]) - in store_speed_tolerance()
2900 fan_to_reg(high, data->fan_div[nr])) / 2; in store_speed_tolerance()
2903 val = clamp_val(val, 0, data->speed_tolerance_limit); in store_speed_tolerance()
2905 mutex_lock(&data->update_lock); in store_speed_tolerance()
2906 data->target_speed_tolerance[nr] = val; in store_speed_tolerance()
2907 pwm_update_registers(data, nr); in store_speed_tolerance()
2908 mutex_unlock(&data->update_lock); in store_speed_tolerance()
2931 struct nct6775_data *data = nct6775_update_device(dev); in show_weight_temp() local
2936 return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000); in show_weight_temp()
2943 struct nct6775_data *data = dev_get_drvdata(dev); in store_weight_temp() local
2956 mutex_lock(&data->update_lock); in store_weight_temp()
2957 data->weight_temp[index][nr] = val; in store_weight_temp()
2958 nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); in store_weight_temp()
2959 mutex_unlock(&data->update_lock); in store_weight_temp()
2979 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_time() local
2985 step_time_from_reg(data->fan_time[index][nr], in show_fan_time()
2986 data->pwm_mode[nr])); in show_fan_time()
2993 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_time() local
3004 val = step_time_to_reg(val, data->pwm_mode[nr]); in store_fan_time()
3005 mutex_lock(&data->update_lock); in store_fan_time()
3006 data->fan_time[index][nr] = val; in store_fan_time()
3007 nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val); in store_fan_time()
3008 mutex_unlock(&data->update_lock); in store_fan_time()
3015 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_pwm() local
3018 return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]); in show_auto_pwm()
3025 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_pwm() local
3039 if (point == data->auto_pwm_num) { in store_auto_pwm()
3040 if (data->kind != nct6775 && !val) in store_auto_pwm()
3042 if (data->kind != nct6779 && val) in store_auto_pwm()
3046 mutex_lock(&data->update_lock); in store_auto_pwm()
3047 data->auto_pwm[nr][point] = val; in store_auto_pwm()
3048 if (point < data->auto_pwm_num) { in store_auto_pwm()
3049 nct6775_write_value(data, in store_auto_pwm()
3050 NCT6775_AUTO_PWM(data, nr, point), in store_auto_pwm()
3051 data->auto_pwm[nr][point]); in store_auto_pwm()
3053 switch (data->kind) { in store_auto_pwm()
3056 reg = nct6775_read_value(data, in store_auto_pwm()
3062 nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], in store_auto_pwm()
3074 nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], in store_auto_pwm()
3076 reg = nct6775_read_value(data, in store_auto_pwm()
3077 data->REG_CRITICAL_PWM_ENABLE[nr]); in store_auto_pwm()
3079 reg &= ~data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
3081 reg |= data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
3082 nct6775_write_value(data, in store_auto_pwm()
3083 data->REG_CRITICAL_PWM_ENABLE[nr], in store_auto_pwm()
3088 mutex_unlock(&data->update_lock); in store_auto_pwm()
3095 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_temp() local
3104 return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000); in show_auto_temp()
3111 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_temp() local
3124 mutex_lock(&data->update_lock); in store_auto_temp()
3125 data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000); in store_auto_temp()
3126 if (point < data->auto_pwm_num) { in store_auto_temp()
3127 nct6775_write_value(data, in store_auto_temp()
3128 NCT6775_AUTO_TEMP(data, nr, point), in store_auto_temp()
3129 data->auto_temp[nr][point]); in store_auto_temp()
3131 nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr], in store_auto_temp()
3132 data->auto_temp[nr][point]); in store_auto_temp()
3134 mutex_unlock(&data->update_lock); in store_auto_temp()
3142 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_pwm_is_visible() local
3146 if (!(data->has_pwm & BIT(pwm))) in nct6775_pwm_is_visible()
3150 if (!data->REG_WEIGHT_TEMP_SEL[pwm]) in nct6775_pwm_is_visible()
3152 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */ in nct6775_pwm_is_visible()
3154 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */ in nct6775_pwm_is_visible()
3156 if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */ in nct6775_pwm_is_visible()
3162 if (api > data->auto_pwm_num) in nct6775_pwm_is_visible()
3280 struct nct6775_data *data = dev_get_drvdata(dev); in cpu0_vid_show() local
3282 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in cpu0_vid_show()
3293 struct nct6775_data *data = dev_get_drvdata(dev); in clear_caseopen() local
3302 mutex_lock(&data->update_lock); in clear_caseopen()
3309 ret = superio_enter(data->sioreg); in clear_caseopen()
3315 superio_select(data->sioreg, NCT6775_LD_ACPI); in clear_caseopen()
3316 reg = superio_inb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]); in clear_caseopen()
3318 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3320 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3321 superio_exit(data->sioreg); in clear_caseopen()
3323 data->valid = false; /* Force cache refresh */ in clear_caseopen()
3325 mutex_unlock(&data->update_lock); in clear_caseopen()
3344 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_other_is_visible() local
3346 if (index == 0 && !data->have_vid) in nct6775_other_is_visible()
3350 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + index - 1] < 0) in nct6775_other_is_visible()
3355 if (data->BEEP_BITS[INTRUSION_ALARM_BASE + index - 3] < 0) in nct6775_other_is_visible()
3383 static inline void nct6775_init_device(struct nct6775_data *data) in nct6775_init_device() argument
3389 if (data->REG_CONFIG) { in nct6775_init_device()
3390 tmp = nct6775_read_value(data, data->REG_CONFIG); in nct6775_init_device()
3392 nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01); in nct6775_init_device()
3397 if (!(data->have_temp & BIT(i))) in nct6775_init_device()
3399 if (!data->reg_temp_config[i]) in nct6775_init_device()
3401 tmp = nct6775_read_value(data, data->reg_temp_config[i]); in nct6775_init_device()
3403 nct6775_write_value(data, data->reg_temp_config[i], in nct6775_init_device()
3408 tmp = nct6775_read_value(data, data->REG_VBAT); in nct6775_init_device()
3410 nct6775_write_value(data, data->REG_VBAT, tmp | 0x01); in nct6775_init_device()
3412 diode = nct6775_read_value(data, data->REG_DIODE); in nct6775_init_device()
3414 for (i = 0; i < data->temp_fixed_num; i++) { in nct6775_init_device()
3415 if (!(data->have_temp_fixed & BIT(i))) in nct6775_init_device()
3417 if ((tmp & (data->DIODE_MASK << i))) /* diode */ in nct6775_init_device()
3418 data->temp_type[i] in nct6775_init_device()
3419 = 3 - ((diode >> i) & data->DIODE_MASK); in nct6775_init_device()
3421 data->temp_type[i] = 4; in nct6775_init_device()
3426 nct6775_check_fan_inputs(struct nct6775_data *data) in nct6775_check_fan_inputs() argument
3432 int sioreg = data->sioreg; in nct6775_check_fan_inputs()
3437 data->sio_reg_enable = superio_inb(sioreg, SIO_REG_ENABLE); in nct6775_check_fan_inputs()
3440 if (data->kind == nct6775) { in nct6775_check_fan_inputs()
3448 } else if (data->kind == nct6776) { in nct6775_check_fan_inputs()
3463 if ((data->sio_reg_enable & 0xe0) != 0xe0) { in nct6775_check_fan_inputs()
3464 data->sio_reg_enable |= 0xe0; in nct6775_check_fan_inputs()
3466 data->sio_reg_enable); in nct6775_check_fan_inputs()
3471 if (data->sio_reg_enable & 0x80) in nct6775_check_fan_inputs()
3476 if (data->sio_reg_enable & 0x40) in nct6775_check_fan_inputs()
3481 if (data->sio_reg_enable & 0x20) in nct6775_check_fan_inputs()
3488 } else if (data->kind == nct6106) { in nct6775_check_fan_inputs()
3508 switch (data->kind) { in nct6775_check_fan_inputs()
3529 if (data->kind != nct6796) { in nct6775_check_fan_inputs()
3548 if (data->kind == nct6795 || data->kind == nct6796) { in nct6775_check_fan_inputs()
3560 if (data->kind == nct6796) { in nct6775_check_fan_inputs()
3577 data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) | in nct6775_check_fan_inputs()
3579 data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) | in nct6775_check_fan_inputs()
3581 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | in nct6775_check_fan_inputs()
3585 static void add_temp_sensors(struct nct6775_data *data, const u16 *regp, in add_temp_sensors() argument
3591 for (i = 0; i < data->pwm_num && *available; i++) { in add_temp_sensors()
3596 src = nct6775_read_value(data, regp[i]); in add_temp_sensors()
3600 if (!(data->temp_mask & BIT(src))) in add_temp_sensors()
3604 nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src); in add_temp_sensors()
3614 struct nct6775_data *data; in nct6775_probe() local
3632 data = devm_kzalloc(&pdev->dev, sizeof(struct nct6775_data), in nct6775_probe()
3634 if (!data) in nct6775_probe()
3637 data->kind = sio_data->kind; in nct6775_probe()
3638 data->sioreg = sio_data->sioreg; in nct6775_probe()
3639 data->addr = res->start; in nct6775_probe()
3640 mutex_init(&data->update_lock); in nct6775_probe()
3641 data->name = nct6775_device_names[data->kind]; in nct6775_probe()
3642 data->bank = 0xff; /* Force initial bank selection */ in nct6775_probe()
3643 platform_set_drvdata(pdev, data); in nct6775_probe()
3645 switch (data->kind) { in nct6775_probe()
3647 data->in_num = 9; in nct6775_probe()
3648 data->pwm_num = 3; in nct6775_probe()
3649 data->auto_pwm_num = 4; in nct6775_probe()
3650 data->temp_fixed_num = 3; in nct6775_probe()
3651 data->num_temp_alarms = 6; in nct6775_probe()
3652 data->num_temp_beeps = 6; in nct6775_probe()
3654 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3655 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3657 data->temp_label = nct6776_temp_label; in nct6775_probe()
3658 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3659 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3661 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3662 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3663 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3664 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3665 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3666 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3667 data->REG_TARGET = NCT6106_REG_TARGET; in nct6775_probe()
3668 data->REG_FAN = NCT6106_REG_FAN; in nct6775_probe()
3669 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE; in nct6775_probe()
3670 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN; in nct6775_probe()
3671 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES; in nct6775_probe()
3672 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT; in nct6775_probe()
3673 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME; in nct6775_probe()
3674 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3675 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3676 data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H; in nct6775_probe()
3677 data->REG_PWM[0] = NCT6106_REG_PWM; in nct6775_probe()
3678 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; in nct6775_probe()
3679 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3680 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3681 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3682 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3683 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3684 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3685 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP; in nct6775_probe()
3686 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM; in nct6775_probe()
3687 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP; in nct6775_probe()
3688 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3690 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3691 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3693 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM; in nct6775_probe()
3694 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3695 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE; in nct6775_probe()
3696 data->REG_TEMP_SEL = NCT6106_REG_TEMP_SEL; in nct6775_probe()
3697 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3698 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3699 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3700 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3701 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3702 data->ALARM_BITS = NCT6106_ALARM_BITS; in nct6775_probe()
3703 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3704 data->BEEP_BITS = NCT6106_BEEP_BITS; in nct6775_probe()
3720 data->in_num = 9; in nct6775_probe()
3721 data->pwm_num = 3; in nct6775_probe()
3722 data->auto_pwm_num = 6; in nct6775_probe()
3723 data->has_fan_div = true; in nct6775_probe()
3724 data->temp_fixed_num = 3; in nct6775_probe()
3725 data->num_temp_alarms = 3; in nct6775_probe()
3726 data->num_temp_beeps = 3; in nct6775_probe()
3728 data->ALARM_BITS = NCT6775_ALARM_BITS; in nct6775_probe()
3729 data->BEEP_BITS = NCT6775_BEEP_BITS; in nct6775_probe()
3731 data->fan_from_reg = fan_from_reg16; in nct6775_probe()
3732 data->fan_from_reg_min = fan_from_reg8; in nct6775_probe()
3733 data->target_temp_mask = 0x7f; in nct6775_probe()
3734 data->tolerance_mask = 0x0f; in nct6775_probe()
3735 data->speed_tolerance_limit = 15; in nct6775_probe()
3737 data->temp_label = nct6775_temp_label; in nct6775_probe()
3738 data->temp_mask = NCT6775_TEMP_MASK; in nct6775_probe()
3739 data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK; in nct6775_probe()
3741 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3742 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3743 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3744 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3745 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3746 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3747 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3748 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3749 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3750 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3751 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN; in nct6775_probe()
3752 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES; in nct6775_probe()
3753 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3754 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3755 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3756 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3757 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3758 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3759 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3760 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT; in nct6775_probe()
3761 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT; in nct6775_probe()
3762 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3763 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3764 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE; in nct6775_probe()
3765 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK; in nct6775_probe()
3766 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3767 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3768 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3769 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3771 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3772 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3773 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3774 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3775 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3776 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3777 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3778 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3779 data->REG_BEEP = NCT6775_REG_BEEP; in nct6775_probe()
3793 data->in_num = 9; in nct6775_probe()
3794 data->pwm_num = 3; in nct6775_probe()
3795 data->auto_pwm_num = 4; in nct6775_probe()
3796 data->has_fan_div = false; in nct6775_probe()
3797 data->temp_fixed_num = 3; in nct6775_probe()
3798 data->num_temp_alarms = 3; in nct6775_probe()
3799 data->num_temp_beeps = 6; in nct6775_probe()
3801 data->ALARM_BITS = NCT6776_ALARM_BITS; in nct6775_probe()
3802 data->BEEP_BITS = NCT6776_BEEP_BITS; in nct6775_probe()
3804 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3805 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3806 data->target_temp_mask = 0xff; in nct6775_probe()
3807 data->tolerance_mask = 0x07; in nct6775_probe()
3808 data->speed_tolerance_limit = 63; in nct6775_probe()
3810 data->temp_label = nct6776_temp_label; in nct6775_probe()
3811 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3812 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3814 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3815 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3816 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3817 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3818 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3819 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3820 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3821 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3822 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3823 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3824 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3825 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; in nct6775_probe()
3826 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3827 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3828 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3829 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3830 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3831 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3832 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3833 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3834 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3835 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3836 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3837 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3838 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3839 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3840 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3841 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3842 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3844 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3845 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3846 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3847 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3848 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3849 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3850 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3851 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3852 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3866 data->in_num = 15; in nct6775_probe()
3867 data->pwm_num = 5; in nct6775_probe()
3868 data->auto_pwm_num = 4; in nct6775_probe()
3869 data->has_fan_div = false; in nct6775_probe()
3870 data->temp_fixed_num = 6; in nct6775_probe()
3871 data->num_temp_alarms = 2; in nct6775_probe()
3872 data->num_temp_beeps = 2; in nct6775_probe()
3874 data->ALARM_BITS = NCT6779_ALARM_BITS; in nct6775_probe()
3875 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3877 data->fan_from_reg = fan_from_reg_rpm; in nct6775_probe()
3878 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3879 data->target_temp_mask = 0xff; in nct6775_probe()
3880 data->tolerance_mask = 0x07; in nct6775_probe()
3881 data->speed_tolerance_limit = 63; in nct6775_probe()
3883 data->temp_label = nct6779_temp_label; in nct6775_probe()
3884 data->temp_mask = NCT6779_TEMP_MASK; in nct6775_probe()
3885 data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK; in nct6775_probe()
3887 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3888 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3889 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3890 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3891 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3892 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3893 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3894 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3895 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3896 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3897 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3898 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3899 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3900 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3901 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3902 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3903 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3904 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3905 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3906 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3907 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3908 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3909 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3910 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3911 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3912 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3913 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3914 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3915 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3917 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3918 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3920 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3921 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3922 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3923 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3924 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3925 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3926 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3927 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3928 data->REG_ALARM = NCT6779_REG_ALARM; in nct6775_probe()
3929 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3947 data->in_num = 15; in nct6775_probe()
3948 data->pwm_num = (data->kind == nct6796) ? 7 : 6; in nct6775_probe()
3949 data->auto_pwm_num = 4; in nct6775_probe()
3950 data->has_fan_div = false; in nct6775_probe()
3951 data->temp_fixed_num = 6; in nct6775_probe()
3952 data->num_temp_alarms = 2; in nct6775_probe()
3953 data->num_temp_beeps = 2; in nct6775_probe()
3955 data->ALARM_BITS = NCT6791_ALARM_BITS; in nct6775_probe()
3956 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3958 data->fan_from_reg = fan_from_reg_rpm; in nct6775_probe()
3959 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3960 data->target_temp_mask = 0xff; in nct6775_probe()
3961 data->tolerance_mask = 0x07; in nct6775_probe()
3962 data->speed_tolerance_limit = 63; in nct6775_probe()
3964 switch (data->kind) { in nct6775_probe()
3967 data->temp_label = nct6779_temp_label; in nct6775_probe()
3968 data->temp_mask = NCT6791_TEMP_MASK; in nct6775_probe()
3969 data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK; in nct6775_probe()
3972 data->temp_label = nct6792_temp_label; in nct6775_probe()
3973 data->temp_mask = NCT6792_TEMP_MASK; in nct6775_probe()
3974 data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK; in nct6775_probe()
3977 data->temp_label = nct6793_temp_label; in nct6775_probe()
3978 data->temp_mask = NCT6793_TEMP_MASK; in nct6775_probe()
3979 data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK; in nct6775_probe()
3982 data->temp_label = nct6795_temp_label; in nct6775_probe()
3983 data->temp_mask = NCT6795_TEMP_MASK; in nct6775_probe()
3984 data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK; in nct6775_probe()
3987 data->temp_label = nct6796_temp_label; in nct6775_probe()
3988 data->temp_mask = NCT6796_TEMP_MASK; in nct6775_probe()
3989 data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK; in nct6775_probe()
3993 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3994 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3995 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3996 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3997 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3998 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3999 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
4000 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
4001 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
4002 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
4003 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
4004 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
4005 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
4006 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
4007 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
4008 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
4009 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
4010 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
4011 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
4012 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
4013 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
4014 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
4015 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
4016 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
4017 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
4018 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
4019 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
4020 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
4021 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
4023 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
4024 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
4026 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
4027 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
4028 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
4029 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
4030 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
4031 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
4032 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
4033 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
4034 data->REG_ALARM = NCT6791_REG_ALARM; in nct6775_probe()
4035 if (data->kind == nct6791) in nct6775_probe()
4036 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
4038 data->REG_BEEP = NCT6792_REG_BEEP; in nct6775_probe()
4042 if (data->kind == nct6791) { in nct6775_probe()
4059 data->have_in = BIT(data->in_num) - 1; in nct6775_probe()
4060 data->have_temp = 0; in nct6775_probe()
4076 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
4087 add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask); in nct6775_probe()
4088 add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask); in nct6775_probe()
4096 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
4100 if (!(data->temp_mask & BIT(src))) { in nct6775_probe()
4103 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]); in nct6775_probe()
4110 if (src <= data->temp_fixed_num) { in nct6775_probe()
4111 data->have_temp |= BIT(src - 1); in nct6775_probe()
4112 data->have_temp_fixed |= BIT(src - 1); in nct6775_probe()
4113 data->reg_temp[0][src - 1] = reg_temp[i]; in nct6775_probe()
4114 data->reg_temp[1][src - 1] = reg_temp_over[i]; in nct6775_probe()
4115 data->reg_temp[2][src - 1] = reg_temp_hyst[i]; in nct6775_probe()
4117 data->reg_temp[3][src - 1] = reg_temp_crit_h[i]; in nct6775_probe()
4119 data->reg_temp[3][src - 1] in nct6775_probe()
4122 data->reg_temp[4][src - 1] = reg_temp_crit_l[i]; in nct6775_probe()
4123 data->reg_temp_config[src - 1] = reg_temp_config[i]; in nct6775_probe()
4124 data->temp_src[src - 1] = src; in nct6775_probe()
4132 data->have_temp |= BIT(s); in nct6775_probe()
4133 data->reg_temp[0][s] = reg_temp[i]; in nct6775_probe()
4134 data->reg_temp[1][s] = reg_temp_over[i]; in nct6775_probe()
4135 data->reg_temp[2][s] = reg_temp_hyst[i]; in nct6775_probe()
4136 data->reg_temp_config[s] = reg_temp_config[i]; in nct6775_probe()
4138 data->reg_temp[3][s] = reg_temp_crit_h[i]; in nct6775_probe()
4140 data->reg_temp[3][s] = reg_temp_crit[src - 1]; in nct6775_probe()
4142 data->reg_temp[4][s] = reg_temp_crit_l[i]; in nct6775_probe()
4144 data->temp_src[s] = src; in nct6775_probe()
4156 src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; in nct6775_probe()
4160 if (!(data->temp_mask & BIT(src))) { in nct6775_probe()
4163 src, i, data->REG_TEMP_SEL[i], in nct6775_probe()
4173 if (!(data->virt_temp_mask & BIT(src))) { in nct6775_probe()
4180 if (src <= data->temp_fixed_num) { in nct6775_probe()
4181 if (data->have_temp & BIT(src - 1)) in nct6775_probe()
4183 data->have_temp |= BIT(src - 1); in nct6775_probe()
4184 data->have_temp_fixed |= BIT(src - 1); in nct6775_probe()
4185 data->reg_temp[0][src - 1] = reg_temp_mon[i]; in nct6775_probe()
4186 data->temp_src[src - 1] = src; in nct6775_probe()
4194 data->have_temp |= BIT(s); in nct6775_probe()
4195 data->reg_temp[0][s] = reg_temp_mon[i]; in nct6775_probe()
4196 data->temp_src[s] = src; in nct6775_probe()
4208 if (!(data->temp_mask & BIT(i + 1))) in nct6775_probe()
4214 if (i < data->temp_fixed_num) { in nct6775_probe()
4215 if (data->have_temp & BIT(i)) in nct6775_probe()
4217 data->have_temp |= BIT(i); in nct6775_probe()
4218 data->have_temp_fixed |= BIT(i); in nct6775_probe()
4219 data->reg_temp[0][i] = reg_temp_alternate[i]; in nct6775_probe()
4221 data->reg_temp[1][i] = reg_temp_over[i]; in nct6775_probe()
4222 data->reg_temp[2][i] = reg_temp_hyst[i]; in nct6775_probe()
4224 data->temp_src[i] = i + 1; in nct6775_probe()
4231 data->have_temp |= BIT(s); in nct6775_probe()
4232 data->reg_temp[0][s] = reg_temp_alternate[i]; in nct6775_probe()
4233 data->temp_src[s] = i + 1; in nct6775_probe()
4239 nct6775_init_device(data); in nct6775_probe()
4246 switch (data->kind) { in nct6775_probe()
4248 data->have_vid = (cr2a & 0x40); in nct6775_probe()
4251 data->have_vid = (cr2a & 0x60) == 0x40; in nct6775_probe()
4267 if (data->have_vid) { in nct6775_probe()
4269 data->vid = superio_inb(sio_data->sioreg, 0xe3); in nct6775_probe()
4270 data->vrm = vid_which_vrm(); in nct6775_probe()
4279 switch (data->kind) { in nct6775_probe()
4301 data->name); in nct6775_probe()
4304 nct6775_check_fan_inputs(data); in nct6775_probe()
4309 nct6775_init_fan_common(dev, data); in nct6775_probe()
4313 data->pwm_num); in nct6775_probe()
4317 data->groups[num_attr_groups++] = group; in nct6775_probe()
4320 fls(data->have_in)); in nct6775_probe()
4324 data->groups[num_attr_groups++] = group; in nct6775_probe()
4327 fls(data->has_fan)); in nct6775_probe()
4331 data->groups[num_attr_groups++] = group; in nct6775_probe()
4334 fls(data->have_temp)); in nct6775_probe()
4338 data->groups[num_attr_groups++] = group; in nct6775_probe()
4339 data->groups[num_attr_groups++] = &nct6775_group_other; in nct6775_probe()
4341 hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name, in nct6775_probe()
4342 data, data->groups); in nct6775_probe()
4360 struct nct6775_data *data = nct6775_update_device(dev); in nct6775_suspend() local
4362 mutex_lock(&data->update_lock); in nct6775_suspend()
4363 data->vbat = nct6775_read_value(data, data->REG_VBAT); in nct6775_suspend()
4364 if (data->kind == nct6775) { in nct6775_suspend()
4365 data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_suspend()
4366 data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_suspend()
4368 mutex_unlock(&data->update_lock); in nct6775_suspend()
4375 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_resume() local
4376 int sioreg = data->sioreg; in nct6775_resume()
4380 mutex_lock(&data->update_lock); in nct6775_resume()
4381 data->bank = 0xff; /* Force initial bank selection */ in nct6775_resume()
4389 if (reg != data->sio_reg_enable) in nct6775_resume()
4390 superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable); in nct6775_resume()
4392 if (data->kind == nct6791 || data->kind == nct6792 || in nct6775_resume()
4393 data->kind == nct6793 || data->kind == nct6795 || in nct6775_resume()
4394 data->kind == nct6796) in nct6775_resume()
4400 for (i = 0; i < data->in_num; i++) { in nct6775_resume()
4401 if (!(data->have_in & BIT(i))) in nct6775_resume()
4404 nct6775_write_value(data, data->REG_IN_MINMAX[0][i], in nct6775_resume()
4405 data->in[i][1]); in nct6775_resume()
4406 nct6775_write_value(data, data->REG_IN_MINMAX[1][i], in nct6775_resume()
4407 data->in[i][2]); in nct6775_resume()
4410 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_resume()
4411 if (!(data->has_fan_min & BIT(i))) in nct6775_resume()
4414 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_resume()
4415 data->fan_min[i]); in nct6775_resume()
4419 if (!(data->have_temp & BIT(i))) in nct6775_resume()
4422 for (j = 1; j < ARRAY_SIZE(data->reg_temp); j++) in nct6775_resume()
4423 if (data->reg_temp[j][i]) in nct6775_resume()
4424 nct6775_write_temp(data, data->reg_temp[j][i], in nct6775_resume()
4425 data->temp[j][i]); in nct6775_resume()
4429 nct6775_write_value(data, data->REG_VBAT, data->vbat); in nct6775_resume()
4430 if (data->kind == nct6775) { in nct6775_resume()
4431 nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); in nct6775_resume()
4432 nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); in nct6775_resume()
4437 data->valid = false; in nct6775_resume()
4438 mutex_unlock(&data->update_lock); in nct6775_resume()