Lines Matching full:data
62 /* used to set data->name = nct6775_device_names[data->sio_kind] */
78 /* Common and NCT6775 specific data */
194 #define NCT6775_AUTO_TEMP(data, nr, p) ((data)->REG_AUTO_TEMP[nr] + (p)) argument
195 #define NCT6775_AUTO_PWM(data, nr, p) ((data)->REG_AUTO_PWM[nr] + (p)) argument
250 /* NCT6776 specific data */
336 /* NCT6779 specific data */
437 /* NCT6791 specific data */
458 /* NCT6792/NCT6793 specific data */
657 /* NCT6102D/NCT6106D specific data */
762 /* NCT6112D/NCT6114D/NCT6116D specific data */
935 * Data structures and manipulation thereof
993 static int nct6775_add_template_attr_group(struct device *dev, struct nct6775_data *data, in nct6775_add_template_attr_group() argument
1064 return nct6775_add_attr_group(data, group); in nct6775_add_template_attr_group()
1067 bool nct6775_reg_is_word_sized(struct nct6775_data *data, u16 reg) in nct6775_reg_is_word_sized() argument
1069 switch (data->kind) { in nct6775_reg_is_word_sized()
1127 static int nct6775_read_temp(struct nct6775_data *data, u16 reg, u16 *val) in nct6775_read_temp() argument
1131 err = nct6775_read_value(data, reg, val); in nct6775_read_temp()
1135 if (!nct6775_reg_is_word_sized(data, reg)) in nct6775_read_temp()
1141 /* This function assumes that the caller holds data->update_lock */
1142 static int nct6775_write_fan_div(struct nct6775_data *data, int nr) in nct6775_write_fan_div() argument
1149 err = nct6775_read_value(data, fandiv_reg, ®); in nct6775_write_fan_div()
1153 reg |= data->fan_div[nr] & (0x7 << oddshift); in nct6775_write_fan_div()
1154 return nct6775_write_value(data, fandiv_reg, reg); in nct6775_write_fan_div()
1157 static int nct6775_write_fan_div_common(struct nct6775_data *data, int nr) in nct6775_write_fan_div_common() argument
1159 if (data->kind == nct6775) in nct6775_write_fan_div_common()
1160 return nct6775_write_fan_div(data, nr); in nct6775_write_fan_div_common()
1164 static int nct6775_update_fan_div(struct nct6775_data *data) in nct6775_update_fan_div() argument
1169 err = nct6775_read_value(data, NCT6775_REG_FANDIV1, &i); in nct6775_update_fan_div()
1172 data->fan_div[0] = i & 0x7; in nct6775_update_fan_div()
1173 data->fan_div[1] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1174 err = nct6775_read_value(data, NCT6775_REG_FANDIV2, &i); in nct6775_update_fan_div()
1177 data->fan_div[2] = i & 0x7; in nct6775_update_fan_div()
1178 if (data->has_fan & BIT(3)) in nct6775_update_fan_div()
1179 data->fan_div[3] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1184 static int nct6775_update_fan_div_common(struct nct6775_data *data) in nct6775_update_fan_div_common() argument
1186 if (data->kind == nct6775) in nct6775_update_fan_div_common()
1187 return nct6775_update_fan_div(data); in nct6775_update_fan_div_common()
1191 static int nct6775_init_fan_div(struct nct6775_data *data) in nct6775_init_fan_div() argument
1195 err = nct6775_update_fan_div_common(data); in nct6775_init_fan_div()
1205 for (i = 0; i < ARRAY_SIZE(data->fan_div); i++) { in nct6775_init_fan_div()
1206 if (!(data->has_fan & BIT(i))) in nct6775_init_fan_div()
1208 if (data->fan_div[i] == 0) { in nct6775_init_fan_div()
1209 data->fan_div[i] = 7; in nct6775_init_fan_div()
1210 err = nct6775_write_fan_div_common(data, i); in nct6775_init_fan_div()
1220 struct nct6775_data *data) in nct6775_init_fan_common() argument
1225 if (data->has_fan_div) { in nct6775_init_fan_common()
1226 err = nct6775_init_fan_div(data); in nct6775_init_fan_common()
1235 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_init_fan_common()
1236 if (data->has_fan_min & BIT(i)) { in nct6775_init_fan_common()
1237 err = nct6775_read_value(data, data->REG_FAN_MIN[i], ®); in nct6775_init_fan_common()
1241 err = nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_init_fan_common()
1242 data->has_fan_div ? 0xff : 0xff1f); in nct6775_init_fan_common()
1253 struct nct6775_data *data, int nr, u16 reg) in nct6775_select_fan_div() argument
1256 u8 fan_div = data->fan_div[nr]; in nct6775_select_fan_div()
1259 if (!data->has_fan_div) in nct6775_select_fan_div()
1272 if (fan_div != data->fan_div[nr]) { in nct6775_select_fan_div()
1274 nr + 1, div_from_reg(data->fan_div[nr]), in nct6775_select_fan_div()
1278 if (data->has_fan_min & BIT(nr)) { in nct6775_select_fan_div()
1279 fan_min = data->fan_min[nr]; in nct6775_select_fan_div()
1280 if (fan_div > data->fan_div[nr]) { in nct6775_select_fan_div()
1290 if (fan_min != data->fan_min[nr]) { in nct6775_select_fan_div()
1291 data->fan_min[nr] = fan_min; in nct6775_select_fan_div()
1292 err = nct6775_write_value(data, data->REG_FAN_MIN[nr], fan_min); in nct6775_select_fan_div()
1297 data->fan_div[nr] = fan_div; in nct6775_select_fan_div()
1298 err = nct6775_write_fan_div_common(data, nr); in nct6775_select_fan_div()
1308 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm() local
1313 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm()
1314 if (!(data->has_pwm & BIT(i))) in nct6775_update_pwm()
1317 err = nct6775_read_value(data, data->REG_PWM_MODE[i], ®); in nct6775_update_pwm()
1320 duty_is_dc = data->REG_PWM_MODE[i] && (reg & data->PWM_MODE_MASK[i]); in nct6775_update_pwm()
1321 data->pwm_mode[i] = !duty_is_dc; in nct6775_update_pwm()
1323 err = nct6775_read_value(data, data->REG_FAN_MODE[i], &fanmodecfg); in nct6775_update_pwm()
1326 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) { in nct6775_update_pwm()
1327 if (data->REG_PWM[j] && data->REG_PWM[j][i]) { in nct6775_update_pwm()
1328 err = nct6775_read_value(data, data->REG_PWM[j][i], ®); in nct6775_update_pwm()
1331 data->pwm[j][i] = reg; in nct6775_update_pwm()
1335 data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i], in nct6775_update_pwm()
1338 if (!data->temp_tolerance[0][i] || in nct6775_update_pwm()
1339 data->pwm_enable[i] != speed_cruise) in nct6775_update_pwm()
1340 data->temp_tolerance[0][i] = fanmodecfg & 0x0f; in nct6775_update_pwm()
1341 if (!data->target_speed_tolerance[i] || in nct6775_update_pwm()
1342 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm()
1345 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm()
1346 err = nct6775_read_value(data, data->REG_TOLERANCE_H[i], ®); in nct6775_update_pwm()
1351 data->target_speed_tolerance[i] = t; in nct6775_update_pwm()
1354 err = nct6775_read_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[i], ®); in nct6775_update_pwm()
1357 data->temp_tolerance[1][i] = reg; in nct6775_update_pwm()
1359 err = nct6775_read_value(data, data->REG_TEMP_SEL[i], ®); in nct6775_update_pwm()
1362 data->pwm_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1365 data->pwm[2][i] = 0; in nct6775_update_pwm()
1367 if (!data->REG_WEIGHT_TEMP_SEL[i]) in nct6775_update_pwm()
1370 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i], ®); in nct6775_update_pwm()
1373 data->pwm_weight_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1376 data->pwm_weight_temp_sel[i] = 0; in nct6775_update_pwm()
1378 /* Weight temp data */ in nct6775_update_pwm()
1379 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) { in nct6775_update_pwm()
1380 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP[j][i], ®); in nct6775_update_pwm()
1383 data->weight_temp[j][i] = reg; in nct6775_update_pwm()
1392 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm_limits() local
1396 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm_limits()
1397 if (!(data->has_pwm & BIT(i))) in nct6775_update_pwm_limits()
1400 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) { in nct6775_update_pwm_limits()
1401 err = nct6775_read_value(data, data->REG_FAN_TIME[j][i], ®); in nct6775_update_pwm_limits()
1404 data->fan_time[j][i] = reg; in nct6775_update_pwm_limits()
1407 err = nct6775_read_value(data, data->REG_TARGET[i], ®_t); in nct6775_update_pwm_limits()
1412 if (!data->target_temp[i] || in nct6775_update_pwm_limits()
1413 data->pwm_enable[i] == thermal_cruise) in nct6775_update_pwm_limits()
1414 data->target_temp[i] = reg_t & data->target_temp_mask; in nct6775_update_pwm_limits()
1415 if (!data->target_speed[i] || in nct6775_update_pwm_limits()
1416 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm_limits()
1417 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm_limits()
1418 err = nct6775_read_value(data, data->REG_TOLERANCE_H[i], ®); in nct6775_update_pwm_limits()
1423 data->target_speed[i] = reg_t; in nct6775_update_pwm_limits()
1426 for (j = 0; j < data->auto_pwm_num; j++) { in nct6775_update_pwm_limits()
1427 err = nct6775_read_value(data, NCT6775_AUTO_PWM(data, i, j), ®); in nct6775_update_pwm_limits()
1430 data->auto_pwm[i][j] = reg; in nct6775_update_pwm_limits()
1432 err = nct6775_read_value(data, NCT6775_AUTO_TEMP(data, i, j), ®); in nct6775_update_pwm_limits()
1435 data->auto_temp[i][j] = reg; in nct6775_update_pwm_limits()
1438 /* critical auto_pwm temperature data */ in nct6775_update_pwm_limits()
1439 err = nct6775_read_value(data, data->REG_CRITICAL_TEMP[i], ®); in nct6775_update_pwm_limits()
1442 data->auto_temp[i][data->auto_pwm_num] = reg; in nct6775_update_pwm_limits()
1444 switch (data->kind) { in nct6775_update_pwm_limits()
1446 err = nct6775_read_value(data, NCT6775_REG_CRITICAL_ENAB[i], ®); in nct6775_update_pwm_limits()
1449 data->auto_pwm[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1453 data->auto_pwm[i][data->auto_pwm_num] = 0xff; in nct6775_update_pwm_limits()
1465 err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[i], ®); in nct6775_update_pwm_limits()
1468 if (reg & data->CRITICAL_PWM_ENABLE_MASK) { in nct6775_update_pwm_limits()
1469 err = nct6775_read_value(data, data->REG_CRITICAL_PWM[i], ®); in nct6775_update_pwm_limits()
1475 data->auto_pwm[i][data->auto_pwm_num] = reg; in nct6775_update_pwm_limits()
1485 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_device() local
1489 mutex_lock(&data->update_lock); in nct6775_update_device()
1491 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) in nct6775_update_device()
1492 || !data->valid) { in nct6775_update_device()
1494 err = nct6775_update_fan_div_common(data); in nct6775_update_device()
1499 for (i = 0; i < data->in_num; i++) { in nct6775_update_device()
1500 if (!(data->have_in & BIT(i))) in nct6775_update_device()
1503 err = nct6775_read_value(data, data->REG_VIN[i], ®); in nct6775_update_device()
1506 data->in[i][0] = reg; in nct6775_update_device()
1508 err = nct6775_read_value(data, data->REG_IN_MINMAX[0][i], ®); in nct6775_update_device()
1511 data->in[i][1] = reg; in nct6775_update_device()
1513 err = nct6775_read_value(data, data->REG_IN_MINMAX[1][i], ®); in nct6775_update_device()
1516 data->in[i][2] = reg; in nct6775_update_device()
1520 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) { in nct6775_update_device()
1521 if (!(data->has_fan & BIT(i))) in nct6775_update_device()
1524 err = nct6775_read_value(data, data->REG_FAN[i], ®); in nct6775_update_device()
1527 data->rpm[i] = data->fan_from_reg(reg, in nct6775_update_device()
1528 data->fan_div[i]); in nct6775_update_device()
1530 if (data->has_fan_min & BIT(i)) { in nct6775_update_device()
1531 err = nct6775_read_value(data, data->REG_FAN_MIN[i], ®); in nct6775_update_device()
1534 data->fan_min[i] = reg; in nct6775_update_device()
1537 if (data->REG_FAN_PULSES[i]) { in nct6775_update_device()
1538 err = nct6775_read_value(data, data->REG_FAN_PULSES[i], ®); in nct6775_update_device()
1541 data->fan_pulses[i] = (reg >> data->FAN_PULSE_SHIFT[i]) & 0x03; in nct6775_update_device()
1544 err = nct6775_select_fan_div(dev, data, i, reg); in nct6775_update_device()
1559 if (!(data->have_temp & BIT(i))) in nct6775_update_device()
1561 for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) { in nct6775_update_device()
1562 if (data->reg_temp[j][i]) { in nct6775_update_device()
1563 err = nct6775_read_temp(data, data->reg_temp[j][i], ®); in nct6775_update_device()
1566 data->temp[j][i] = reg; in nct6775_update_device()
1570 !(data->have_temp_fixed & BIT(i))) in nct6775_update_device()
1572 err = nct6775_read_value(data, data->REG_TEMP_OFFSET[i], ®); in nct6775_update_device()
1575 data->temp_offset[i] = reg; in nct6775_update_device()
1579 if (!(data->have_tsi_temp & BIT(i))) in nct6775_update_device()
1581 err = nct6775_read_value(data, data->REG_TSI_TEMP[i], ®); in nct6775_update_device()
1584 data->tsi_temp[i] = reg; in nct6775_update_device()
1587 data->alarms = 0; in nct6775_update_device()
1591 if (!data->REG_ALARM[i]) in nct6775_update_device()
1593 err = nct6775_read_value(data, data->REG_ALARM[i], &alarm); in nct6775_update_device()
1596 data->alarms |= ((u64)alarm) << (i << 3); in nct6775_update_device()
1599 data->beeps = 0; in nct6775_update_device()
1603 if (!data->REG_BEEP[i]) in nct6775_update_device()
1605 err = nct6775_read_value(data, data->REG_BEEP[i], &beep); in nct6775_update_device()
1608 data->beeps |= ((u64)beep) << (i << 3); in nct6775_update_device()
1611 data->last_updated = jiffies; in nct6775_update_device()
1612 data->valid = true; in nct6775_update_device()
1615 mutex_unlock(&data->update_lock); in nct6775_update_device()
1616 return err ? ERR_PTR(err) : data; in nct6775_update_device()
1626 struct nct6775_data *data = nct6775_update_device(dev); in show_in_reg() local
1631 if (IS_ERR(data)) in show_in_reg()
1632 return PTR_ERR(data); in show_in_reg()
1634 return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr)); in show_in_reg()
1641 struct nct6775_data *data = dev_get_drvdata(dev); in store_in_reg() local
1651 mutex_lock(&data->update_lock); in store_in_reg()
1652 data->in[nr][index] = in_to_reg(val, nr); in store_in_reg()
1653 err = nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], data->in[nr][index]); in store_in_reg()
1654 mutex_unlock(&data->update_lock); in store_in_reg()
1661 struct nct6775_data *data = nct6775_update_device(dev); in nct6775_show_alarm() local
1665 if (IS_ERR(data)) in nct6775_show_alarm()
1666 return PTR_ERR(data); in nct6775_show_alarm()
1668 nr = data->ALARM_BITS[sattr->index]; in nct6775_show_alarm()
1670 (unsigned int)((data->alarms >> nr) & 0x01)); in nct6775_show_alarm()
1674 static int find_temp_source(struct nct6775_data *data, int index, int count) in find_temp_source() argument
1676 int source = data->temp_src[index]; in find_temp_source()
1682 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[nr], &src); in find_temp_source()
1695 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_alarm() local
1699 if (IS_ERR(data)) in show_temp_alarm()
1700 return PTR_ERR(data); in show_temp_alarm()
1706 nr = find_temp_source(data, sattr->index, data->num_temp_alarms); in show_temp_alarm()
1708 int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE]; in show_temp_alarm()
1710 alarm = (data->alarms >> bit) & 0x01; in show_temp_alarm()
1719 struct nct6775_data *data = nct6775_update_device(dev); in nct6775_show_beep() local
1722 if (IS_ERR(data)) in nct6775_show_beep()
1723 return PTR_ERR(data); in nct6775_show_beep()
1725 nr = data->BEEP_BITS[sattr->index]; in nct6775_show_beep()
1728 (unsigned int)((data->beeps >> nr) & 0x01)); in nct6775_show_beep()
1736 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_store_beep() local
1737 int nr = data->BEEP_BITS[sattr->index]; in nct6775_store_beep()
1748 mutex_lock(&data->update_lock); in nct6775_store_beep()
1750 data->beeps |= (1ULL << nr); in nct6775_store_beep()
1752 data->beeps &= ~(1ULL << nr); in nct6775_store_beep()
1753 err = nct6775_write_value(data, data->REG_BEEP[regindex], in nct6775_store_beep()
1754 (data->beeps >> (regindex << 3)) & 0xff); in nct6775_store_beep()
1755 mutex_unlock(&data->update_lock); in nct6775_store_beep()
1764 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_beep() local
1768 if (IS_ERR(data)) in show_temp_beep()
1769 return PTR_ERR(data); in show_temp_beep()
1776 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in show_temp_beep()
1778 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in show_temp_beep()
1780 beep = (data->beeps >> bit) & 0x01; in show_temp_beep()
1790 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_beep() local
1801 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in store_temp_beep()
1805 bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in store_temp_beep()
1808 mutex_lock(&data->update_lock); in store_temp_beep()
1810 data->beeps |= (1ULL << bit); in store_temp_beep()
1812 data->beeps &= ~(1ULL << bit); in store_temp_beep()
1813 err = nct6775_write_value(data, data->REG_BEEP[regindex], in store_temp_beep()
1814 (data->beeps >> (regindex << 3)) & 0xff); in store_temp_beep()
1815 mutex_unlock(&data->update_lock); in store_temp_beep()
1824 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_in_is_visible() local
1827 if (!(data->have_in & BIT(in))) in nct6775_in_is_visible()
1830 return nct6775_attr_mode(data, attr); in nct6775_in_is_visible()
1861 struct nct6775_data *data = nct6775_update_device(dev); in show_fan() local
1865 if (IS_ERR(data)) in show_fan()
1866 return PTR_ERR(data); in show_fan()
1868 return sprintf(buf, "%d\n", data->rpm[nr]); in show_fan()
1874 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_min() local
1878 if (IS_ERR(data)) in show_fan_min()
1879 return PTR_ERR(data); in show_fan_min()
1882 data->fan_from_reg_min(data->fan_min[nr], in show_fan_min()
1883 data->fan_div[nr])); in show_fan_min()
1889 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_div() local
1893 if (IS_ERR(data)) in show_fan_div()
1894 return PTR_ERR(data); in show_fan_div()
1896 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr])); in show_fan_div()
1903 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_min() local
1915 mutex_lock(&data->update_lock); in store_fan_min()
1916 if (!data->has_fan_div) { in store_fan_min()
1926 data->fan_min[nr] = val; in store_fan_min()
1931 data->fan_min[nr] = 255; in store_fan_min()
1932 new_div = data->fan_div[nr]; /* No change */ in store_fan_min()
1942 data->fan_min[nr] = 254; in store_fan_min()
1946 nr + 1, val, data->fan_from_reg_min(254, 7)); in store_fan_min()
1952 data->fan_min[nr] = 1; in store_fan_min()
1956 nr + 1, val, data->fan_from_reg_min(1, 0)); in store_fan_min()
1968 data->fan_min[nr] = reg; in store_fan_min()
1976 if (new_div != data->fan_div[nr]) { in store_fan_min()
1978 nr + 1, div_from_reg(data->fan_div[nr]), in store_fan_min()
1980 data->fan_div[nr] = new_div; in store_fan_min()
1981 err = nct6775_write_fan_div_common(data, nr); in store_fan_min()
1985 data->last_updated = jiffies; in store_fan_min()
1989 err = nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); in store_fan_min()
1990 mutex_unlock(&data->update_lock); in store_fan_min()
1998 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_pulses() local
2002 if (IS_ERR(data)) in show_fan_pulses()
2003 return PTR_ERR(data); in show_fan_pulses()
2005 p = data->fan_pulses[sattr->index]; in show_fan_pulses()
2013 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_pulses() local
2027 mutex_lock(&data->update_lock); in store_fan_pulses()
2028 data->fan_pulses[nr] = val & 3; in store_fan_pulses()
2029 err = nct6775_read_value(data, data->REG_FAN_PULSES[nr], ®); in store_fan_pulses()
2032 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]); in store_fan_pulses()
2033 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr]; in store_fan_pulses()
2034 err = nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg); in store_fan_pulses()
2036 mutex_unlock(&data->update_lock); in store_fan_pulses()
2045 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_fan_is_visible() local
2049 if (!(data->has_fan & BIT(fan))) in nct6775_fan_is_visible()
2052 if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2054 if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2056 if (nr == 3 && !data->REG_FAN_PULSES[fan]) in nct6775_fan_is_visible()
2058 if (nr == 4 && !(data->has_fan_min & BIT(fan))) in nct6775_fan_is_visible()
2060 if (nr == 5 && data->kind != nct6775) in nct6775_fan_is_visible()
2063 return nct6775_attr_mode(data, attr); in nct6775_fan_is_visible()
2098 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_label() local
2102 if (IS_ERR(data)) in show_temp_label()
2103 return PTR_ERR(data); in show_temp_label()
2105 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]); in show_temp_label()
2111 struct nct6775_data *data = nct6775_update_device(dev); in show_temp() local
2116 if (IS_ERR(data)) in show_temp()
2117 return PTR_ERR(data); in show_temp()
2119 return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr])); in show_temp()
2126 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp() local
2137 mutex_lock(&data->update_lock); in store_temp()
2138 data->temp[index][nr] = LM75_TEMP_TO_REG(val); in store_temp()
2139 err = nct6775_write_temp(data, data->reg_temp[index][nr], data->temp[index][nr]); in store_temp()
2140 mutex_unlock(&data->update_lock); in store_temp()
2147 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_offset() local
2150 if (IS_ERR(data)) in show_temp_offset()
2151 return PTR_ERR(data); in show_temp_offset()
2153 return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000); in show_temp_offset()
2160 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_offset() local
2172 mutex_lock(&data->update_lock); in store_temp_offset()
2173 data->temp_offset[nr] = val; in store_temp_offset()
2174 err = nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val); in store_temp_offset()
2175 mutex_unlock(&data->update_lock); in store_temp_offset()
2183 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_type() local
2187 if (IS_ERR(data)) in show_temp_type()
2188 return PTR_ERR(data); in show_temp_type()
2190 return sprintf(buf, "%d\n", (int)data->temp_type[nr]); in show_temp_type()
2197 struct nct6775_data *data = nct6775_update_device(dev); in store_temp_type() local
2205 if (IS_ERR(data)) in store_temp_type()
2206 return PTR_ERR(data); in store_temp_type()
2215 mutex_lock(&data->update_lock); in store_temp_type()
2217 data->temp_type[nr] = val; in store_temp_type()
2219 dbit = data->DIODE_MASK << nr; in store_temp_type()
2221 err = nct6775_read_value(data, data->REG_VBAT, &vbat); in store_temp_type()
2226 err = nct6775_read_value(data, data->REG_DIODE, &diode); in store_temp_type()
2242 err = nct6775_write_value(data, data->REG_VBAT, vbat); in store_temp_type()
2245 err = nct6775_write_value(data, data->REG_DIODE, diode); in store_temp_type()
2247 mutex_unlock(&data->update_lock); in store_temp_type()
2255 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_temp_is_visible() local
2259 if (!(data->have_temp & BIT(temp))) in nct6775_temp_is_visible()
2262 if (nr == 1 && !data->temp_label) in nct6775_temp_is_visible()
2265 if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0) in nct6775_temp_is_visible()
2268 if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0) in nct6775_temp_is_visible()
2271 if (nr == 4 && !data->reg_temp[1][temp]) /* max */ in nct6775_temp_is_visible()
2274 if (nr == 5 && !data->reg_temp[2][temp]) /* max_hyst */ in nct6775_temp_is_visible()
2277 if (nr == 6 && !data->reg_temp[3][temp]) /* crit */ in nct6775_temp_is_visible()
2280 if (nr == 7 && !data->reg_temp[4][temp]) /* lcrit */ in nct6775_temp_is_visible()
2284 if (nr > 7 && !(data->have_temp_fixed & BIT(temp))) in nct6775_temp_is_visible()
2287 return nct6775_attr_mode(data, attr); in nct6775_temp_is_visible()
2328 struct nct6775_data *data = nct6775_update_device(dev); in show_tsi_temp() local
2331 if (IS_ERR(data)) in show_tsi_temp()
2332 return PTR_ERR(data); in show_tsi_temp()
2334 return sysfs_emit(buf, "%u\n", tsi_temp_from_reg(data->tsi_temp[sattr->index])); in show_tsi_temp()
2351 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_tsi_temp_is_visible() local
2354 return (data->have_tsi_temp & BIT(temp)) ? nct6775_attr_mode(data, attr) : 0; in nct6775_tsi_temp_is_visible()
2370 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_mode() local
2373 if (IS_ERR(data)) in show_pwm_mode()
2374 return PTR_ERR(data); in show_pwm_mode()
2376 return sprintf(buf, "%d\n", data->pwm_mode[sattr->index]); in show_pwm_mode()
2383 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_mode() local
2398 if (data->REG_PWM_MODE[nr] == 0) { in store_pwm_mode()
2404 mutex_lock(&data->update_lock); in store_pwm_mode()
2405 data->pwm_mode[nr] = val; in store_pwm_mode()
2406 err = nct6775_read_value(data, data->REG_PWM_MODE[nr], ®); in store_pwm_mode()
2409 reg &= ~data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2411 reg |= data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2412 err = nct6775_write_value(data, data->REG_PWM_MODE[nr], reg); in store_pwm_mode()
2414 mutex_unlock(&data->update_lock); in store_pwm_mode()
2421 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm() local
2428 if (IS_ERR(data)) in show_pwm()
2429 return PTR_ERR(data); in show_pwm()
2435 if (index == 0 && data->pwm_enable[nr] > manual) { in show_pwm()
2436 err = nct6775_read_value(data, data->REG_PWM_READ[nr], &pwm); in show_pwm()
2440 pwm = data->pwm[index][nr]; in show_pwm()
2450 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm() local
2455 int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 }; in store_pwm()
2457 = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 }; in store_pwm()
2466 mutex_lock(&data->update_lock); in store_pwm()
2467 data->pwm[index][nr] = val; in store_pwm()
2468 err = nct6775_write_value(data, data->REG_PWM[index][nr], val); in store_pwm()
2472 err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], ®); in store_pwm()
2478 err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm()
2481 mutex_unlock(&data->update_lock); in store_pwm()
2486 static int check_trip_points(struct nct6775_data *data, int nr) in check_trip_points() argument
2490 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2491 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
2494 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2495 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) in check_trip_points()
2499 if (data->auto_pwm[nr][data->auto_pwm_num]) { in check_trip_points()
2500 if (data->auto_temp[nr][data->auto_pwm_num - 1] > in check_trip_points()
2501 data->auto_temp[nr][data->auto_pwm_num] || in check_trip_points()
2502 data->auto_pwm[nr][data->auto_pwm_num - 1] > in check_trip_points()
2503 data->auto_pwm[nr][data->auto_pwm_num]) in check_trip_points()
2509 static int pwm_update_registers(struct nct6775_data *data, int nr) in pwm_update_registers() argument
2514 switch (data->pwm_enable[nr]) { in pwm_update_registers()
2519 err = nct6775_read_value(data, data->REG_FAN_MODE[nr], ®); in pwm_update_registers()
2522 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2523 (data->target_speed_tolerance[nr] & data->tolerance_mask); in pwm_update_registers()
2524 err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2527 err = nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2528 data->target_speed[nr] & 0xff); in pwm_update_registers()
2531 if (data->REG_TOLERANCE_H) { in pwm_update_registers()
2532 reg = (data->target_speed[nr] >> 8) & 0x0f; in pwm_update_registers()
2533 reg |= (data->target_speed_tolerance[nr] & 0x38) << 1; in pwm_update_registers()
2534 err = nct6775_write_value(data, data->REG_TOLERANCE_H[nr], reg); in pwm_update_registers()
2540 err = nct6775_write_value(data, data->REG_TARGET[nr], data->target_temp[nr]); in pwm_update_registers()
2545 err = nct6775_read_value(data, data->REG_FAN_MODE[nr], ®); in pwm_update_registers()
2548 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2549 data->temp_tolerance[0][nr]; in pwm_update_registers()
2550 err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2562 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_enable() local
2565 if (IS_ERR(data)) in show_pwm_enable()
2566 return PTR_ERR(data); in show_pwm_enable()
2568 return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]); in show_pwm_enable()
2575 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_enable() local
2589 if (val == sf3 && data->kind != nct6775) in store_pwm_enable()
2592 if (val == sf4 && check_trip_points(data, nr)) { in store_pwm_enable()
2598 mutex_lock(&data->update_lock); in store_pwm_enable()
2599 data->pwm_enable[nr] = val; in store_pwm_enable()
2604 data->pwm[0][nr] = 255; in store_pwm_enable()
2605 err = nct6775_write_value(data, data->REG_PWM[0][nr], 255); in store_pwm_enable()
2609 err = pwm_update_registers(data, nr); in store_pwm_enable()
2612 err = nct6775_read_value(data, data->REG_FAN_MODE[nr], ®); in store_pwm_enable()
2617 err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in store_pwm_enable()
2619 mutex_unlock(&data->update_lock); in store_pwm_enable()
2624 show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src) in show_pwm_temp_sel_common() argument
2629 if (!(data->have_temp & BIT(i))) in show_pwm_temp_sel_common()
2631 if (src == data->temp_src[i]) { in show_pwm_temp_sel_common()
2643 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_temp_sel() local
2647 if (IS_ERR(data)) in show_pwm_temp_sel()
2648 return PTR_ERR(data); in show_pwm_temp_sel()
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
2664 if (IS_ERR(data)) in store_pwm_temp_sel()
2665 return PTR_ERR(data); in store_pwm_temp_sel()
2672 if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1]) in store_pwm_temp_sel()
2675 mutex_lock(&data->update_lock); in store_pwm_temp_sel()
2676 src = data->temp_src[val - 1]; in store_pwm_temp_sel()
2677 data->pwm_temp_sel[nr] = src; in store_pwm_temp_sel()
2678 err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], ®); in store_pwm_temp_sel()
2683 err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm_temp_sel()
2685 mutex_unlock(&data->update_lock); in store_pwm_temp_sel()
2694 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_weight_temp_sel() local
2698 if (IS_ERR(data)) in show_pwm_weight_temp_sel()
2699 return PTR_ERR(data); in show_pwm_weight_temp_sel()
2701 return show_pwm_temp_sel_common(data, buf, in show_pwm_weight_temp_sel()
2702 data->pwm_weight_temp_sel[index]); in show_pwm_weight_temp_sel()
2709 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_weight_temp_sel() local
2716 if (IS_ERR(data)) in store_pwm_weight_temp_sel()
2717 return PTR_ERR(data); in store_pwm_weight_temp_sel()
2725 if (val && (!(data->have_temp & BIT(val - 1)) || in store_pwm_weight_temp_sel()
2726 !data->temp_src[val - 1])) in store_pwm_weight_temp_sel()
2729 mutex_lock(&data->update_lock); in store_pwm_weight_temp_sel()
2731 src = data->temp_src[val - 1]; in store_pwm_weight_temp_sel()
2732 data->pwm_weight_temp_sel[nr] = src; in store_pwm_weight_temp_sel()
2733 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr], ®); in store_pwm_weight_temp_sel()
2738 err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2740 data->pwm_weight_temp_sel[nr] = 0; in store_pwm_weight_temp_sel()
2741 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr], ®); in store_pwm_weight_temp_sel()
2745 err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2748 mutex_unlock(&data->update_lock); in store_pwm_weight_temp_sel()
2756 struct nct6775_data *data = nct6775_update_device(dev); in show_target_temp() local
2759 if (IS_ERR(data)) in show_target_temp()
2760 return PTR_ERR(data); in show_target_temp()
2762 return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000); in show_target_temp()
2769 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_temp() local
2780 data->target_temp_mask); in store_target_temp()
2782 mutex_lock(&data->update_lock); in store_target_temp()
2783 data->target_temp[nr] = val; in store_target_temp()
2784 err = pwm_update_registers(data, nr); in store_target_temp()
2785 mutex_unlock(&data->update_lock); in store_target_temp()
2792 struct nct6775_data *data = nct6775_update_device(dev); in show_target_speed() local
2796 if (IS_ERR(data)) in show_target_speed()
2797 return PTR_ERR(data); in show_target_speed()
2800 fan_from_reg16(data->target_speed[nr], in show_target_speed()
2801 data->fan_div[nr])); in show_target_speed()
2808 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_speed() local
2820 speed = fan_to_reg(val, data->fan_div[nr]); in store_target_speed()
2822 mutex_lock(&data->update_lock); in store_target_speed()
2823 data->target_speed[nr] = speed; in store_target_speed()
2824 err = pwm_update_registers(data, nr); in store_target_speed()
2825 mutex_unlock(&data->update_lock); in store_target_speed()
2833 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_tolerance() local
2838 if (IS_ERR(data)) in show_temp_tolerance()
2839 return PTR_ERR(data); in show_temp_tolerance()
2841 return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000); in show_temp_tolerance()
2848 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_tolerance() local
2860 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask); in store_temp_tolerance()
2862 mutex_lock(&data->update_lock); in store_temp_tolerance()
2863 data->temp_tolerance[index][nr] = val; in store_temp_tolerance()
2865 err = pwm_update_registers(data, nr); in store_temp_tolerance()
2867 err = nct6775_write_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[nr], val); in store_temp_tolerance()
2868 mutex_unlock(&data->update_lock); in store_temp_tolerance()
2883 struct nct6775_data *data = nct6775_update_device(dev); in show_speed_tolerance() local
2888 if (IS_ERR(data)) in show_speed_tolerance()
2889 return PTR_ERR(data); in show_speed_tolerance()
2891 target = data->target_speed[nr]; in show_speed_tolerance()
2894 int low = target - data->target_speed_tolerance[nr]; in show_speed_tolerance()
2895 int high = target + data->target_speed_tolerance[nr]; in show_speed_tolerance()
2904 tolerance = (fan_from_reg16(low, data->fan_div[nr]) in show_speed_tolerance()
2905 - fan_from_reg16(high, data->fan_div[nr])) / 2; in show_speed_tolerance()
2915 struct nct6775_data *data = dev_get_drvdata(dev); in store_speed_tolerance() local
2926 high = fan_from_reg16(data->target_speed[nr], data->fan_div[nr]) + val; in store_speed_tolerance()
2927 low = fan_from_reg16(data->target_speed[nr], data->fan_div[nr]) - val; in store_speed_tolerance()
2933 val = (fan_to_reg(low, data->fan_div[nr]) - in store_speed_tolerance()
2934 fan_to_reg(high, data->fan_div[nr])) / 2; in store_speed_tolerance()
2937 val = clamp_val(val, 0, data->speed_tolerance_limit); in store_speed_tolerance()
2939 mutex_lock(&data->update_lock); in store_speed_tolerance()
2940 data->target_speed_tolerance[nr] = val; in store_speed_tolerance()
2941 err = pwm_update_registers(data, nr); in store_speed_tolerance()
2942 mutex_unlock(&data->update_lock); in store_speed_tolerance()
2960 struct nct6775_data *data = nct6775_update_device(dev); in show_weight_temp() local
2965 if (IS_ERR(data)) in show_weight_temp()
2966 return PTR_ERR(data); in show_weight_temp()
2968 return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000); in show_weight_temp()
2975 struct nct6775_data *data = dev_get_drvdata(dev); in store_weight_temp() local
2988 mutex_lock(&data->update_lock); in store_weight_temp()
2989 data->weight_temp[index][nr] = val; in store_weight_temp()
2990 err = nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); in store_weight_temp()
2991 mutex_unlock(&data->update_lock); in store_weight_temp()
3009 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_time() local
3014 if (IS_ERR(data)) in show_fan_time()
3015 return PTR_ERR(data); in show_fan_time()
3018 step_time_from_reg(data->fan_time[index][nr], in show_fan_time()
3019 data->pwm_mode[nr])); in show_fan_time()
3026 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_time() local
3037 val = step_time_to_reg(val, data->pwm_mode[nr]); in store_fan_time()
3038 mutex_lock(&data->update_lock); in store_fan_time()
3039 data->fan_time[index][nr] = val; in store_fan_time()
3040 err = nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val); in store_fan_time()
3041 mutex_unlock(&data->update_lock); in store_fan_time()
3048 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_pwm() local
3051 if (IS_ERR(data)) in show_auto_pwm()
3052 return PTR_ERR(data); in show_auto_pwm()
3054 return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]); in show_auto_pwm()
3061 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_pwm() local
3075 if (point == data->auto_pwm_num) { in store_auto_pwm()
3076 if (data->kind != nct6775 && !val) in store_auto_pwm()
3078 if (data->kind != nct6779 && val) in store_auto_pwm()
3082 mutex_lock(&data->update_lock); in store_auto_pwm()
3083 data->auto_pwm[nr][point] = val; in store_auto_pwm()
3084 if (point < data->auto_pwm_num) { in store_auto_pwm()
3085 err = nct6775_write_value(data, NCT6775_AUTO_PWM(data, nr, point), in store_auto_pwm()
3086 data->auto_pwm[nr][point]); in store_auto_pwm()
3088 switch (data->kind) { in store_auto_pwm()
3091 err = nct6775_read_value(data, NCT6775_REG_CRITICAL_ENAB[nr], ®); in store_auto_pwm()
3098 err = nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], reg); in store_auto_pwm()
3112 err = nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], val); in store_auto_pwm()
3115 err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[nr], ®); in store_auto_pwm()
3119 reg &= ~data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
3121 reg |= data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
3122 err = nct6775_write_value(data, data->REG_CRITICAL_PWM_ENABLE[nr], reg); in store_auto_pwm()
3126 mutex_unlock(&data->update_lock); in store_auto_pwm()
3133 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_temp() local
3138 if (IS_ERR(data)) in show_auto_temp()
3139 return PTR_ERR(data); in show_auto_temp()
3145 return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000); in show_auto_temp()
3152 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_temp() local
3165 mutex_lock(&data->update_lock); in store_auto_temp()
3166 data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000); in store_auto_temp()
3167 if (point < data->auto_pwm_num) { in store_auto_temp()
3168 err = nct6775_write_value(data, NCT6775_AUTO_TEMP(data, nr, point), in store_auto_temp()
3169 data->auto_temp[nr][point]); in store_auto_temp()
3171 err = nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr], in store_auto_temp()
3172 data->auto_temp[nr][point]); in store_auto_temp()
3174 mutex_unlock(&data->update_lock); in store_auto_temp()
3182 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_pwm_is_visible() local
3186 if (!(data->has_pwm & BIT(pwm))) in nct6775_pwm_is_visible()
3190 if (!data->REG_WEIGHT_TEMP_SEL[pwm]) in nct6775_pwm_is_visible()
3192 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */ in nct6775_pwm_is_visible()
3194 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */ in nct6775_pwm_is_visible()
3196 if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */ in nct6775_pwm_is_visible()
3202 if (api > data->auto_pwm_num) in nct6775_pwm_is_visible()
3205 return nct6775_attr_mode(data, attr); in nct6775_pwm_is_visible()
3311 static inline int nct6775_init_device(struct nct6775_data *data) in nct6775_init_device() argument
3317 if (data->REG_CONFIG) { in nct6775_init_device()
3318 err = nct6775_read_value(data, data->REG_CONFIG, &tmp); in nct6775_init_device()
3322 err = nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01); in nct6775_init_device()
3330 if (!(data->have_temp & BIT(i))) in nct6775_init_device()
3332 if (!data->reg_temp_config[i]) in nct6775_init_device()
3334 err = nct6775_read_value(data, data->reg_temp_config[i], &tmp); in nct6775_init_device()
3338 err = nct6775_write_value(data, data->reg_temp_config[i], tmp & 0xfe); in nct6775_init_device()
3345 err = nct6775_read_value(data, data->REG_VBAT, &tmp); in nct6775_init_device()
3349 err = nct6775_write_value(data, data->REG_VBAT, tmp | 0x01); in nct6775_init_device()
3354 err = nct6775_read_value(data, data->REG_DIODE, &diode); in nct6775_init_device()
3358 for (i = 0; i < data->temp_fixed_num; i++) { in nct6775_init_device()
3359 if (!(data->have_temp_fixed & BIT(i))) in nct6775_init_device()
3361 if ((tmp & (data->DIODE_MASK << i))) /* diode */ in nct6775_init_device()
3362 data->temp_type[i] in nct6775_init_device()
3363 = 3 - ((diode >> i) & data->DIODE_MASK); in nct6775_init_device()
3365 data->temp_type[i] = 4; in nct6775_init_device()
3371 static int add_temp_sensors(struct nct6775_data *data, const u16 *regp, in add_temp_sensors() argument
3377 for (i = 0; i < data->pwm_num && *available; i++) { in add_temp_sensors()
3382 err = nct6775_read_value(data, regp[i], &src); in add_temp_sensors()
3388 if (!(data->temp_mask & BIT(src))) in add_temp_sensors()
3392 err = nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src); in add_temp_sensors()
3402 int nct6775_probe(struct device *dev, struct nct6775_data *data, in nct6775_probe() argument
3415 data->regmap = devm_regmap_init(dev, NULL, data, regmapcfg); in nct6775_probe()
3416 if (IS_ERR(data->regmap)) in nct6775_probe()
3417 return PTR_ERR(data->regmap); in nct6775_probe()
3419 mutex_init(&data->update_lock); in nct6775_probe()
3420 data->name = nct6775_device_names[data->kind]; in nct6775_probe()
3421 data->bank = 0xff; /* Force initial bank selection */ in nct6775_probe()
3423 switch (data->kind) { in nct6775_probe()
3425 data->in_num = 9; in nct6775_probe()
3426 data->pwm_num = 3; in nct6775_probe()
3427 data->auto_pwm_num = 4; in nct6775_probe()
3428 data->temp_fixed_num = 3; in nct6775_probe()
3429 data->num_temp_alarms = 6; in nct6775_probe()
3430 data->num_temp_beeps = 6; in nct6775_probe()
3432 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3433 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3435 data->temp_label = nct6776_temp_label; in nct6775_probe()
3436 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3437 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3439 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3440 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3441 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3442 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3443 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3444 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3445 data->REG_TARGET = NCT6106_REG_TARGET; in nct6775_probe()
3446 data->REG_FAN = NCT6106_REG_FAN; in nct6775_probe()
3447 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE; in nct6775_probe()
3448 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN; in nct6775_probe()
3449 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES; in nct6775_probe()
3450 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT; in nct6775_probe()
3451 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME; in nct6775_probe()
3452 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3453 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3454 data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H; in nct6775_probe()
3455 data->REG_PWM[0] = NCT6116_REG_PWM; in nct6775_probe()
3456 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; in nct6775_probe()
3457 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3458 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3459 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3460 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3461 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3462 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3463 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP; in nct6775_probe()
3464 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM; in nct6775_probe()
3465 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP; in nct6775_probe()
3466 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3468 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3469 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3471 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM; in nct6775_probe()
3472 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3473 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE; in nct6775_probe()
3474 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL; in nct6775_probe()
3475 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3476 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3477 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3478 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3479 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3480 data->ALARM_BITS = NCT6106_ALARM_BITS; in nct6775_probe()
3481 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3482 data->BEEP_BITS = NCT6106_BEEP_BITS; in nct6775_probe()
3483 data->REG_TSI_TEMP = NCT6106_REG_TSI_TEMP; in nct6775_probe()
3500 data->in_num = 9; in nct6775_probe()
3501 data->pwm_num = 3; in nct6775_probe()
3502 data->auto_pwm_num = 4; in nct6775_probe()
3503 data->temp_fixed_num = 3; in nct6775_probe()
3504 data->num_temp_alarms = 3; in nct6775_probe()
3505 data->num_temp_beeps = 3; in nct6775_probe()
3507 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3508 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3510 data->temp_label = nct6776_temp_label; in nct6775_probe()
3511 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3512 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3514 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3515 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3516 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3517 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3518 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3519 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3520 data->REG_TARGET = NCT6116_REG_TARGET; in nct6775_probe()
3521 data->REG_FAN = NCT6116_REG_FAN; in nct6775_probe()
3522 data->REG_FAN_MODE = NCT6116_REG_FAN_MODE; in nct6775_probe()
3523 data->REG_FAN_MIN = NCT6116_REG_FAN_MIN; in nct6775_probe()
3524 data->REG_FAN_PULSES = NCT6116_REG_FAN_PULSES; in nct6775_probe()
3525 data->FAN_PULSE_SHIFT = NCT6116_FAN_PULSE_SHIFT; in nct6775_probe()
3526 data->REG_FAN_TIME[0] = NCT6116_REG_FAN_STOP_TIME; in nct6775_probe()
3527 data->REG_FAN_TIME[1] = NCT6116_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3528 data->REG_FAN_TIME[2] = NCT6116_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3529 data->REG_TOLERANCE_H = NCT6116_REG_TOLERANCE_H; in nct6775_probe()
3530 data->REG_PWM[0] = NCT6116_REG_PWM; in nct6775_probe()
3531 data->REG_PWM[1] = NCT6116_REG_FAN_START_OUTPUT; in nct6775_probe()
3532 data->REG_PWM[2] = NCT6116_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3533 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3534 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3535 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3536 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3537 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3538 data->REG_AUTO_TEMP = NCT6116_REG_AUTO_TEMP; in nct6775_probe()
3539 data->REG_AUTO_PWM = NCT6116_REG_AUTO_PWM; in nct6775_probe()
3540 data->REG_CRITICAL_TEMP = NCT6116_REG_CRITICAL_TEMP; in nct6775_probe()
3541 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3543 data->REG_CRITICAL_PWM_ENABLE = NCT6116_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3544 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3546 data->REG_CRITICAL_PWM = NCT6116_REG_CRITICAL_PWM; in nct6775_probe()
3547 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3548 data->REG_TEMP_SOURCE = NCT6116_REG_TEMP_SOURCE; in nct6775_probe()
3549 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL; in nct6775_probe()
3550 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3551 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3552 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3553 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3554 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3555 data->ALARM_BITS = NCT6116_ALARM_BITS; in nct6775_probe()
3556 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3557 data->BEEP_BITS = NCT6116_BEEP_BITS; in nct6775_probe()
3558 data->REG_TSI_TEMP = NCT6116_REG_TSI_TEMP; in nct6775_probe()
3575 data->in_num = 9; in nct6775_probe()
3576 data->pwm_num = 3; in nct6775_probe()
3577 data->auto_pwm_num = 6; in nct6775_probe()
3578 data->has_fan_div = true; in nct6775_probe()
3579 data->temp_fixed_num = 3; in nct6775_probe()
3580 data->num_temp_alarms = 3; in nct6775_probe()
3581 data->num_temp_beeps = 3; in nct6775_probe()
3583 data->ALARM_BITS = NCT6775_ALARM_BITS; in nct6775_probe()
3584 data->BEEP_BITS = NCT6775_BEEP_BITS; in nct6775_probe()
3586 data->fan_from_reg = fan_from_reg16; in nct6775_probe()
3587 data->fan_from_reg_min = fan_from_reg8; in nct6775_probe()
3588 data->target_temp_mask = 0x7f; in nct6775_probe()
3589 data->tolerance_mask = 0x0f; in nct6775_probe()
3590 data->speed_tolerance_limit = 15; in nct6775_probe()
3592 data->temp_label = nct6775_temp_label; in nct6775_probe()
3593 data->temp_mask = NCT6775_TEMP_MASK; in nct6775_probe()
3594 data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK; in nct6775_probe()
3596 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3597 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3598 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3599 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3600 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3601 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3602 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3603 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3604 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3605 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3606 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN; in nct6775_probe()
3607 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES; in nct6775_probe()
3608 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3609 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3610 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3611 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3612 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3613 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3614 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3615 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT; in nct6775_probe()
3616 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT; in nct6775_probe()
3617 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3618 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3619 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE; in nct6775_probe()
3620 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK; in nct6775_probe()
3621 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3622 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3623 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3624 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3626 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3627 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3628 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3629 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3630 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3631 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3632 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3633 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3634 data->REG_BEEP = NCT6775_REG_BEEP; in nct6775_probe()
3635 data->REG_TSI_TEMP = NCT6775_REG_TSI_TEMP; in nct6775_probe()
3650 data->in_num = 9; in nct6775_probe()
3651 data->pwm_num = 3; in nct6775_probe()
3652 data->auto_pwm_num = 4; in nct6775_probe()
3653 data->has_fan_div = false; in nct6775_probe()
3654 data->temp_fixed_num = 3; in nct6775_probe()
3655 data->num_temp_alarms = 3; in nct6775_probe()
3656 data->num_temp_beeps = 6; in nct6775_probe()
3658 data->ALARM_BITS = NCT6776_ALARM_BITS; in nct6775_probe()
3659 data->BEEP_BITS = NCT6776_BEEP_BITS; in nct6775_probe()
3661 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3662 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3663 data->target_temp_mask = 0xff; in nct6775_probe()
3664 data->tolerance_mask = 0x07; in nct6775_probe()
3665 data->speed_tolerance_limit = 63; in nct6775_probe()
3667 data->temp_label = nct6776_temp_label; in nct6775_probe()
3668 data->temp_mask = NCT6776_TEMP_MASK; in nct6775_probe()
3669 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; in nct6775_probe()
3671 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3672 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3673 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3674 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3675 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3676 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3677 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3678 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3679 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3680 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3681 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3682 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; in nct6775_probe()
3683 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3684 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3685 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3686 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3687 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3688 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3689 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3690 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3691 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3692 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3693 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3694 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3695 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3696 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3697 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3698 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3699 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3701 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3702 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3703 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3704 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3705 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3706 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3707 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3708 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3709 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3710 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP; in nct6775_probe()
3725 data->in_num = 15; in nct6775_probe()
3726 data->pwm_num = 5; in nct6775_probe()
3727 data->auto_pwm_num = 4; in nct6775_probe()
3728 data->has_fan_div = false; in nct6775_probe()
3729 data->temp_fixed_num = 6; in nct6775_probe()
3730 data->num_temp_alarms = 2; in nct6775_probe()
3731 data->num_temp_beeps = 2; in nct6775_probe()
3733 data->ALARM_BITS = NCT6779_ALARM_BITS; in nct6775_probe()
3734 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3736 data->fan_from_reg = fan_from_reg_rpm; in nct6775_probe()
3737 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3738 data->target_temp_mask = 0xff; in nct6775_probe()
3739 data->tolerance_mask = 0x07; in nct6775_probe()
3740 data->speed_tolerance_limit = 63; in nct6775_probe()
3742 data->temp_label = nct6779_temp_label; in nct6775_probe()
3743 data->temp_mask = NCT6779_TEMP_MASK; in nct6775_probe()
3744 data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK; in nct6775_probe()
3746 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3747 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3748 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3749 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3750 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3751 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3752 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3753 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3754 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3755 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3756 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3757 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3758 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3759 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3760 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3761 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3762 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3763 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3764 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3765 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3766 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3767 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3768 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3769 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3770 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3771 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3772 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3773 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3774 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3776 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3777 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3779 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3780 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3781 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3782 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3783 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3784 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3785 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3786 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3787 data->REG_ALARM = NCT6779_REG_ALARM; in nct6775_probe()
3788 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3789 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP; in nct6775_probe()
3810 data->in_num = 15; in nct6775_probe()
3811 data->pwm_num = (data->kind == nct6796 || in nct6775_probe()
3812 data->kind == nct6797 || in nct6775_probe()
3813 data->kind == nct6798) ? 7 : 6; in nct6775_probe()
3814 data->auto_pwm_num = 4; in nct6775_probe()
3815 data->has_fan_div = false; in nct6775_probe()
3816 data->temp_fixed_num = 6; in nct6775_probe()
3817 data->num_temp_alarms = 2; in nct6775_probe()
3818 data->num_temp_beeps = 2; in nct6775_probe()
3820 data->ALARM_BITS = NCT6791_ALARM_BITS; in nct6775_probe()
3821 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3823 data->fan_from_reg = fan_from_reg_rpm; in nct6775_probe()
3824 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3825 data->target_temp_mask = 0xff; in nct6775_probe()
3826 data->tolerance_mask = 0x07; in nct6775_probe()
3827 data->speed_tolerance_limit = 63; in nct6775_probe()
3829 switch (data->kind) { in nct6775_probe()
3832 data->temp_label = nct6779_temp_label; in nct6775_probe()
3833 data->temp_mask = NCT6791_TEMP_MASK; in nct6775_probe()
3834 data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK; in nct6775_probe()
3837 data->temp_label = nct6792_temp_label; in nct6775_probe()
3838 data->temp_mask = NCT6792_TEMP_MASK; in nct6775_probe()
3839 data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK; in nct6775_probe()
3842 data->temp_label = nct6793_temp_label; in nct6775_probe()
3843 data->temp_mask = NCT6793_TEMP_MASK; in nct6775_probe()
3844 data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK; in nct6775_probe()
3848 data->temp_label = nct6795_temp_label; in nct6775_probe()
3849 data->temp_mask = NCT6795_TEMP_MASK; in nct6775_probe()
3850 data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK; in nct6775_probe()
3853 data->temp_label = nct6796_temp_label; in nct6775_probe()
3854 data->temp_mask = NCT6796_TEMP_MASK; in nct6775_probe()
3855 data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK; in nct6775_probe()
3858 data->temp_label = nct6798_temp_label; in nct6775_probe()
3859 data->temp_mask = NCT6798_TEMP_MASK; in nct6775_probe()
3860 data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK; in nct6775_probe()
3864 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3865 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3866 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3867 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3868 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3869 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3870 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3871 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3872 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3873 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3874 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3875 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3876 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3877 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3878 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3879 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3880 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3881 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3882 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3883 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3884 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3885 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3886 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3887 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3888 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3889 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3890 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3891 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3892 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3894 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3895 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3897 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3898 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3899 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3900 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3901 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3902 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3903 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3904 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3905 data->REG_ALARM = NCT6791_REG_ALARM; in nct6775_probe()
3906 if (data->kind == nct6791) in nct6775_probe()
3907 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3909 data->REG_BEEP = NCT6792_REG_BEEP; in nct6775_probe()
3910 switch (data->kind) { in nct6775_probe()
3914 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP; in nct6775_probe()
3921 data->REG_TSI_TEMP = NCT6796_REG_TSI_TEMP; in nct6775_probe()
3931 if (data->kind == nct6791) { in nct6775_probe()
3948 data->have_in = BIT(data->in_num) - 1; in nct6775_probe()
3949 data->have_temp = 0; in nct6775_probe()
3965 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src); in nct6775_probe()
3979 err = add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask); in nct6775_probe()
3982 err = add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask); in nct6775_probe()
3992 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src); in nct6775_probe()
3999 if (!(data->temp_mask & BIT(src))) { in nct6775_probe()
4002 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]); in nct6775_probe()
4009 if (src <= data->temp_fixed_num) { in nct6775_probe()
4010 data->have_temp |= BIT(src - 1); in nct6775_probe()
4011 data->have_temp_fixed |= BIT(src - 1); in nct6775_probe()
4012 data->reg_temp[0][src - 1] = reg_temp[i]; in nct6775_probe()
4013 data->reg_temp[1][src - 1] = reg_temp_over[i]; in nct6775_probe()
4014 data->reg_temp[2][src - 1] = reg_temp_hyst[i]; in nct6775_probe()
4016 data->reg_temp[3][src - 1] = reg_temp_crit_h[i]; in nct6775_probe()
4018 data->reg_temp[3][src - 1] in nct6775_probe()
4021 data->reg_temp[4][src - 1] = reg_temp_crit_l[i]; in nct6775_probe()
4022 data->reg_temp_config[src - 1] = reg_temp_config[i]; in nct6775_probe()
4023 data->temp_src[src - 1] = src; in nct6775_probe()
4031 data->have_temp |= BIT(s); in nct6775_probe()
4032 data->reg_temp[0][s] = reg_temp[i]; in nct6775_probe()
4033 data->reg_temp[1][s] = reg_temp_over[i]; in nct6775_probe()
4034 data->reg_temp[2][s] = reg_temp_hyst[i]; in nct6775_probe()
4035 data->reg_temp_config[s] = reg_temp_config[i]; in nct6775_probe()
4037 data->reg_temp[3][s] = reg_temp_crit_h[i]; in nct6775_probe()
4039 data->reg_temp[3][s] = reg_temp_crit[src - 1]; in nct6775_probe()
4041 data->reg_temp[4][s] = reg_temp_crit_l[i]; in nct6775_probe()
4043 data->temp_src[s] = src; in nct6775_probe()
4055 err = nct6775_read_value(data, data->REG_TEMP_SEL[i], &src); in nct6775_probe()
4062 if (!(data->temp_mask & BIT(src))) { in nct6775_probe()
4065 src, i, data->REG_TEMP_SEL[i], in nct6775_probe()
4075 if (!(data->virt_temp_mask & BIT(src))) { in nct6775_probe()
4082 if (src <= data->temp_fixed_num) { in nct6775_probe()
4083 if (data->have_temp & BIT(src - 1)) in nct6775_probe()
4085 data->have_temp |= BIT(src - 1); in nct6775_probe()
4086 data->have_temp_fixed |= BIT(src - 1); in nct6775_probe()
4087 data->reg_temp[0][src - 1] = reg_temp_mon[i]; in nct6775_probe()
4088 data->temp_src[src - 1] = src; in nct6775_probe()
4096 data->have_temp |= BIT(s); in nct6775_probe()
4097 data->reg_temp[0][s] = reg_temp_mon[i]; in nct6775_probe()
4098 data->temp_src[s] = src; in nct6775_probe()
4110 if (!(data->temp_mask & BIT(i + 1))) in nct6775_probe()
4116 if (i < data->temp_fixed_num) { in nct6775_probe()
4117 if (data->have_temp & BIT(i)) in nct6775_probe()
4119 data->have_temp |= BIT(i); in nct6775_probe()
4120 data->have_temp_fixed |= BIT(i); in nct6775_probe()
4121 data->reg_temp[0][i] = reg_temp_alternate[i]; in nct6775_probe()
4123 data->reg_temp[1][i] = reg_temp_over[i]; in nct6775_probe()
4124 data->reg_temp[2][i] = reg_temp_hyst[i]; in nct6775_probe()
4126 data->temp_src[i] = i + 1; in nct6775_probe()
4133 data->have_temp |= BIT(s); in nct6775_probe()
4134 data->reg_temp[0][s] = reg_temp_alternate[i]; in nct6775_probe()
4135 data->temp_src[s] = i + 1; in nct6775_probe()
4144 err = nct6775_read_value(data, data->REG_TSI_TEMP[i], &tmp); in nct6775_probe()
4148 data->have_tsi_temp |= BIT(i); in nct6775_probe()
4152 err = nct6775_init_device(data); in nct6775_probe()
4156 if (data->driver_init) { in nct6775_probe()
4157 err = data->driver_init(data); in nct6775_probe()
4163 err = nct6775_init_fan_common(dev, data); in nct6775_probe()
4168 err = nct6775_add_template_attr_group(dev, data, &nct6775_pwm_template_group, in nct6775_probe()
4169 data->pwm_num); in nct6775_probe()
4173 err = nct6775_add_template_attr_group(dev, data, &nct6775_in_template_group, in nct6775_probe()
4174 fls(data->have_in)); in nct6775_probe()
4178 err = nct6775_add_template_attr_group(dev, data, &nct6775_fan_template_group, in nct6775_probe()
4179 fls(data->has_fan)); in nct6775_probe()
4183 err = nct6775_add_template_attr_group(dev, data, &nct6775_temp_template_group, in nct6775_probe()
4184 fls(data->have_temp)); in nct6775_probe()
4188 if (data->have_tsi_temp) { in nct6775_probe()
4191 tsi_temp_tg.base = fls(data->have_temp) + 1; in nct6775_probe()
4192 err = nct6775_add_template_attr_group(dev, data, &tsi_temp_tg, in nct6775_probe()
4193 fls(data->have_tsi_temp)); in nct6775_probe()
4198 hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name, in nct6775_probe()
4199 data, data->groups); in nct6775_probe()