Lines Matching refs:data

327 #define NCT6775_AUTO_TEMP(data, nr, p)	((data)->REG_AUTO_TEMP[nr] + (p))  argument
328 #define NCT6775_AUTO_PWM(data, nr, p) ((data)->REG_AUTO_PWM[nr] + (p)) argument
1122 static bool is_word_sized(struct nct6775_data *data, u16 reg) in is_word_sized() argument
1124 switch (data->kind) { in is_word_sized()
1172 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg) in nct6775_set_bank() argument
1176 if (data->bank != bank) { in nct6775_set_bank()
1177 outb_p(NCT6775_REG_BANK, data->addr + ADDR_REG_OFFSET); in nct6775_set_bank()
1178 outb_p(bank, data->addr + DATA_REG_OFFSET); in nct6775_set_bank()
1179 data->bank = bank; in nct6775_set_bank()
1183 static u16 nct6775_read_value(struct nct6775_data *data, u16 reg) in nct6775_read_value() argument
1185 int res, word_sized = is_word_sized(data, reg); in nct6775_read_value()
1187 nct6775_set_bank(data, reg); in nct6775_read_value()
1188 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1189 res = inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1192 data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1193 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1198 static int nct6775_write_value(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_value() argument
1200 int word_sized = is_word_sized(data, reg); in nct6775_write_value()
1202 nct6775_set_bank(data, reg); in nct6775_write_value()
1203 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1205 outb_p(value >> 8, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1207 data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1209 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1214 static u16 nct6775_read_temp(struct nct6775_data *data, u16 reg) in nct6775_read_temp() argument
1218 res = nct6775_read_value(data, reg); in nct6775_read_temp()
1219 if (!is_word_sized(data, reg)) in nct6775_read_temp()
1225 static int nct6775_write_temp(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_temp() argument
1227 if (!is_word_sized(data, reg)) in nct6775_write_temp()
1229 return nct6775_write_value(data, reg, value); in nct6775_write_temp()
1233 static void nct6775_write_fan_div(struct nct6775_data *data, int nr) in nct6775_write_fan_div() argument
1239 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x70) in nct6775_write_fan_div()
1240 | (data->fan_div[0] & 0x7); in nct6775_write_fan_div()
1241 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1244 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x7) in nct6775_write_fan_div()
1245 | ((data->fan_div[1] << 4) & 0x70); in nct6775_write_fan_div()
1246 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1249 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x70) in nct6775_write_fan_div()
1250 | (data->fan_div[2] & 0x7); in nct6775_write_fan_div()
1251 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1254 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x7) in nct6775_write_fan_div()
1255 | ((data->fan_div[3] << 4) & 0x70); in nct6775_write_fan_div()
1256 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1261 static void nct6775_write_fan_div_common(struct nct6775_data *data, int nr) in nct6775_write_fan_div_common() argument
1263 if (data->kind == nct6775) in nct6775_write_fan_div_common()
1264 nct6775_write_fan_div(data, nr); in nct6775_write_fan_div_common()
1267 static void nct6775_update_fan_div(struct nct6775_data *data) in nct6775_update_fan_div() argument
1271 i = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_update_fan_div()
1272 data->fan_div[0] = i & 0x7; in nct6775_update_fan_div()
1273 data->fan_div[1] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1274 i = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_update_fan_div()
1275 data->fan_div[2] = i & 0x7; in nct6775_update_fan_div()
1276 if (data->has_fan & (1 << 3)) in nct6775_update_fan_div()
1277 data->fan_div[3] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1280 static void nct6775_update_fan_div_common(struct nct6775_data *data) in nct6775_update_fan_div_common() argument
1282 if (data->kind == nct6775) in nct6775_update_fan_div_common()
1283 nct6775_update_fan_div(data); in nct6775_update_fan_div_common()
1286 static void nct6775_init_fan_div(struct nct6775_data *data) in nct6775_init_fan_div() argument
1290 nct6775_update_fan_div_common(data); in nct6775_init_fan_div()
1297 for (i = 0; i < ARRAY_SIZE(data->fan_div); i++) { in nct6775_init_fan_div()
1298 if (!(data->has_fan & (1 << i))) in nct6775_init_fan_div()
1300 if (data->fan_div[i] == 0) { in nct6775_init_fan_div()
1301 data->fan_div[i] = 7; in nct6775_init_fan_div()
1302 nct6775_write_fan_div_common(data, i); in nct6775_init_fan_div()
1308 struct nct6775_data *data) in nct6775_init_fan_common() argument
1313 if (data->has_fan_div) in nct6775_init_fan_common()
1314 nct6775_init_fan_div(data); in nct6775_init_fan_common()
1320 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_init_fan_common()
1321 if (data->has_fan_min & (1 << i)) { in nct6775_init_fan_common()
1322 reg = nct6775_read_value(data, data->REG_FAN_MIN[i]); in nct6775_init_fan_common()
1324 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_init_fan_common()
1325 data->has_fan_div ? 0xff in nct6775_init_fan_common()
1332 struct nct6775_data *data, int nr, u16 reg) in nct6775_select_fan_div() argument
1334 u8 fan_div = data->fan_div[nr]; in nct6775_select_fan_div()
1337 if (!data->has_fan_div) in nct6775_select_fan_div()
1350 if (fan_div != data->fan_div[nr]) { in nct6775_select_fan_div()
1352 nr + 1, div_from_reg(data->fan_div[nr]), in nct6775_select_fan_div()
1356 if (data->has_fan_min & (1 << nr)) { in nct6775_select_fan_div()
1357 fan_min = data->fan_min[nr]; in nct6775_select_fan_div()
1358 if (fan_div > data->fan_div[nr]) { in nct6775_select_fan_div()
1368 if (fan_min != data->fan_min[nr]) { in nct6775_select_fan_div()
1369 data->fan_min[nr] = fan_min; in nct6775_select_fan_div()
1370 nct6775_write_value(data, data->REG_FAN_MIN[nr], in nct6775_select_fan_div()
1374 data->fan_div[nr] = fan_div; in nct6775_select_fan_div()
1375 nct6775_write_fan_div_common(data, nr); in nct6775_select_fan_div()
1381 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm() local
1386 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm()
1387 if (!(data->has_pwm & (1 << i))) in nct6775_update_pwm()
1390 duty_is_dc = data->REG_PWM_MODE[i] && in nct6775_update_pwm()
1391 (nct6775_read_value(data, data->REG_PWM_MODE[i]) in nct6775_update_pwm()
1392 & data->PWM_MODE_MASK[i]); in nct6775_update_pwm()
1393 data->pwm_mode[i] = duty_is_dc; in nct6775_update_pwm()
1395 fanmodecfg = nct6775_read_value(data, data->REG_FAN_MODE[i]); in nct6775_update_pwm()
1396 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) { in nct6775_update_pwm()
1397 if (data->REG_PWM[j] && data->REG_PWM[j][i]) { in nct6775_update_pwm()
1398 data->pwm[j][i] in nct6775_update_pwm()
1399 = nct6775_read_value(data, in nct6775_update_pwm()
1400 data->REG_PWM[j][i]); in nct6775_update_pwm()
1404 data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i], in nct6775_update_pwm()
1407 if (!data->temp_tolerance[0][i] || in nct6775_update_pwm()
1408 data->pwm_enable[i] != speed_cruise) in nct6775_update_pwm()
1409 data->temp_tolerance[0][i] = fanmodecfg & 0x0f; in nct6775_update_pwm()
1410 if (!data->target_speed_tolerance[i] || in nct6775_update_pwm()
1411 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm()
1414 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm()
1415 t |= (nct6775_read_value(data, in nct6775_update_pwm()
1416 data->REG_TOLERANCE_H[i]) & 0x70) >> 1; in nct6775_update_pwm()
1418 data->target_speed_tolerance[i] = t; in nct6775_update_pwm()
1421 data->temp_tolerance[1][i] = in nct6775_update_pwm()
1422 nct6775_read_value(data, in nct6775_update_pwm()
1423 data->REG_CRITICAL_TEMP_TOLERANCE[i]); in nct6775_update_pwm()
1425 reg = nct6775_read_value(data, data->REG_TEMP_SEL[i]); in nct6775_update_pwm()
1426 data->pwm_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1429 data->pwm[2][i] = 0; in nct6775_update_pwm()
1431 if (!data->REG_WEIGHT_TEMP_SEL[i]) in nct6775_update_pwm()
1434 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); in nct6775_update_pwm()
1435 data->pwm_weight_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1438 data->pwm_weight_temp_sel[i] = 0; in nct6775_update_pwm()
1441 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) { in nct6775_update_pwm()
1442 data->weight_temp[j][i] in nct6775_update_pwm()
1443 = nct6775_read_value(data, in nct6775_update_pwm()
1444 data->REG_WEIGHT_TEMP[j][i]); in nct6775_update_pwm()
1451 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm_limits() local
1456 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm_limits()
1457 if (!(data->has_pwm & (1 << i))) in nct6775_update_pwm_limits()
1460 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) { in nct6775_update_pwm_limits()
1461 data->fan_time[j][i] = in nct6775_update_pwm_limits()
1462 nct6775_read_value(data, data->REG_FAN_TIME[j][i]); in nct6775_update_pwm_limits()
1465 reg_t = nct6775_read_value(data, data->REG_TARGET[i]); in nct6775_update_pwm_limits()
1467 if (!data->target_temp[i] || in nct6775_update_pwm_limits()
1468 data->pwm_enable[i] == thermal_cruise) in nct6775_update_pwm_limits()
1469 data->target_temp[i] = reg_t & data->target_temp_mask; in nct6775_update_pwm_limits()
1470 if (!data->target_speed[i] || in nct6775_update_pwm_limits()
1471 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm_limits()
1472 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm_limits()
1473 reg_t |= (nct6775_read_value(data, in nct6775_update_pwm_limits()
1474 data->REG_TOLERANCE_H[i]) & 0x0f) << 8; in nct6775_update_pwm_limits()
1476 data->target_speed[i] = reg_t; in nct6775_update_pwm_limits()
1479 for (j = 0; j < data->auto_pwm_num; j++) { in nct6775_update_pwm_limits()
1480 data->auto_pwm[i][j] = in nct6775_update_pwm_limits()
1481 nct6775_read_value(data, in nct6775_update_pwm_limits()
1482 NCT6775_AUTO_PWM(data, i, j)); in nct6775_update_pwm_limits()
1483 data->auto_temp[i][j] = in nct6775_update_pwm_limits()
1484 nct6775_read_value(data, in nct6775_update_pwm_limits()
1485 NCT6775_AUTO_TEMP(data, i, j)); in nct6775_update_pwm_limits()
1489 data->auto_temp[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1490 nct6775_read_value(data, data->REG_CRITICAL_TEMP[i]); in nct6775_update_pwm_limits()
1492 switch (data->kind) { in nct6775_update_pwm_limits()
1494 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1496 data->auto_pwm[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1500 data->auto_pwm[i][data->auto_pwm_num] = 0xff; in nct6775_update_pwm_limits()
1507 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1508 data->REG_CRITICAL_PWM_ENABLE[i]); in nct6775_update_pwm_limits()
1509 if (reg & data->CRITICAL_PWM_ENABLE_MASK) in nct6775_update_pwm_limits()
1510 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1511 data->REG_CRITICAL_PWM[i]); in nct6775_update_pwm_limits()
1514 data->auto_pwm[i][data->auto_pwm_num] = reg; in nct6775_update_pwm_limits()
1522 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_device() local
1525 mutex_lock(&data->update_lock); in nct6775_update_device()
1527 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) in nct6775_update_device()
1528 || !data->valid) { in nct6775_update_device()
1530 nct6775_update_fan_div_common(data); in nct6775_update_device()
1533 for (i = 0; i < data->in_num; i++) { in nct6775_update_device()
1534 if (!(data->have_in & (1 << i))) in nct6775_update_device()
1537 data->in[i][0] = nct6775_read_value(data, in nct6775_update_device()
1538 data->REG_VIN[i]); in nct6775_update_device()
1539 data->in[i][1] = nct6775_read_value(data, in nct6775_update_device()
1540 data->REG_IN_MINMAX[0][i]); in nct6775_update_device()
1541 data->in[i][2] = nct6775_read_value(data, in nct6775_update_device()
1542 data->REG_IN_MINMAX[1][i]); in nct6775_update_device()
1546 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) { in nct6775_update_device()
1549 if (!(data->has_fan & (1 << i))) in nct6775_update_device()
1552 reg = nct6775_read_value(data, data->REG_FAN[i]); in nct6775_update_device()
1553 data->rpm[i] = data->fan_from_reg(reg, in nct6775_update_device()
1554 data->fan_div[i]); in nct6775_update_device()
1556 if (data->has_fan_min & (1 << i)) in nct6775_update_device()
1557 data->fan_min[i] = nct6775_read_value(data, in nct6775_update_device()
1558 data->REG_FAN_MIN[i]); in nct6775_update_device()
1559 data->fan_pulses[i] = in nct6775_update_device()
1560 (nct6775_read_value(data, data->REG_FAN_PULSES[i]) in nct6775_update_device()
1561 >> data->FAN_PULSE_SHIFT[i]) & 0x03; in nct6775_update_device()
1563 nct6775_select_fan_div(dev, data, i, reg); in nct6775_update_device()
1571 if (!(data->have_temp & (1 << i))) in nct6775_update_device()
1573 for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) { in nct6775_update_device()
1574 if (data->reg_temp[j][i]) in nct6775_update_device()
1575 data->temp[j][i] in nct6775_update_device()
1576 = nct6775_read_temp(data, in nct6775_update_device()
1577 data->reg_temp[j][i]); in nct6775_update_device()
1580 !(data->have_temp_fixed & (1 << i))) in nct6775_update_device()
1582 data->temp_offset[i] in nct6775_update_device()
1583 = nct6775_read_value(data, data->REG_TEMP_OFFSET[i]); in nct6775_update_device()
1586 data->alarms = 0; in nct6775_update_device()
1590 if (!data->REG_ALARM[i]) in nct6775_update_device()
1592 alarm = nct6775_read_value(data, data->REG_ALARM[i]); in nct6775_update_device()
1593 data->alarms |= ((u64)alarm) << (i << 3); in nct6775_update_device()
1596 data->beeps = 0; in nct6775_update_device()
1600 if (!data->REG_BEEP[i]) in nct6775_update_device()
1602 beep = nct6775_read_value(data, data->REG_BEEP[i]); in nct6775_update_device()
1603 data->beeps |= ((u64)beep) << (i << 3); in nct6775_update_device()
1606 data->last_updated = jiffies; in nct6775_update_device()
1607 data->valid = true; in nct6775_update_device()
1610 mutex_unlock(&data->update_lock); in nct6775_update_device()
1611 return data; in nct6775_update_device()
1620 struct nct6775_data *data = nct6775_update_device(dev); in show_in_reg() local
1625 return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr)); in show_in_reg()
1632 struct nct6775_data *data = dev_get_drvdata(dev); in store_in_reg() local
1642 mutex_lock(&data->update_lock); in store_in_reg()
1643 data->in[nr][index] = in_to_reg(val, nr); in store_in_reg()
1644 nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], in store_in_reg()
1645 data->in[nr][index]); in store_in_reg()
1646 mutex_unlock(&data->update_lock); in store_in_reg()
1653 struct nct6775_data *data = nct6775_update_device(dev); in show_alarm() local
1655 int nr = data->ALARM_BITS[sattr->index]; in show_alarm()
1658 (unsigned int)((data->alarms >> nr) & 0x01)); in show_alarm()
1661 static int find_temp_source(struct nct6775_data *data, int index, int count) in find_temp_source() argument
1663 int source = data->temp_src[index]; in find_temp_source()
1669 src = nct6775_read_value(data, in find_temp_source()
1670 data->REG_TEMP_SOURCE[nr]) & 0x1f; in find_temp_source()
1681 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_alarm() local
1689 nr = find_temp_source(data, sattr->index, data->num_temp_alarms); in show_temp_alarm()
1691 int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE]; in show_temp_alarm()
1693 alarm = (data->alarms >> bit) & 0x01; in show_temp_alarm()
1702 struct nct6775_data *data = nct6775_update_device(dev); in show_beep() local
1703 int nr = data->BEEP_BITS[sattr->index]; in show_beep()
1706 (unsigned int)((data->beeps >> nr) & 0x01)); in show_beep()
1714 struct nct6775_data *data = dev_get_drvdata(dev); in store_beep() local
1715 int nr = data->BEEP_BITS[sattr->index]; in store_beep()
1726 mutex_lock(&data->update_lock); in store_beep()
1728 data->beeps |= (1ULL << nr); in store_beep()
1730 data->beeps &= ~(1ULL << nr); in store_beep()
1731 nct6775_write_value(data, data->REG_BEEP[regindex], in store_beep()
1732 (data->beeps >> (regindex << 3)) & 0xff); in store_beep()
1733 mutex_unlock(&data->update_lock); in store_beep()
1741 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_beep() local
1750 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in show_temp_beep()
1752 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in show_temp_beep()
1754 beep = (data->beeps >> bit) & 0x01; in show_temp_beep()
1764 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_beep() local
1775 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in store_temp_beep()
1779 bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in store_temp_beep()
1782 mutex_lock(&data->update_lock); in store_temp_beep()
1784 data->beeps |= (1ULL << bit); in store_temp_beep()
1786 data->beeps &= ~(1ULL << bit); in store_temp_beep()
1787 nct6775_write_value(data, data->REG_BEEP[regindex], in store_temp_beep()
1788 (data->beeps >> (regindex << 3)) & 0xff); in store_temp_beep()
1789 mutex_unlock(&data->update_lock); in store_temp_beep()
1798 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_in_is_visible() local
1801 if (!(data->have_in & (1 << in))) in nct6775_in_is_visible()
1838 struct nct6775_data *data = nct6775_update_device(dev); in show_fan() local
1842 return sprintf(buf, "%d\n", data->rpm[nr]); in show_fan()
1848 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_min() local
1853 data->fan_from_reg_min(data->fan_min[nr], in show_fan_min()
1854 data->fan_div[nr])); in show_fan_min()
1860 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_div() local
1864 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr])); in show_fan_div()
1871 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_min() local
1883 mutex_lock(&data->update_lock); in store_fan_min()
1884 if (!data->has_fan_div) { in store_fan_min()
1894 data->fan_min[nr] = val; in store_fan_min()
1899 data->fan_min[nr] = 255; in store_fan_min()
1900 new_div = data->fan_div[nr]; /* No change */ in store_fan_min()
1910 data->fan_min[nr] = 254; in store_fan_min()
1914 nr + 1, val, data->fan_from_reg_min(254, 7)); in store_fan_min()
1920 data->fan_min[nr] = 1; in store_fan_min()
1924 nr + 1, val, data->fan_from_reg_min(1, 0)); in store_fan_min()
1936 data->fan_min[nr] = reg; in store_fan_min()
1944 if (new_div != data->fan_div[nr]) { in store_fan_min()
1946 nr + 1, div_from_reg(data->fan_div[nr]), in store_fan_min()
1948 data->fan_div[nr] = new_div; in store_fan_min()
1949 nct6775_write_fan_div_common(data, nr); in store_fan_min()
1951 data->last_updated = jiffies; in store_fan_min()
1955 nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); in store_fan_min()
1956 mutex_unlock(&data->update_lock); in store_fan_min()
1964 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_pulses() local
1966 int p = data->fan_pulses[sattr->index]; in show_fan_pulses()
1975 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_pulses() local
1989 mutex_lock(&data->update_lock); in store_fan_pulses()
1990 data->fan_pulses[nr] = val & 3; in store_fan_pulses()
1991 reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]); in store_fan_pulses()
1992 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]); in store_fan_pulses()
1993 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr]; in store_fan_pulses()
1994 nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg); in store_fan_pulses()
1995 mutex_unlock(&data->update_lock); in store_fan_pulses()
2004 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_fan_is_visible() local
2008 if (!(data->has_fan & (1 << fan))) in nct6775_fan_is_visible()
2011 if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2013 if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
2015 if (nr == 4 && !(data->has_fan_min & (1 << fan))) in nct6775_fan_is_visible()
2017 if (nr == 5 && data->kind != nct6775) in nct6775_fan_is_visible()
2058 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_label() local
2062 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]); in show_temp_label()
2068 struct nct6775_data *data = nct6775_update_device(dev); in show_temp() local
2073 return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr])); in show_temp()
2080 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp() local
2091 mutex_lock(&data->update_lock); in store_temp()
2092 data->temp[index][nr] = LM75_TEMP_TO_REG(val); in store_temp()
2093 nct6775_write_temp(data, data->reg_temp[index][nr], in store_temp()
2094 data->temp[index][nr]); in store_temp()
2095 mutex_unlock(&data->update_lock); in store_temp()
2102 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_offset() local
2105 return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000); in show_temp_offset()
2112 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_offset() local
2124 mutex_lock(&data->update_lock); in store_temp_offset()
2125 data->temp_offset[nr] = val; in store_temp_offset()
2126 nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val); in store_temp_offset()
2127 mutex_unlock(&data->update_lock); in store_temp_offset()
2135 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_type() local
2139 return sprintf(buf, "%d\n", (int)data->temp_type[nr]); in show_temp_type()
2146 struct nct6775_data *data = nct6775_update_device(dev); in store_temp_type() local
2160 mutex_lock(&data->update_lock); in store_temp_type()
2162 data->temp_type[nr] = val; in store_temp_type()
2164 dbit = data->DIODE_MASK << nr; in store_temp_type()
2165 vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit; in store_temp_type()
2166 diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit; in store_temp_type()
2178 nct6775_write_value(data, data->REG_VBAT, vbat); in store_temp_type()
2179 nct6775_write_value(data, data->REG_DIODE, diode); in store_temp_type()
2181 mutex_unlock(&data->update_lock); in store_temp_type()
2189 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_temp_is_visible() local
2193 if (!(data->have_temp & (1 << temp))) in nct6775_temp_is_visible()
2196 if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0) in nct6775_temp_is_visible()
2199 if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0) in nct6775_temp_is_visible()
2202 if (nr == 4 && !data->reg_temp[1][temp]) /* max */ in nct6775_temp_is_visible()
2205 if (nr == 5 && !data->reg_temp[2][temp]) /* max_hyst */ in nct6775_temp_is_visible()
2208 if (nr == 6 && !data->reg_temp[3][temp]) /* crit */ in nct6775_temp_is_visible()
2211 if (nr == 7 && !data->reg_temp[4][temp]) /* lcrit */ in nct6775_temp_is_visible()
2215 if (nr > 7 && !(data->have_temp_fixed & (1 << temp))) in nct6775_temp_is_visible()
2267 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_mode() local
2270 return sprintf(buf, "%d\n", !data->pwm_mode[sattr->index]); in show_pwm_mode()
2277 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_mode() local
2292 if (data->REG_PWM_MODE[nr] == 0) { in store_pwm_mode()
2298 mutex_lock(&data->update_lock); in store_pwm_mode()
2299 data->pwm_mode[nr] = val; in store_pwm_mode()
2300 reg = nct6775_read_value(data, data->REG_PWM_MODE[nr]); in store_pwm_mode()
2301 reg &= ~data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2303 reg |= data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2304 nct6775_write_value(data, data->REG_PWM_MODE[nr], reg); in store_pwm_mode()
2305 mutex_unlock(&data->update_lock); in store_pwm_mode()
2312 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm() local
2322 if (index == 0 && data->pwm_enable[nr] > manual) in show_pwm()
2323 pwm = nct6775_read_value(data, data->REG_PWM_READ[nr]); in show_pwm()
2325 pwm = data->pwm[index][nr]; in show_pwm()
2334 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm() local
2339 int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 }; in store_pwm()
2341 = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 }; in store_pwm()
2350 mutex_lock(&data->update_lock); in store_pwm()
2351 data->pwm[index][nr] = val; in store_pwm()
2352 nct6775_write_value(data, data->REG_PWM[index][nr], val); in store_pwm()
2354 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm()
2358 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm()
2360 mutex_unlock(&data->update_lock); in store_pwm()
2365 static int check_trip_points(struct nct6775_data *data, int nr) in check_trip_points() argument
2369 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2370 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
2373 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2374 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) in check_trip_points()
2378 if (data->auto_pwm[nr][data->auto_pwm_num]) { in check_trip_points()
2379 if (data->auto_temp[nr][data->auto_pwm_num - 1] > in check_trip_points()
2380 data->auto_temp[nr][data->auto_pwm_num] || in check_trip_points()
2381 data->auto_pwm[nr][data->auto_pwm_num - 1] > in check_trip_points()
2382 data->auto_pwm[nr][data->auto_pwm_num]) in check_trip_points()
2388 static void pwm_update_registers(struct nct6775_data *data, int nr) in pwm_update_registers() argument
2392 switch (data->pwm_enable[nr]) { in pwm_update_registers()
2397 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2398 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2399 (data->target_speed_tolerance[nr] & data->tolerance_mask); in pwm_update_registers()
2400 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2401 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2402 data->target_speed[nr] & 0xff); in pwm_update_registers()
2403 if (data->REG_TOLERANCE_H) { in pwm_update_registers()
2404 reg = (data->target_speed[nr] >> 8) & 0x0f; in pwm_update_registers()
2405 reg |= (data->target_speed_tolerance[nr] & 0x38) << 1; in pwm_update_registers()
2406 nct6775_write_value(data, in pwm_update_registers()
2407 data->REG_TOLERANCE_H[nr], in pwm_update_registers()
2412 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2413 data->target_temp[nr]); in pwm_update_registers()
2416 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2417 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2418 data->temp_tolerance[0][nr]; in pwm_update_registers()
2419 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2427 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_enable() local
2430 return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]); in show_pwm_enable()
2437 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_enable() local
2451 if (val == sf3 && data->kind != nct6775) in store_pwm_enable()
2454 if (val == sf4 && check_trip_points(data, nr)) { in store_pwm_enable()
2460 mutex_lock(&data->update_lock); in store_pwm_enable()
2461 data->pwm_enable[nr] = val; in store_pwm_enable()
2466 data->pwm[0][nr] = 255; in store_pwm_enable()
2467 nct6775_write_value(data, data->REG_PWM[0][nr], 255); in store_pwm_enable()
2469 pwm_update_registers(data, nr); in store_pwm_enable()
2470 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in store_pwm_enable()
2473 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in store_pwm_enable()
2474 mutex_unlock(&data->update_lock); in store_pwm_enable()
2479 show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src) in show_pwm_temp_sel_common() argument
2484 if (!(data->have_temp & (1 << i))) in show_pwm_temp_sel_common()
2486 if (src == data->temp_src[i]) { in show_pwm_temp_sel_common()
2498 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_temp_sel() local
2502 return show_pwm_temp_sel_common(data, buf, data->pwm_temp_sel[index]); in show_pwm_temp_sel()
2509 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_temp_sel() local
2520 if (!(data->have_temp & (1 << (val - 1))) || !data->temp_src[val - 1]) in store_pwm_temp_sel()
2523 mutex_lock(&data->update_lock); in store_pwm_temp_sel()
2524 src = data->temp_src[val - 1]; in store_pwm_temp_sel()
2525 data->pwm_temp_sel[nr] = src; in store_pwm_temp_sel()
2526 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm_temp_sel()
2529 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm_temp_sel()
2530 mutex_unlock(&data->update_lock); in store_pwm_temp_sel()
2539 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_weight_temp_sel() local
2543 return show_pwm_temp_sel_common(data, buf, in show_pwm_weight_temp_sel()
2544 data->pwm_weight_temp_sel[index]); in show_pwm_weight_temp_sel()
2551 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_weight_temp_sel() local
2562 if (val && (!(data->have_temp & (1 << (val - 1))) || in store_pwm_weight_temp_sel()
2563 !data->temp_src[val - 1])) in store_pwm_weight_temp_sel()
2566 mutex_lock(&data->update_lock); in store_pwm_weight_temp_sel()
2568 src = data->temp_src[val - 1]; in store_pwm_weight_temp_sel()
2569 data->pwm_weight_temp_sel[nr] = src; in store_pwm_weight_temp_sel()
2570 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2573 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2575 data->pwm_weight_temp_sel[nr] = 0; in store_pwm_weight_temp_sel()
2576 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2578 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2580 mutex_unlock(&data->update_lock); in store_pwm_weight_temp_sel()
2588 struct nct6775_data *data = nct6775_update_device(dev); in show_target_temp() local
2591 return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000); in show_target_temp()
2598 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_temp() local
2609 data->target_temp_mask); in store_target_temp()
2611 mutex_lock(&data->update_lock); in store_target_temp()
2612 data->target_temp[nr] = val; in store_target_temp()
2613 pwm_update_registers(data, nr); in store_target_temp()
2614 mutex_unlock(&data->update_lock); in store_target_temp()
2621 struct nct6775_data *data = nct6775_update_device(dev); in show_target_speed() local
2626 fan_from_reg16(data->target_speed[nr], in show_target_speed()
2627 data->fan_div[nr])); in show_target_speed()
2634 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_speed() local
2646 speed = fan_to_reg(val, data->fan_div[nr]); in store_target_speed()
2648 mutex_lock(&data->update_lock); in store_target_speed()
2649 data->target_speed[nr] = speed; in store_target_speed()
2650 pwm_update_registers(data, nr); in store_target_speed()
2651 mutex_unlock(&data->update_lock); in store_target_speed()
2659 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_tolerance() local
2664 return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000); in show_temp_tolerance()
2671 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_tolerance() local
2683 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask); in store_temp_tolerance()
2685 mutex_lock(&data->update_lock); in store_temp_tolerance()
2686 data->temp_tolerance[index][nr] = val; in store_temp_tolerance()
2688 pwm_update_registers(data, nr); in store_temp_tolerance()
2690 nct6775_write_value(data, in store_temp_tolerance()
2691 data->REG_CRITICAL_TEMP_TOLERANCE[nr], in store_temp_tolerance()
2693 mutex_unlock(&data->update_lock); in store_temp_tolerance()
2706 struct nct6775_data *data = nct6775_update_device(dev); in show_speed_tolerance() local
2709 int low = data->target_speed[nr] - data->target_speed_tolerance[nr]; in show_speed_tolerance()
2710 int high = data->target_speed[nr] + data->target_speed_tolerance[nr]; in show_speed_tolerance()
2720 tolerance = (fan_from_reg16(low, data->fan_div[nr]) in show_speed_tolerance()
2721 - fan_from_reg16(high, data->fan_div[nr])) / 2; in show_speed_tolerance()
2730 struct nct6775_data *data = dev_get_drvdata(dev); in store_speed_tolerance() local
2741 high = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
2742 data->fan_div[nr]) + val; in store_speed_tolerance()
2743 low = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
2744 data->fan_div[nr]) - val; in store_speed_tolerance()
2750 val = (fan_to_reg(low, data->fan_div[nr]) - in store_speed_tolerance()
2751 fan_to_reg(high, data->fan_div[nr])) / 2; in store_speed_tolerance()
2754 val = clamp_val(val, 0, data->speed_tolerance_limit); in store_speed_tolerance()
2756 mutex_lock(&data->update_lock); in store_speed_tolerance()
2757 data->target_speed_tolerance[nr] = val; in store_speed_tolerance()
2758 pwm_update_registers(data, nr); in store_speed_tolerance()
2759 mutex_unlock(&data->update_lock); in store_speed_tolerance()
2782 struct nct6775_data *data = nct6775_update_device(dev); in show_weight_temp() local
2787 return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000); in show_weight_temp()
2794 struct nct6775_data *data = dev_get_drvdata(dev); in store_weight_temp() local
2807 mutex_lock(&data->update_lock); in store_weight_temp()
2808 data->weight_temp[index][nr] = val; in store_weight_temp()
2809 nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); in store_weight_temp()
2810 mutex_unlock(&data->update_lock); in store_weight_temp()
2830 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_time() local
2836 step_time_from_reg(data->fan_time[index][nr], in show_fan_time()
2837 data->pwm_mode[nr])); in show_fan_time()
2844 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_time() local
2855 val = step_time_to_reg(val, data->pwm_mode[nr]); in store_fan_time()
2856 mutex_lock(&data->update_lock); in store_fan_time()
2857 data->fan_time[index][nr] = val; in store_fan_time()
2858 nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val); in store_fan_time()
2859 mutex_unlock(&data->update_lock); in store_fan_time()
2866 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_pwm() local
2869 return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]); in show_auto_pwm()
2876 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_pwm() local
2890 if (point == data->auto_pwm_num) { in store_auto_pwm()
2891 if (data->kind != nct6775 && !val) in store_auto_pwm()
2893 if (data->kind != nct6779 && val) in store_auto_pwm()
2897 mutex_lock(&data->update_lock); in store_auto_pwm()
2898 data->auto_pwm[nr][point] = val; in store_auto_pwm()
2899 if (point < data->auto_pwm_num) { in store_auto_pwm()
2900 nct6775_write_value(data, in store_auto_pwm()
2901 NCT6775_AUTO_PWM(data, nr, point), in store_auto_pwm()
2902 data->auto_pwm[nr][point]); in store_auto_pwm()
2904 switch (data->kind) { in store_auto_pwm()
2907 reg = nct6775_read_value(data, in store_auto_pwm()
2913 nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], in store_auto_pwm()
2923 nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], in store_auto_pwm()
2925 reg = nct6775_read_value(data, in store_auto_pwm()
2926 data->REG_CRITICAL_PWM_ENABLE[nr]); in store_auto_pwm()
2928 reg &= ~data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
2930 reg |= data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
2931 nct6775_write_value(data, in store_auto_pwm()
2932 data->REG_CRITICAL_PWM_ENABLE[nr], in store_auto_pwm()
2937 mutex_unlock(&data->update_lock); in store_auto_pwm()
2944 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_temp() local
2953 return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000); in show_auto_temp()
2960 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_temp() local
2973 mutex_lock(&data->update_lock); in store_auto_temp()
2974 data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000); in store_auto_temp()
2975 if (point < data->auto_pwm_num) { in store_auto_temp()
2976 nct6775_write_value(data, in store_auto_temp()
2977 NCT6775_AUTO_TEMP(data, nr, point), in store_auto_temp()
2978 data->auto_temp[nr][point]); in store_auto_temp()
2980 nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr], in store_auto_temp()
2981 data->auto_temp[nr][point]); in store_auto_temp()
2983 mutex_unlock(&data->update_lock); in store_auto_temp()
2991 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_pwm_is_visible() local
2995 if (!(data->has_pwm & (1 << pwm))) in nct6775_pwm_is_visible()
2999 if (!data->REG_WEIGHT_TEMP_SEL[pwm]) in nct6775_pwm_is_visible()
3001 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */ in nct6775_pwm_is_visible()
3003 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */ in nct6775_pwm_is_visible()
3005 if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */ in nct6775_pwm_is_visible()
3011 if (api > data->auto_pwm_num) in nct6775_pwm_is_visible()
3129 struct nct6775_data *data = dev_get_drvdata(dev); in show_vid() local
3131 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in show_vid()
3142 struct nct6775_data *data = dev_get_drvdata(dev); in clear_caseopen() local
3151 mutex_lock(&data->update_lock); in clear_caseopen()
3158 ret = superio_enter(data->sioreg); in clear_caseopen()
3164 superio_select(data->sioreg, NCT6775_LD_ACPI); in clear_caseopen()
3165 reg = superio_inb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]); in clear_caseopen()
3167 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3169 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3170 superio_exit(data->sioreg); in clear_caseopen()
3172 data->valid = false; /* Force cache refresh */ in clear_caseopen()
3174 mutex_unlock(&data->update_lock); in clear_caseopen()
3193 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_other_is_visible() local
3195 if (index == 0 && !data->have_vid) in nct6775_other_is_visible()
3199 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + index - 1] < 0) in nct6775_other_is_visible()
3204 if (data->BEEP_BITS[INTRUSION_ALARM_BASE + index - 3] < 0) in nct6775_other_is_visible()
3232 static inline void nct6775_init_device(struct nct6775_data *data) in nct6775_init_device() argument
3238 if (data->REG_CONFIG) { in nct6775_init_device()
3239 tmp = nct6775_read_value(data, data->REG_CONFIG); in nct6775_init_device()
3241 nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01); in nct6775_init_device()
3246 if (!(data->have_temp & (1 << i))) in nct6775_init_device()
3248 if (!data->reg_temp_config[i]) in nct6775_init_device()
3250 tmp = nct6775_read_value(data, data->reg_temp_config[i]); in nct6775_init_device()
3252 nct6775_write_value(data, data->reg_temp_config[i], in nct6775_init_device()
3257 tmp = nct6775_read_value(data, data->REG_VBAT); in nct6775_init_device()
3259 nct6775_write_value(data, data->REG_VBAT, tmp | 0x01); in nct6775_init_device()
3261 diode = nct6775_read_value(data, data->REG_DIODE); in nct6775_init_device()
3263 for (i = 0; i < data->temp_fixed_num; i++) { in nct6775_init_device()
3264 if (!(data->have_temp_fixed & (1 << i))) in nct6775_init_device()
3266 if ((tmp & (data->DIODE_MASK << i))) /* diode */ in nct6775_init_device()
3267 data->temp_type[i] in nct6775_init_device()
3268 = 3 - ((diode >> i) & data->DIODE_MASK); in nct6775_init_device()
3270 data->temp_type[i] = 4; in nct6775_init_device()
3275 nct6775_check_fan_inputs(struct nct6775_data *data) in nct6775_check_fan_inputs() argument
3279 int sioreg = data->sioreg; in nct6775_check_fan_inputs()
3284 data->sio_reg_enable = superio_inb(sioreg, SIO_REG_ENABLE); in nct6775_check_fan_inputs()
3287 if (data->kind == nct6775) { in nct6775_check_fan_inputs()
3301 } else if (data->kind == nct6776) { in nct6775_check_fan_inputs()
3316 if ((data->sio_reg_enable & 0xe0) != 0xe0) { in nct6775_check_fan_inputs()
3317 data->sio_reg_enable |= 0xe0; in nct6775_check_fan_inputs()
3319 data->sio_reg_enable); in nct6775_check_fan_inputs()
3324 if (data->sio_reg_enable & 0x80) in nct6775_check_fan_inputs()
3329 if (data->sio_reg_enable & 0x40) in nct6775_check_fan_inputs()
3334 if (data->sio_reg_enable & 0x20) in nct6775_check_fan_inputs()
3345 } else if (data->kind == nct6106) { in nct6775_check_fan_inputs()
3370 if (data->kind == nct6791 || data->kind == nct6792 || in nct6775_check_fan_inputs()
3371 data->kind == nct6793) { in nct6775_check_fan_inputs()
3382 data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) | in nct6775_check_fan_inputs()
3384 data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) | in nct6775_check_fan_inputs()
3386 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | in nct6775_check_fan_inputs()
3390 static void add_temp_sensors(struct nct6775_data *data, const u16 *regp, in add_temp_sensors() argument
3396 for (i = 0; i < data->pwm_num && *available; i++) { in add_temp_sensors()
3401 src = nct6775_read_value(data, regp[i]); in add_temp_sensors()
3405 if (src >= data->temp_label_num || in add_temp_sensors()
3406 !strlen(data->temp_label[src])) in add_temp_sensors()
3410 nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src); in add_temp_sensors()
3420 struct nct6775_data *data; in nct6775_probe() local
3438 data = devm_kzalloc(&pdev->dev, sizeof(struct nct6775_data), in nct6775_probe()
3440 if (!data) in nct6775_probe()
3443 data->kind = sio_data->kind; in nct6775_probe()
3444 data->sioreg = sio_data->sioreg; in nct6775_probe()
3445 data->addr = res->start; in nct6775_probe()
3446 mutex_init(&data->update_lock); in nct6775_probe()
3447 data->name = nct6775_device_names[data->kind]; in nct6775_probe()
3448 data->bank = 0xff; /* Force initial bank selection */ in nct6775_probe()
3449 platform_set_drvdata(pdev, data); in nct6775_probe()
3451 switch (data->kind) { in nct6775_probe()
3453 data->in_num = 9; in nct6775_probe()
3454 data->pwm_num = 3; in nct6775_probe()
3455 data->auto_pwm_num = 4; in nct6775_probe()
3456 data->temp_fixed_num = 3; in nct6775_probe()
3457 data->num_temp_alarms = 6; in nct6775_probe()
3458 data->num_temp_beeps = 6; in nct6775_probe()
3460 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3461 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3463 data->temp_label = nct6776_temp_label; in nct6775_probe()
3464 data->temp_label_num = ARRAY_SIZE(nct6776_temp_label); in nct6775_probe()
3466 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3467 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3468 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3469 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3470 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3471 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3472 data->REG_TARGET = NCT6106_REG_TARGET; in nct6775_probe()
3473 data->REG_FAN = NCT6106_REG_FAN; in nct6775_probe()
3474 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE; in nct6775_probe()
3475 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN; in nct6775_probe()
3476 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES; in nct6775_probe()
3477 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT; in nct6775_probe()
3478 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME; in nct6775_probe()
3479 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3480 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3481 data->REG_PWM[0] = NCT6106_REG_PWM; in nct6775_probe()
3482 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; in nct6775_probe()
3483 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3484 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3485 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3486 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3487 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3488 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3489 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP; in nct6775_probe()
3490 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM; in nct6775_probe()
3491 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP; in nct6775_probe()
3492 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3494 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3495 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3497 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM; in nct6775_probe()
3498 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3499 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE; in nct6775_probe()
3500 data->REG_TEMP_SEL = NCT6106_REG_TEMP_SEL; in nct6775_probe()
3501 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3502 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3503 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3504 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3505 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3506 data->ALARM_BITS = NCT6106_ALARM_BITS; in nct6775_probe()
3507 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3508 data->BEEP_BITS = NCT6106_BEEP_BITS; in nct6775_probe()
3524 data->in_num = 9; in nct6775_probe()
3525 data->pwm_num = 3; in nct6775_probe()
3526 data->auto_pwm_num = 6; in nct6775_probe()
3527 data->has_fan_div = true; in nct6775_probe()
3528 data->temp_fixed_num = 3; in nct6775_probe()
3529 data->num_temp_alarms = 3; in nct6775_probe()
3530 data->num_temp_beeps = 3; in nct6775_probe()
3532 data->ALARM_BITS = NCT6775_ALARM_BITS; in nct6775_probe()
3533 data->BEEP_BITS = NCT6775_BEEP_BITS; in nct6775_probe()
3535 data->fan_from_reg = fan_from_reg16; in nct6775_probe()
3536 data->fan_from_reg_min = fan_from_reg8; in nct6775_probe()
3537 data->target_temp_mask = 0x7f; in nct6775_probe()
3538 data->tolerance_mask = 0x0f; in nct6775_probe()
3539 data->speed_tolerance_limit = 15; in nct6775_probe()
3541 data->temp_label = nct6775_temp_label; in nct6775_probe()
3542 data->temp_label_num = ARRAY_SIZE(nct6775_temp_label); in nct6775_probe()
3544 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3545 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3546 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3547 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3548 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3549 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3550 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3551 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3552 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3553 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3554 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN; in nct6775_probe()
3555 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES; in nct6775_probe()
3556 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3557 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3558 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3559 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3560 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3561 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3562 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3563 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT; in nct6775_probe()
3564 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT; in nct6775_probe()
3565 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3566 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3567 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE; in nct6775_probe()
3568 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK; in nct6775_probe()
3569 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3570 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3571 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3572 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3574 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3575 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3576 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3577 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3578 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3579 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3580 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3581 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3582 data->REG_BEEP = NCT6775_REG_BEEP; in nct6775_probe()
3596 data->in_num = 9; in nct6775_probe()
3597 data->pwm_num = 3; in nct6775_probe()
3598 data->auto_pwm_num = 4; in nct6775_probe()
3599 data->has_fan_div = false; in nct6775_probe()
3600 data->temp_fixed_num = 3; in nct6775_probe()
3601 data->num_temp_alarms = 3; in nct6775_probe()
3602 data->num_temp_beeps = 6; in nct6775_probe()
3604 data->ALARM_BITS = NCT6776_ALARM_BITS; in nct6775_probe()
3605 data->BEEP_BITS = NCT6776_BEEP_BITS; in nct6775_probe()
3607 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3608 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3609 data->target_temp_mask = 0xff; in nct6775_probe()
3610 data->tolerance_mask = 0x07; in nct6775_probe()
3611 data->speed_tolerance_limit = 63; in nct6775_probe()
3613 data->temp_label = nct6776_temp_label; in nct6775_probe()
3614 data->temp_label_num = ARRAY_SIZE(nct6776_temp_label); in nct6775_probe()
3616 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3617 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3618 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3619 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3620 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3621 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3622 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3623 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3624 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3625 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3626 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3627 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; in nct6775_probe()
3628 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3629 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3630 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3631 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3632 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3633 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3634 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3635 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3636 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3637 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3638 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3639 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3640 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3641 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3642 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3643 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3644 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3646 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3647 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3648 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3649 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3650 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3651 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3652 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3653 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3654 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3668 data->in_num = 15; in nct6775_probe()
3669 data->pwm_num = 5; in nct6775_probe()
3670 data->auto_pwm_num = 4; in nct6775_probe()
3671 data->has_fan_div = false; in nct6775_probe()
3672 data->temp_fixed_num = 6; in nct6775_probe()
3673 data->num_temp_alarms = 2; in nct6775_probe()
3674 data->num_temp_beeps = 2; in nct6775_probe()
3676 data->ALARM_BITS = NCT6779_ALARM_BITS; in nct6775_probe()
3677 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3679 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3680 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3681 data->target_temp_mask = 0xff; in nct6775_probe()
3682 data->tolerance_mask = 0x07; in nct6775_probe()
3683 data->speed_tolerance_limit = 63; in nct6775_probe()
3685 data->temp_label = nct6779_temp_label; in nct6775_probe()
3686 data->temp_label_num = NCT6779_NUM_LABELS; in nct6775_probe()
3688 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3689 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3690 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3691 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3692 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3693 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3694 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3695 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3696 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3697 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3698 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3699 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3700 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3701 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3702 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3703 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3704 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3705 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3706 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3707 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3708 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3709 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3710 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3711 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3712 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3713 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3714 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3715 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3716 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3718 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3719 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3721 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3722 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3723 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3724 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3725 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3726 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3727 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3728 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3729 data->REG_ALARM = NCT6779_REG_ALARM; in nct6775_probe()
3730 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3746 data->in_num = 15; in nct6775_probe()
3747 data->pwm_num = 6; in nct6775_probe()
3748 data->auto_pwm_num = 4; in nct6775_probe()
3749 data->has_fan_div = false; in nct6775_probe()
3750 data->temp_fixed_num = 6; in nct6775_probe()
3751 data->num_temp_alarms = 2; in nct6775_probe()
3752 data->num_temp_beeps = 2; in nct6775_probe()
3754 data->ALARM_BITS = NCT6791_ALARM_BITS; in nct6775_probe()
3755 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3757 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3758 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3759 data->target_temp_mask = 0xff; in nct6775_probe()
3760 data->tolerance_mask = 0x07; in nct6775_probe()
3761 data->speed_tolerance_limit = 63; in nct6775_probe()
3763 switch (data->kind) { in nct6775_probe()
3766 data->temp_label = nct6779_temp_label; in nct6775_probe()
3769 data->temp_label = nct6792_temp_label; in nct6775_probe()
3772 data->temp_label = nct6793_temp_label; in nct6775_probe()
3775 data->temp_label_num = NCT6791_NUM_LABELS; in nct6775_probe()
3777 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3778 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3779 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3780 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3781 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3782 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3783 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3784 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3785 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3786 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3787 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3788 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3789 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3790 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3791 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3792 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3793 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3794 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3795 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3796 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3797 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3798 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3799 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3800 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3801 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3802 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3803 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3804 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3805 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3807 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3808 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3810 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3811 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3812 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3813 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3814 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3815 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3816 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3817 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3818 data->REG_ALARM = NCT6791_REG_ALARM; in nct6775_probe()
3819 if (data->kind == nct6791) in nct6775_probe()
3820 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3822 data->REG_BEEP = NCT6792_REG_BEEP; in nct6775_probe()
3826 if (data->kind == nct6791) { in nct6775_probe()
3843 data->have_in = (1 << data->in_num) - 1; in nct6775_probe()
3844 data->have_temp = 0; in nct6775_probe()
3860 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
3871 add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask); in nct6775_probe()
3872 add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask); in nct6775_probe()
3880 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
3884 if (src >= data->temp_label_num || in nct6775_probe()
3885 !strlen(data->temp_label[src])) { in nct6775_probe()
3888 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]); in nct6775_probe()
3895 if (src <= data->temp_fixed_num) { in nct6775_probe()
3896 data->have_temp |= 1 << (src - 1); in nct6775_probe()
3897 data->have_temp_fixed |= 1 << (src - 1); in nct6775_probe()
3898 data->reg_temp[0][src - 1] = reg_temp[i]; in nct6775_probe()
3899 data->reg_temp[1][src - 1] = reg_temp_over[i]; in nct6775_probe()
3900 data->reg_temp[2][src - 1] = reg_temp_hyst[i]; in nct6775_probe()
3902 data->reg_temp[3][src - 1] = reg_temp_crit_h[i]; in nct6775_probe()
3904 data->reg_temp[3][src - 1] in nct6775_probe()
3907 data->reg_temp[4][src - 1] = reg_temp_crit_l[i]; in nct6775_probe()
3908 data->reg_temp_config[src - 1] = reg_temp_config[i]; in nct6775_probe()
3909 data->temp_src[src - 1] = src; in nct6775_probe()
3917 data->have_temp |= 1 << s; in nct6775_probe()
3918 data->reg_temp[0][s] = reg_temp[i]; in nct6775_probe()
3919 data->reg_temp[1][s] = reg_temp_over[i]; in nct6775_probe()
3920 data->reg_temp[2][s] = reg_temp_hyst[i]; in nct6775_probe()
3921 data->reg_temp_config[s] = reg_temp_config[i]; in nct6775_probe()
3923 data->reg_temp[3][s] = reg_temp_crit_h[i]; in nct6775_probe()
3925 data->reg_temp[3][s] = reg_temp_crit[src - 1]; in nct6775_probe()
3927 data->reg_temp[4][s] = reg_temp_crit_l[i]; in nct6775_probe()
3929 data->temp_src[s] = src; in nct6775_probe()
3941 src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; in nct6775_probe()
3945 if (src >= data->temp_label_num || in nct6775_probe()
3946 !strlen(data->temp_label[src])) { in nct6775_probe()
3949 src, i, data->REG_TEMP_SEL[i], in nct6775_probe()
3957 if (src <= data->temp_fixed_num) { in nct6775_probe()
3958 if (data->have_temp & (1 << (src - 1))) in nct6775_probe()
3960 data->have_temp |= 1 << (src - 1); in nct6775_probe()
3961 data->have_temp_fixed |= 1 << (src - 1); in nct6775_probe()
3962 data->reg_temp[0][src - 1] = reg_temp_mon[i]; in nct6775_probe()
3963 data->temp_src[src - 1] = src; in nct6775_probe()
3971 data->have_temp |= 1 << s; in nct6775_probe()
3972 data->reg_temp[0][s] = reg_temp_mon[i]; in nct6775_probe()
3973 data->temp_src[s] = src; in nct6775_probe()
3984 for (i = 0; i < data->temp_label_num - 1; i++) { in nct6775_probe()
3989 if (i < data->temp_fixed_num) { in nct6775_probe()
3990 if (data->have_temp & (1 << i)) in nct6775_probe()
3992 data->have_temp |= 1 << i; in nct6775_probe()
3993 data->have_temp_fixed |= 1 << i; in nct6775_probe()
3994 data->reg_temp[0][i] = reg_temp_alternate[i]; in nct6775_probe()
3996 data->reg_temp[1][i] = reg_temp_over[i]; in nct6775_probe()
3997 data->reg_temp[2][i] = reg_temp_hyst[i]; in nct6775_probe()
3999 data->temp_src[i] = i + 1; in nct6775_probe()
4006 data->have_temp |= 1 << s; in nct6775_probe()
4007 data->reg_temp[0][s] = reg_temp_alternate[i]; in nct6775_probe()
4008 data->temp_src[s] = i + 1; in nct6775_probe()
4014 nct6775_init_device(data); in nct6775_probe()
4021 switch (data->kind) { in nct6775_probe()
4023 data->have_vid = (cr2a & 0x40); in nct6775_probe()
4026 data->have_vid = (cr2a & 0x60) == 0x40; in nct6775_probe()
4040 if (data->have_vid) { in nct6775_probe()
4042 data->vid = superio_inb(sio_data->sioreg, 0xe3); in nct6775_probe()
4043 data->vrm = vid_which_vrm(); in nct6775_probe()
4052 switch (data->kind) { in nct6775_probe()
4072 data->name); in nct6775_probe()
4075 nct6775_check_fan_inputs(data); in nct6775_probe()
4080 nct6775_init_fan_common(dev, data); in nct6775_probe()
4084 data->pwm_num); in nct6775_probe()
4088 data->groups[num_attr_groups++] = group; in nct6775_probe()
4091 fls(data->have_in)); in nct6775_probe()
4095 data->groups[num_attr_groups++] = group; in nct6775_probe()
4098 fls(data->has_fan)); in nct6775_probe()
4102 data->groups[num_attr_groups++] = group; in nct6775_probe()
4105 fls(data->have_temp)); in nct6775_probe()
4109 data->groups[num_attr_groups++] = group; in nct6775_probe()
4110 data->groups[num_attr_groups++] = &nct6775_group_other; in nct6775_probe()
4112 hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name, in nct6775_probe()
4113 data, data->groups); in nct6775_probe()
4131 struct nct6775_data *data = nct6775_update_device(dev); in nct6775_suspend() local
4133 mutex_lock(&data->update_lock); in nct6775_suspend()
4134 data->vbat = nct6775_read_value(data, data->REG_VBAT); in nct6775_suspend()
4135 if (data->kind == nct6775) { in nct6775_suspend()
4136 data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_suspend()
4137 data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_suspend()
4139 mutex_unlock(&data->update_lock); in nct6775_suspend()
4146 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_resume() local
4147 int sioreg = data->sioreg; in nct6775_resume()
4151 mutex_lock(&data->update_lock); in nct6775_resume()
4152 data->bank = 0xff; /* Force initial bank selection */ in nct6775_resume()
4160 if (reg != data->sio_reg_enable) in nct6775_resume()
4161 superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable); in nct6775_resume()
4163 if (data->kind == nct6791 || data->kind == nct6792 || in nct6775_resume()
4164 data->kind == nct6793) in nct6775_resume()
4170 for (i = 0; i < data->in_num; i++) { in nct6775_resume()
4171 if (!(data->have_in & (1 << i))) in nct6775_resume()
4174 nct6775_write_value(data, data->REG_IN_MINMAX[0][i], in nct6775_resume()
4175 data->in[i][1]); in nct6775_resume()
4176 nct6775_write_value(data, data->REG_IN_MINMAX[1][i], in nct6775_resume()
4177 data->in[i][2]); in nct6775_resume()
4180 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_resume()
4181 if (!(data->has_fan_min & (1 << i))) in nct6775_resume()
4184 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_resume()
4185 data->fan_min[i]); in nct6775_resume()
4189 if (!(data->have_temp & (1 << i))) in nct6775_resume()
4192 for (j = 1; j < ARRAY_SIZE(data->reg_temp); j++) in nct6775_resume()
4193 if (data->reg_temp[j][i]) in nct6775_resume()
4194 nct6775_write_temp(data, data->reg_temp[j][i], in nct6775_resume()
4195 data->temp[j][i]); in nct6775_resume()
4199 nct6775_write_value(data, data->REG_VBAT, data->vbat); in nct6775_resume()
4200 if (data->kind == nct6775) { in nct6775_resume()
4201 nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); in nct6775_resume()
4202 nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); in nct6775_resume()
4207 data->valid = false; in nct6775_resume()
4208 mutex_unlock(&data->update_lock); in nct6775_resume()