• Home
  • Raw
  • Download

Lines Matching full:data

65 /* 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 */
798 /* NCT6102D/NCT6106D specific data */
901 /* NCT6112D/NCT6114D/NCT6116D specific data */
1066 * Data structures and manipulation thereof
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()
1416 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg) in nct6775_set_bank() argument
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()
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()
1451 data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1453 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
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
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
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()
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()
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
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()
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()
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
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()
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()
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()
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
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
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()
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()
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
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()
2091 struct nct6775_data *data = nct6775_update_device(dev); in show_fan() local
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
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
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
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()
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()
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()
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
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()
2313 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_label() local
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
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
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
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
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
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()
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
2550 if (data->REG_PWM_MODE[nr] == 0) { 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
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
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()
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()
2616 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm()
2618 mutex_unlock(&data->update_lock); in store_pwm()
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()
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()
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()
2646 static void pwm_update_registers(struct nct6775_data *data, int nr) in pwm_update_registers() argument
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()
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
2709 if (val == sf3 && data->kind != nct6775) in store_pwm_enable()
2712 if (val == sf4 && check_trip_points(data, nr)) { 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()
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
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
2778 if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1]) 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()
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
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
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()
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()
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()
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
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
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
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
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
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
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
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
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
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
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
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
3155 if (point == data->auto_pwm_num) { in store_auto_pwm()
3156 if (data->kind != nct6775 && !val) 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()
3178 nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], 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()
3207 mutex_unlock(&data->update_lock); in store_auto_pwm()
3214 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_temp() local
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
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()
3281 if (api > data->auto_pwm_num) 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
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()
3437 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 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()
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()
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()
3795 struct nct6775_data *data; in nct6775_probe() local
3813 data = devm_kzalloc(&pdev->dev, sizeof(struct nct6775_data), in nct6775_probe()
3815 if (!data) 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()
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()
4383 data->reg_temp[3][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()
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()
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()
4536 data->vid = superio_inb(sio_data->sioreg, 0xe3); in nct6775_probe()
4537 data->vrm = vid_which_vrm(); in nct6775_probe()
4546 switch (data->kind) { in nct6775_probe()
4571 data->name); in nct6775_probe()
4574 nct6775_check_fan_inputs(data); 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()
4650 mutex_lock(&data->update_lock); in nct6775_resume()
4651 data->bank = 0xff; /* Force initial bank selection */ 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()
4708 data->valid = false; in nct6775_resume()
4709 mutex_unlock(&data->update_lock); in nct6775_resume()