Lines Matching refs:data

314 #define NCT6775_AUTO_TEMP(data, nr, p)	((data)->REG_AUTO_TEMP[nr] + (p))  argument
315 #define NCT6775_AUTO_PWM(data, nr, p) ((data)->REG_AUTO_PWM[nr] + (p)) argument
1031 static bool is_word_sized(struct nct6775_data *data, u16 reg) in is_word_sized() argument
1033 switch (data->kind) { in is_word_sized()
1080 static inline void nct6775_set_bank(struct nct6775_data *data, u16 reg) in nct6775_set_bank() argument
1084 if (data->bank != bank) { in nct6775_set_bank()
1085 outb_p(NCT6775_REG_BANK, data->addr + ADDR_REG_OFFSET); in nct6775_set_bank()
1086 outb_p(bank, data->addr + DATA_REG_OFFSET); in nct6775_set_bank()
1087 data->bank = bank; in nct6775_set_bank()
1091 static u16 nct6775_read_value(struct nct6775_data *data, u16 reg) in nct6775_read_value() argument
1093 int res, word_sized = is_word_sized(data, reg); in nct6775_read_value()
1095 nct6775_set_bank(data, reg); in nct6775_read_value()
1096 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1097 res = inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1100 data->addr + ADDR_REG_OFFSET); in nct6775_read_value()
1101 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET); in nct6775_read_value()
1106 static int nct6775_write_value(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_value() argument
1108 int word_sized = is_word_sized(data, reg); in nct6775_write_value()
1110 nct6775_set_bank(data, reg); in nct6775_write_value()
1111 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1113 outb_p(value >> 8, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1115 data->addr + ADDR_REG_OFFSET); in nct6775_write_value()
1117 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); in nct6775_write_value()
1122 static u16 nct6775_read_temp(struct nct6775_data *data, u16 reg) in nct6775_read_temp() argument
1126 res = nct6775_read_value(data, reg); in nct6775_read_temp()
1127 if (!is_word_sized(data, reg)) in nct6775_read_temp()
1133 static int nct6775_write_temp(struct nct6775_data *data, u16 reg, u16 value) in nct6775_write_temp() argument
1135 if (!is_word_sized(data, reg)) in nct6775_write_temp()
1137 return nct6775_write_value(data, reg, value); in nct6775_write_temp()
1141 static void nct6775_write_fan_div(struct nct6775_data *data, int nr) in nct6775_write_fan_div() argument
1147 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x70) in nct6775_write_fan_div()
1148 | (data->fan_div[0] & 0x7); in nct6775_write_fan_div()
1149 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1152 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x7) in nct6775_write_fan_div()
1153 | ((data->fan_div[1] << 4) & 0x70); in nct6775_write_fan_div()
1154 nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); in nct6775_write_fan_div()
1157 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x70) in nct6775_write_fan_div()
1158 | (data->fan_div[2] & 0x7); in nct6775_write_fan_div()
1159 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1162 reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x7) in nct6775_write_fan_div()
1163 | ((data->fan_div[3] << 4) & 0x70); in nct6775_write_fan_div()
1164 nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); in nct6775_write_fan_div()
1169 static void nct6775_write_fan_div_common(struct nct6775_data *data, int nr) in nct6775_write_fan_div_common() argument
1171 if (data->kind == nct6775) in nct6775_write_fan_div_common()
1172 nct6775_write_fan_div(data, nr); in nct6775_write_fan_div_common()
1175 static void nct6775_update_fan_div(struct nct6775_data *data) in nct6775_update_fan_div() argument
1179 i = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_update_fan_div()
1180 data->fan_div[0] = i & 0x7; in nct6775_update_fan_div()
1181 data->fan_div[1] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1182 i = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_update_fan_div()
1183 data->fan_div[2] = i & 0x7; in nct6775_update_fan_div()
1184 if (data->has_fan & (1 << 3)) in nct6775_update_fan_div()
1185 data->fan_div[3] = (i & 0x70) >> 4; in nct6775_update_fan_div()
1188 static void nct6775_update_fan_div_common(struct nct6775_data *data) in nct6775_update_fan_div_common() argument
1190 if (data->kind == nct6775) in nct6775_update_fan_div_common()
1191 nct6775_update_fan_div(data); in nct6775_update_fan_div_common()
1194 static void nct6775_init_fan_div(struct nct6775_data *data) in nct6775_init_fan_div() argument
1198 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 & (1 << 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 nct6775_write_fan_div_common(data, i); in nct6775_init_fan_div()
1216 struct nct6775_data *data) in nct6775_init_fan_common() argument
1221 if (data->has_fan_div) in nct6775_init_fan_common()
1222 nct6775_init_fan_div(data); in nct6775_init_fan_common()
1228 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_init_fan_common()
1229 if (data->has_fan_min & (1 << i)) { in nct6775_init_fan_common()
1230 reg = nct6775_read_value(data, data->REG_FAN_MIN[i]); in nct6775_init_fan_common()
1232 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_init_fan_common()
1233 data->has_fan_div ? 0xff in nct6775_init_fan_common()
1240 struct nct6775_data *data, int nr, u16 reg) in nct6775_select_fan_div() argument
1242 u8 fan_div = data->fan_div[nr]; in nct6775_select_fan_div()
1245 if (!data->has_fan_div) in nct6775_select_fan_div()
1258 if (fan_div != data->fan_div[nr]) { in nct6775_select_fan_div()
1260 nr + 1, div_from_reg(data->fan_div[nr]), in nct6775_select_fan_div()
1264 if (data->has_fan_min & (1 << nr)) { in nct6775_select_fan_div()
1265 fan_min = data->fan_min[nr]; in nct6775_select_fan_div()
1266 if (fan_div > data->fan_div[nr]) { in nct6775_select_fan_div()
1276 if (fan_min != data->fan_min[nr]) { in nct6775_select_fan_div()
1277 data->fan_min[nr] = fan_min; in nct6775_select_fan_div()
1278 nct6775_write_value(data, data->REG_FAN_MIN[nr], in nct6775_select_fan_div()
1282 data->fan_div[nr] = fan_div; in nct6775_select_fan_div()
1283 nct6775_write_fan_div_common(data, nr); in nct6775_select_fan_div()
1289 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm() local
1294 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm()
1295 if (!(data->has_pwm & (1 << i))) in nct6775_update_pwm()
1298 duty_is_dc = data->REG_PWM_MODE[i] && in nct6775_update_pwm()
1299 (nct6775_read_value(data, data->REG_PWM_MODE[i]) in nct6775_update_pwm()
1300 & data->PWM_MODE_MASK[i]); in nct6775_update_pwm()
1301 data->pwm_mode[i] = duty_is_dc; in nct6775_update_pwm()
1303 fanmodecfg = nct6775_read_value(data, data->REG_FAN_MODE[i]); in nct6775_update_pwm()
1304 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) { in nct6775_update_pwm()
1305 if (data->REG_PWM[j] && data->REG_PWM[j][i]) { in nct6775_update_pwm()
1306 data->pwm[j][i] in nct6775_update_pwm()
1307 = nct6775_read_value(data, in nct6775_update_pwm()
1308 data->REG_PWM[j][i]); in nct6775_update_pwm()
1312 data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i], in nct6775_update_pwm()
1315 if (!data->temp_tolerance[0][i] || in nct6775_update_pwm()
1316 data->pwm_enable[i] != speed_cruise) in nct6775_update_pwm()
1317 data->temp_tolerance[0][i] = fanmodecfg & 0x0f; in nct6775_update_pwm()
1318 if (!data->target_speed_tolerance[i] || in nct6775_update_pwm()
1319 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm()
1322 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm()
1323 t |= (nct6775_read_value(data, in nct6775_update_pwm()
1324 data->REG_TOLERANCE_H[i]) & 0x70) >> 1; in nct6775_update_pwm()
1326 data->target_speed_tolerance[i] = t; in nct6775_update_pwm()
1329 data->temp_tolerance[1][i] = in nct6775_update_pwm()
1330 nct6775_read_value(data, in nct6775_update_pwm()
1331 data->REG_CRITICAL_TEMP_TOLERANCE[i]); in nct6775_update_pwm()
1333 reg = nct6775_read_value(data, data->REG_TEMP_SEL[i]); in nct6775_update_pwm()
1334 data->pwm_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1337 data->pwm[2][i] = 0; in nct6775_update_pwm()
1339 if (!data->REG_WEIGHT_TEMP_SEL[i]) in nct6775_update_pwm()
1342 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); in nct6775_update_pwm()
1343 data->pwm_weight_temp_sel[i] = reg & 0x1f; in nct6775_update_pwm()
1346 data->pwm_weight_temp_sel[i] = 0; in nct6775_update_pwm()
1349 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) { in nct6775_update_pwm()
1350 data->weight_temp[j][i] in nct6775_update_pwm()
1351 = nct6775_read_value(data, in nct6775_update_pwm()
1352 data->REG_WEIGHT_TEMP[j][i]); in nct6775_update_pwm()
1359 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_pwm_limits() local
1364 for (i = 0; i < data->pwm_num; i++) { in nct6775_update_pwm_limits()
1365 if (!(data->has_pwm & (1 << i))) in nct6775_update_pwm_limits()
1368 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) { in nct6775_update_pwm_limits()
1369 data->fan_time[j][i] = in nct6775_update_pwm_limits()
1370 nct6775_read_value(data, data->REG_FAN_TIME[j][i]); in nct6775_update_pwm_limits()
1373 reg_t = nct6775_read_value(data, data->REG_TARGET[i]); in nct6775_update_pwm_limits()
1375 if (!data->target_temp[i] || in nct6775_update_pwm_limits()
1376 data->pwm_enable[i] == thermal_cruise) in nct6775_update_pwm_limits()
1377 data->target_temp[i] = reg_t & data->target_temp_mask; in nct6775_update_pwm_limits()
1378 if (!data->target_speed[i] || in nct6775_update_pwm_limits()
1379 data->pwm_enable[i] == speed_cruise) { in nct6775_update_pwm_limits()
1380 if (data->REG_TOLERANCE_H) { in nct6775_update_pwm_limits()
1381 reg_t |= (nct6775_read_value(data, in nct6775_update_pwm_limits()
1382 data->REG_TOLERANCE_H[i]) & 0x0f) << 8; in nct6775_update_pwm_limits()
1384 data->target_speed[i] = reg_t; in nct6775_update_pwm_limits()
1387 for (j = 0; j < data->auto_pwm_num; j++) { in nct6775_update_pwm_limits()
1388 data->auto_pwm[i][j] = in nct6775_update_pwm_limits()
1389 nct6775_read_value(data, in nct6775_update_pwm_limits()
1390 NCT6775_AUTO_PWM(data, i, j)); in nct6775_update_pwm_limits()
1391 data->auto_temp[i][j] = in nct6775_update_pwm_limits()
1392 nct6775_read_value(data, in nct6775_update_pwm_limits()
1393 NCT6775_AUTO_TEMP(data, i, j)); in nct6775_update_pwm_limits()
1397 data->auto_temp[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1398 nct6775_read_value(data, data->REG_CRITICAL_TEMP[i]); in nct6775_update_pwm_limits()
1400 switch (data->kind) { in nct6775_update_pwm_limits()
1402 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1404 data->auto_pwm[i][data->auto_pwm_num] = in nct6775_update_pwm_limits()
1408 data->auto_pwm[i][data->auto_pwm_num] = 0xff; in nct6775_update_pwm_limits()
1414 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1415 data->REG_CRITICAL_PWM_ENABLE[i]); in nct6775_update_pwm_limits()
1416 if (reg & data->CRITICAL_PWM_ENABLE_MASK) in nct6775_update_pwm_limits()
1417 reg = nct6775_read_value(data, in nct6775_update_pwm_limits()
1418 data->REG_CRITICAL_PWM[i]); in nct6775_update_pwm_limits()
1421 data->auto_pwm[i][data->auto_pwm_num] = reg; in nct6775_update_pwm_limits()
1429 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_update_device() local
1432 mutex_lock(&data->update_lock); in nct6775_update_device()
1434 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) in nct6775_update_device()
1435 || !data->valid) { in nct6775_update_device()
1437 nct6775_update_fan_div_common(data); in nct6775_update_device()
1440 for (i = 0; i < data->in_num; i++) { in nct6775_update_device()
1441 if (!(data->have_in & (1 << i))) in nct6775_update_device()
1444 data->in[i][0] = nct6775_read_value(data, in nct6775_update_device()
1445 data->REG_VIN[i]); in nct6775_update_device()
1446 data->in[i][1] = nct6775_read_value(data, in nct6775_update_device()
1447 data->REG_IN_MINMAX[0][i]); in nct6775_update_device()
1448 data->in[i][2] = nct6775_read_value(data, in nct6775_update_device()
1449 data->REG_IN_MINMAX[1][i]); in nct6775_update_device()
1453 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) { in nct6775_update_device()
1456 if (!(data->has_fan & (1 << i))) in nct6775_update_device()
1459 reg = nct6775_read_value(data, data->REG_FAN[i]); in nct6775_update_device()
1460 data->rpm[i] = data->fan_from_reg(reg, in nct6775_update_device()
1461 data->fan_div[i]); in nct6775_update_device()
1463 if (data->has_fan_min & (1 << i)) in nct6775_update_device()
1464 data->fan_min[i] = nct6775_read_value(data, in nct6775_update_device()
1465 data->REG_FAN_MIN[i]); in nct6775_update_device()
1466 data->fan_pulses[i] = in nct6775_update_device()
1467 (nct6775_read_value(data, data->REG_FAN_PULSES[i]) in nct6775_update_device()
1468 >> data->FAN_PULSE_SHIFT[i]) & 0x03; in nct6775_update_device()
1470 nct6775_select_fan_div(dev, data, i, reg); in nct6775_update_device()
1478 if (!(data->have_temp & (1 << i))) in nct6775_update_device()
1480 for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) { in nct6775_update_device()
1481 if (data->reg_temp[j][i]) in nct6775_update_device()
1482 data->temp[j][i] in nct6775_update_device()
1483 = nct6775_read_temp(data, in nct6775_update_device()
1484 data->reg_temp[j][i]); in nct6775_update_device()
1487 !(data->have_temp_fixed & (1 << i))) in nct6775_update_device()
1489 data->temp_offset[i] in nct6775_update_device()
1490 = nct6775_read_value(data, data->REG_TEMP_OFFSET[i]); in nct6775_update_device()
1493 data->alarms = 0; in nct6775_update_device()
1497 if (!data->REG_ALARM[i]) in nct6775_update_device()
1499 alarm = nct6775_read_value(data, data->REG_ALARM[i]); in nct6775_update_device()
1500 data->alarms |= ((u64)alarm) << (i << 3); in nct6775_update_device()
1503 data->beeps = 0; in nct6775_update_device()
1507 if (!data->REG_BEEP[i]) in nct6775_update_device()
1509 beep = nct6775_read_value(data, data->REG_BEEP[i]); in nct6775_update_device()
1510 data->beeps |= ((u64)beep) << (i << 3); in nct6775_update_device()
1513 data->last_updated = jiffies; in nct6775_update_device()
1514 data->valid = true; in nct6775_update_device()
1517 mutex_unlock(&data->update_lock); in nct6775_update_device()
1518 return data; in nct6775_update_device()
1527 struct nct6775_data *data = nct6775_update_device(dev); in show_in_reg() local
1532 return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr)); in show_in_reg()
1539 struct nct6775_data *data = dev_get_drvdata(dev); in store_in_reg() local
1549 mutex_lock(&data->update_lock); in store_in_reg()
1550 data->in[nr][index] = in_to_reg(val, nr); in store_in_reg()
1551 nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], in store_in_reg()
1552 data->in[nr][index]); in store_in_reg()
1553 mutex_unlock(&data->update_lock); in store_in_reg()
1560 struct nct6775_data *data = nct6775_update_device(dev); in show_alarm() local
1562 int nr = data->ALARM_BITS[sattr->index]; in show_alarm()
1565 (unsigned int)((data->alarms >> nr) & 0x01)); in show_alarm()
1568 static int find_temp_source(struct nct6775_data *data, int index, int count) in find_temp_source() argument
1570 int source = data->temp_src[index]; in find_temp_source()
1576 src = nct6775_read_value(data, in find_temp_source()
1577 data->REG_TEMP_SOURCE[nr]) & 0x1f; in find_temp_source()
1588 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_alarm() local
1596 nr = find_temp_source(data, sattr->index, data->num_temp_alarms); in show_temp_alarm()
1598 int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE]; in show_temp_alarm()
1600 alarm = (data->alarms >> bit) & 0x01; in show_temp_alarm()
1609 struct nct6775_data *data = nct6775_update_device(dev); in show_beep() local
1610 int nr = data->BEEP_BITS[sattr->index]; in show_beep()
1613 (unsigned int)((data->beeps >> nr) & 0x01)); in show_beep()
1621 struct nct6775_data *data = dev_get_drvdata(dev); in store_beep() local
1622 int nr = data->BEEP_BITS[sattr->index]; in store_beep()
1633 mutex_lock(&data->update_lock); in store_beep()
1635 data->beeps |= (1ULL << nr); in store_beep()
1637 data->beeps &= ~(1ULL << nr); in store_beep()
1638 nct6775_write_value(data, data->REG_BEEP[regindex], in store_beep()
1639 (data->beeps >> (regindex << 3)) & 0xff); in store_beep()
1640 mutex_unlock(&data->update_lock); in store_beep()
1648 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_beep() local
1657 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in show_temp_beep()
1659 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in show_temp_beep()
1661 beep = (data->beeps >> bit) & 0x01; in show_temp_beep()
1671 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_beep() local
1682 nr = find_temp_source(data, sattr->index, data->num_temp_beeps); in store_temp_beep()
1686 bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE]; in store_temp_beep()
1689 mutex_lock(&data->update_lock); in store_temp_beep()
1691 data->beeps |= (1ULL << bit); in store_temp_beep()
1693 data->beeps &= ~(1ULL << bit); in store_temp_beep()
1694 nct6775_write_value(data, data->REG_BEEP[regindex], in store_temp_beep()
1695 (data->beeps >> (regindex << 3)) & 0xff); in store_temp_beep()
1696 mutex_unlock(&data->update_lock); in store_temp_beep()
1705 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_in_is_visible() local
1708 if (!(data->have_in & (1 << in))) in nct6775_in_is_visible()
1745 struct nct6775_data *data = nct6775_update_device(dev); in show_fan() local
1749 return sprintf(buf, "%d\n", data->rpm[nr]); in show_fan()
1755 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_min() local
1760 data->fan_from_reg_min(data->fan_min[nr], in show_fan_min()
1761 data->fan_div[nr])); in show_fan_min()
1767 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_div() local
1771 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr])); in show_fan_div()
1778 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_min() local
1790 mutex_lock(&data->update_lock); in store_fan_min()
1791 if (!data->has_fan_div) { in store_fan_min()
1801 data->fan_min[nr] = val; in store_fan_min()
1806 data->fan_min[nr] = 255; in store_fan_min()
1807 new_div = data->fan_div[nr]; /* No change */ in store_fan_min()
1817 data->fan_min[nr] = 254; in store_fan_min()
1821 nr + 1, val, data->fan_from_reg_min(254, 7)); in store_fan_min()
1827 data->fan_min[nr] = 1; in store_fan_min()
1831 nr + 1, val, data->fan_from_reg_min(1, 0)); in store_fan_min()
1843 data->fan_min[nr] = reg; in store_fan_min()
1851 if (new_div != data->fan_div[nr]) { in store_fan_min()
1853 nr + 1, div_from_reg(data->fan_div[nr]), in store_fan_min()
1855 data->fan_div[nr] = new_div; in store_fan_min()
1856 nct6775_write_fan_div_common(data, nr); in store_fan_min()
1858 data->last_updated = jiffies; in store_fan_min()
1862 nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); in store_fan_min()
1863 mutex_unlock(&data->update_lock); in store_fan_min()
1871 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_pulses() local
1873 int p = data->fan_pulses[sattr->index]; in show_fan_pulses()
1882 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_pulses() local
1896 mutex_lock(&data->update_lock); in store_fan_pulses()
1897 data->fan_pulses[nr] = val & 3; in store_fan_pulses()
1898 reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]); in store_fan_pulses()
1899 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]); in store_fan_pulses()
1900 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr]; in store_fan_pulses()
1901 nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg); in store_fan_pulses()
1902 mutex_unlock(&data->update_lock); in store_fan_pulses()
1911 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_fan_is_visible() local
1915 if (!(data->has_fan & (1 << fan))) in nct6775_fan_is_visible()
1918 if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
1920 if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1) in nct6775_fan_is_visible()
1922 if (nr == 4 && !(data->has_fan_min & (1 << fan))) in nct6775_fan_is_visible()
1924 if (nr == 5 && data->kind != nct6775) in nct6775_fan_is_visible()
1965 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_label() local
1969 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]); in show_temp_label()
1975 struct nct6775_data *data = nct6775_update_device(dev); in show_temp() local
1980 return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr])); in show_temp()
1987 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp() local
1998 mutex_lock(&data->update_lock); in store_temp()
1999 data->temp[index][nr] = LM75_TEMP_TO_REG(val); in store_temp()
2000 nct6775_write_temp(data, data->reg_temp[index][nr], in store_temp()
2001 data->temp[index][nr]); in store_temp()
2002 mutex_unlock(&data->update_lock); in store_temp()
2009 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_offset() local
2012 return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000); in show_temp_offset()
2019 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_offset() local
2031 mutex_lock(&data->update_lock); in store_temp_offset()
2032 data->temp_offset[nr] = val; in store_temp_offset()
2033 nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val); in store_temp_offset()
2034 mutex_unlock(&data->update_lock); in store_temp_offset()
2042 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_type() local
2046 return sprintf(buf, "%d\n", (int)data->temp_type[nr]); in show_temp_type()
2053 struct nct6775_data *data = nct6775_update_device(dev); in store_temp_type() local
2067 mutex_lock(&data->update_lock); in store_temp_type()
2069 data->temp_type[nr] = val; in store_temp_type()
2071 dbit = data->DIODE_MASK << nr; in store_temp_type()
2072 vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit; in store_temp_type()
2073 diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit; in store_temp_type()
2085 nct6775_write_value(data, data->REG_VBAT, vbat); in store_temp_type()
2086 nct6775_write_value(data, data->REG_DIODE, diode); in store_temp_type()
2088 mutex_unlock(&data->update_lock); in store_temp_type()
2096 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_temp_is_visible() local
2100 if (!(data->have_temp & (1 << temp))) in nct6775_temp_is_visible()
2103 if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0) in nct6775_temp_is_visible()
2106 if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0) in nct6775_temp_is_visible()
2109 if (nr == 4 && !data->reg_temp[1][temp]) /* max */ in nct6775_temp_is_visible()
2112 if (nr == 5 && !data->reg_temp[2][temp]) /* max_hyst */ in nct6775_temp_is_visible()
2115 if (nr == 6 && !data->reg_temp[3][temp]) /* crit */ in nct6775_temp_is_visible()
2118 if (nr == 7 && !data->reg_temp[4][temp]) /* lcrit */ in nct6775_temp_is_visible()
2122 if (nr > 7 && !(data->have_temp_fixed & (1 << temp))) in nct6775_temp_is_visible()
2174 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_mode() local
2177 return sprintf(buf, "%d\n", !data->pwm_mode[sattr->index]); in show_pwm_mode()
2184 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_mode() local
2199 if (data->REG_PWM_MODE[nr] == 0) { in store_pwm_mode()
2205 mutex_lock(&data->update_lock); in store_pwm_mode()
2206 data->pwm_mode[nr] = val; in store_pwm_mode()
2207 reg = nct6775_read_value(data, data->REG_PWM_MODE[nr]); in store_pwm_mode()
2208 reg &= ~data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2210 reg |= data->PWM_MODE_MASK[nr]; in store_pwm_mode()
2211 nct6775_write_value(data, data->REG_PWM_MODE[nr], reg); in store_pwm_mode()
2212 mutex_unlock(&data->update_lock); in store_pwm_mode()
2219 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm() local
2229 if (index == 0 && data->pwm_enable[nr] > manual) in show_pwm()
2230 pwm = nct6775_read_value(data, data->REG_PWM_READ[nr]); in show_pwm()
2232 pwm = data->pwm[index][nr]; in show_pwm()
2241 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm() local
2246 int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 }; in store_pwm()
2248 = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 }; in store_pwm()
2257 mutex_lock(&data->update_lock); in store_pwm()
2258 data->pwm[index][nr] = val; in store_pwm()
2259 nct6775_write_value(data, data->REG_PWM[index][nr], val); in store_pwm()
2261 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm()
2265 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm()
2267 mutex_unlock(&data->update_lock); in store_pwm()
2272 static int check_trip_points(struct nct6775_data *data, int nr) in check_trip_points() argument
2276 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2277 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
2280 for (i = 0; i < data->auto_pwm_num - 1; i++) { in check_trip_points()
2281 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) in check_trip_points()
2285 if (data->auto_pwm[nr][data->auto_pwm_num]) { in check_trip_points()
2286 if (data->auto_temp[nr][data->auto_pwm_num - 1] > in check_trip_points()
2287 data->auto_temp[nr][data->auto_pwm_num] || in check_trip_points()
2288 data->auto_pwm[nr][data->auto_pwm_num - 1] > in check_trip_points()
2289 data->auto_pwm[nr][data->auto_pwm_num]) in check_trip_points()
2295 static void pwm_update_registers(struct nct6775_data *data, int nr) in pwm_update_registers() argument
2299 switch (data->pwm_enable[nr]) { in pwm_update_registers()
2304 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2305 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2306 (data->target_speed_tolerance[nr] & data->tolerance_mask); in pwm_update_registers()
2307 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2308 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2309 data->target_speed[nr] & 0xff); in pwm_update_registers()
2310 if (data->REG_TOLERANCE_H) { in pwm_update_registers()
2311 reg = (data->target_speed[nr] >> 8) & 0x0f; in pwm_update_registers()
2312 reg |= (data->target_speed_tolerance[nr] & 0x38) << 1; in pwm_update_registers()
2313 nct6775_write_value(data, in pwm_update_registers()
2314 data->REG_TOLERANCE_H[nr], in pwm_update_registers()
2319 nct6775_write_value(data, data->REG_TARGET[nr], in pwm_update_registers()
2320 data->target_temp[nr]); in pwm_update_registers()
2323 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in pwm_update_registers()
2324 reg = (reg & ~data->tolerance_mask) | in pwm_update_registers()
2325 data->temp_tolerance[0][nr]; in pwm_update_registers()
2326 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in pwm_update_registers()
2334 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_enable() local
2337 return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]); in show_pwm_enable()
2344 struct nct6775_data *data = dev_get_drvdata(dev); in store_pwm_enable() local
2358 if (val == sf3 && data->kind != nct6775) in store_pwm_enable()
2361 if (val == sf4 && check_trip_points(data, nr)) { in store_pwm_enable()
2367 mutex_lock(&data->update_lock); in store_pwm_enable()
2368 data->pwm_enable[nr] = val; in store_pwm_enable()
2373 data->pwm[0][nr] = 255; in store_pwm_enable()
2374 nct6775_write_value(data, data->REG_PWM[0][nr], 255); in store_pwm_enable()
2376 pwm_update_registers(data, nr); in store_pwm_enable()
2377 reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); in store_pwm_enable()
2380 nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); in store_pwm_enable()
2381 mutex_unlock(&data->update_lock); in store_pwm_enable()
2386 show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src) in show_pwm_temp_sel_common() argument
2391 if (!(data->have_temp & (1 << i))) in show_pwm_temp_sel_common()
2393 if (src == data->temp_src[i]) { in show_pwm_temp_sel_common()
2405 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_temp_sel() local
2409 return show_pwm_temp_sel_common(data, buf, data->pwm_temp_sel[index]); in show_pwm_temp_sel()
2416 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_temp_sel() local
2427 if (!(data->have_temp & (1 << (val - 1))) || !data->temp_src[val - 1]) in store_pwm_temp_sel()
2430 mutex_lock(&data->update_lock); in store_pwm_temp_sel()
2431 src = data->temp_src[val - 1]; in store_pwm_temp_sel()
2432 data->pwm_temp_sel[nr] = src; in store_pwm_temp_sel()
2433 reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); in store_pwm_temp_sel()
2436 nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); in store_pwm_temp_sel()
2437 mutex_unlock(&data->update_lock); in store_pwm_temp_sel()
2446 struct nct6775_data *data = nct6775_update_device(dev); in show_pwm_weight_temp_sel() local
2450 return show_pwm_temp_sel_common(data, buf, in show_pwm_weight_temp_sel()
2451 data->pwm_weight_temp_sel[index]); in show_pwm_weight_temp_sel()
2458 struct nct6775_data *data = nct6775_update_device(dev); in store_pwm_weight_temp_sel() local
2469 if (val && (!(data->have_temp & (1 << (val - 1))) || in store_pwm_weight_temp_sel()
2470 !data->temp_src[val - 1])) in store_pwm_weight_temp_sel()
2473 mutex_lock(&data->update_lock); in store_pwm_weight_temp_sel()
2475 src = data->temp_src[val - 1]; in store_pwm_weight_temp_sel()
2476 data->pwm_weight_temp_sel[nr] = src; in store_pwm_weight_temp_sel()
2477 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2480 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2482 data->pwm_weight_temp_sel[nr] = 0; in store_pwm_weight_temp_sel()
2483 reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); in store_pwm_weight_temp_sel()
2485 nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); in store_pwm_weight_temp_sel()
2487 mutex_unlock(&data->update_lock); in store_pwm_weight_temp_sel()
2495 struct nct6775_data *data = nct6775_update_device(dev); in show_target_temp() local
2498 return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000); in show_target_temp()
2505 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_temp() local
2516 data->target_temp_mask); in store_target_temp()
2518 mutex_lock(&data->update_lock); in store_target_temp()
2519 data->target_temp[nr] = val; in store_target_temp()
2520 pwm_update_registers(data, nr); in store_target_temp()
2521 mutex_unlock(&data->update_lock); in store_target_temp()
2528 struct nct6775_data *data = nct6775_update_device(dev); in show_target_speed() local
2533 fan_from_reg16(data->target_speed[nr], in show_target_speed()
2534 data->fan_div[nr])); in show_target_speed()
2541 struct nct6775_data *data = dev_get_drvdata(dev); in store_target_speed() local
2553 speed = fan_to_reg(val, data->fan_div[nr]); in store_target_speed()
2555 mutex_lock(&data->update_lock); in store_target_speed()
2556 data->target_speed[nr] = speed; in store_target_speed()
2557 pwm_update_registers(data, nr); in store_target_speed()
2558 mutex_unlock(&data->update_lock); in store_target_speed()
2566 struct nct6775_data *data = nct6775_update_device(dev); in show_temp_tolerance() local
2571 return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000); in show_temp_tolerance()
2578 struct nct6775_data *data = dev_get_drvdata(dev); in store_temp_tolerance() local
2590 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask); in store_temp_tolerance()
2592 mutex_lock(&data->update_lock); in store_temp_tolerance()
2593 data->temp_tolerance[index][nr] = val; in store_temp_tolerance()
2595 pwm_update_registers(data, nr); in store_temp_tolerance()
2597 nct6775_write_value(data, in store_temp_tolerance()
2598 data->REG_CRITICAL_TEMP_TOLERANCE[nr], in store_temp_tolerance()
2600 mutex_unlock(&data->update_lock); in store_temp_tolerance()
2613 struct nct6775_data *data = nct6775_update_device(dev); in show_speed_tolerance() local
2616 int low = data->target_speed[nr] - data->target_speed_tolerance[nr]; in show_speed_tolerance()
2617 int high = data->target_speed[nr] + data->target_speed_tolerance[nr]; in show_speed_tolerance()
2627 tolerance = (fan_from_reg16(low, data->fan_div[nr]) in show_speed_tolerance()
2628 - fan_from_reg16(high, data->fan_div[nr])) / 2; in show_speed_tolerance()
2637 struct nct6775_data *data = dev_get_drvdata(dev); in store_speed_tolerance() local
2648 high = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
2649 data->fan_div[nr]) + val; in store_speed_tolerance()
2650 low = fan_from_reg16(data->target_speed[nr], in store_speed_tolerance()
2651 data->fan_div[nr]) - val; in store_speed_tolerance()
2657 val = (fan_to_reg(low, data->fan_div[nr]) - in store_speed_tolerance()
2658 fan_to_reg(high, data->fan_div[nr])) / 2; in store_speed_tolerance()
2661 val = clamp_val(val, 0, data->speed_tolerance_limit); in store_speed_tolerance()
2663 mutex_lock(&data->update_lock); in store_speed_tolerance()
2664 data->target_speed_tolerance[nr] = val; in store_speed_tolerance()
2665 pwm_update_registers(data, nr); in store_speed_tolerance()
2666 mutex_unlock(&data->update_lock); in store_speed_tolerance()
2689 struct nct6775_data *data = nct6775_update_device(dev); in show_weight_temp() local
2694 return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000); in show_weight_temp()
2701 struct nct6775_data *data = dev_get_drvdata(dev); in store_weight_temp() local
2714 mutex_lock(&data->update_lock); in store_weight_temp()
2715 data->weight_temp[index][nr] = val; in store_weight_temp()
2716 nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); in store_weight_temp()
2717 mutex_unlock(&data->update_lock); in store_weight_temp()
2737 struct nct6775_data *data = nct6775_update_device(dev); in show_fan_time() local
2743 step_time_from_reg(data->fan_time[index][nr], in show_fan_time()
2744 data->pwm_mode[nr])); in show_fan_time()
2751 struct nct6775_data *data = dev_get_drvdata(dev); in store_fan_time() local
2762 val = step_time_to_reg(val, data->pwm_mode[nr]); in store_fan_time()
2763 mutex_lock(&data->update_lock); in store_fan_time()
2764 data->fan_time[index][nr] = val; in store_fan_time()
2765 nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val); in store_fan_time()
2766 mutex_unlock(&data->update_lock); in store_fan_time()
2773 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_pwm() local
2776 return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]); in show_auto_pwm()
2783 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_pwm() local
2797 if (point == data->auto_pwm_num) { in store_auto_pwm()
2798 if (data->kind != nct6775 && !val) in store_auto_pwm()
2800 if (data->kind != nct6779 && val) in store_auto_pwm()
2804 mutex_lock(&data->update_lock); in store_auto_pwm()
2805 data->auto_pwm[nr][point] = val; in store_auto_pwm()
2806 if (point < data->auto_pwm_num) { in store_auto_pwm()
2807 nct6775_write_value(data, in store_auto_pwm()
2808 NCT6775_AUTO_PWM(data, nr, point), in store_auto_pwm()
2809 data->auto_pwm[nr][point]); in store_auto_pwm()
2811 switch (data->kind) { in store_auto_pwm()
2814 reg = nct6775_read_value(data, in store_auto_pwm()
2820 nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], in store_auto_pwm()
2829 nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], in store_auto_pwm()
2831 reg = nct6775_read_value(data, in store_auto_pwm()
2832 data->REG_CRITICAL_PWM_ENABLE[nr]); in store_auto_pwm()
2834 reg &= ~data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
2836 reg |= data->CRITICAL_PWM_ENABLE_MASK; in store_auto_pwm()
2837 nct6775_write_value(data, in store_auto_pwm()
2838 data->REG_CRITICAL_PWM_ENABLE[nr], in store_auto_pwm()
2843 mutex_unlock(&data->update_lock); in store_auto_pwm()
2850 struct nct6775_data *data = nct6775_update_device(dev); in show_auto_temp() local
2859 return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000); in show_auto_temp()
2866 struct nct6775_data *data = dev_get_drvdata(dev); in store_auto_temp() local
2879 mutex_lock(&data->update_lock); in store_auto_temp()
2880 data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000); in store_auto_temp()
2881 if (point < data->auto_pwm_num) { in store_auto_temp()
2882 nct6775_write_value(data, in store_auto_temp()
2883 NCT6775_AUTO_TEMP(data, nr, point), in store_auto_temp()
2884 data->auto_temp[nr][point]); in store_auto_temp()
2886 nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr], in store_auto_temp()
2887 data->auto_temp[nr][point]); in store_auto_temp()
2889 mutex_unlock(&data->update_lock); in store_auto_temp()
2897 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_pwm_is_visible() local
2901 if (!(data->has_pwm & (1 << pwm))) in nct6775_pwm_is_visible()
2905 if (!data->REG_WEIGHT_TEMP_SEL[pwm]) in nct6775_pwm_is_visible()
2907 if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */ in nct6775_pwm_is_visible()
2909 if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */ in nct6775_pwm_is_visible()
2911 if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */ in nct6775_pwm_is_visible()
2917 if (api > data->auto_pwm_num) in nct6775_pwm_is_visible()
3035 struct nct6775_data *data = dev_get_drvdata(dev); in show_vid() local
3037 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in show_vid()
3048 struct nct6775_data *data = dev_get_drvdata(dev); in clear_caseopen() local
3057 mutex_lock(&data->update_lock); in clear_caseopen()
3064 ret = superio_enter(data->sioreg); in clear_caseopen()
3070 superio_select(data->sioreg, NCT6775_LD_ACPI); in clear_caseopen()
3071 reg = superio_inb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]); in clear_caseopen()
3073 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3075 superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); in clear_caseopen()
3076 superio_exit(data->sioreg); in clear_caseopen()
3078 data->valid = false; /* Force cache refresh */ in clear_caseopen()
3080 mutex_unlock(&data->update_lock); in clear_caseopen()
3099 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_other_is_visible() local
3101 if (index == 0 && !data->have_vid) in nct6775_other_is_visible()
3105 if (data->ALARM_BITS[INTRUSION_ALARM_BASE + index - 1] < 0) in nct6775_other_is_visible()
3110 if (data->BEEP_BITS[INTRUSION_ALARM_BASE + index - 3] < 0) in nct6775_other_is_visible()
3138 static inline void nct6775_init_device(struct nct6775_data *data) in nct6775_init_device() argument
3144 if (data->REG_CONFIG) { in nct6775_init_device()
3145 tmp = nct6775_read_value(data, data->REG_CONFIG); in nct6775_init_device()
3147 nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01); in nct6775_init_device()
3152 if (!(data->have_temp & (1 << i))) in nct6775_init_device()
3154 if (!data->reg_temp_config[i]) in nct6775_init_device()
3156 tmp = nct6775_read_value(data, data->reg_temp_config[i]); in nct6775_init_device()
3158 nct6775_write_value(data, data->reg_temp_config[i], in nct6775_init_device()
3163 tmp = nct6775_read_value(data, data->REG_VBAT); in nct6775_init_device()
3165 nct6775_write_value(data, data->REG_VBAT, tmp | 0x01); in nct6775_init_device()
3167 diode = nct6775_read_value(data, data->REG_DIODE); in nct6775_init_device()
3169 for (i = 0; i < data->temp_fixed_num; i++) { in nct6775_init_device()
3170 if (!(data->have_temp_fixed & (1 << i))) in nct6775_init_device()
3172 if ((tmp & (data->DIODE_MASK << i))) /* diode */ in nct6775_init_device()
3173 data->temp_type[i] in nct6775_init_device()
3174 = 3 - ((diode >> i) & data->DIODE_MASK); in nct6775_init_device()
3176 data->temp_type[i] = 4; in nct6775_init_device()
3181 nct6775_check_fan_inputs(struct nct6775_data *data) in nct6775_check_fan_inputs() argument
3185 int sioreg = data->sioreg; in nct6775_check_fan_inputs()
3190 data->sio_reg_enable = superio_inb(sioreg, SIO_REG_ENABLE); in nct6775_check_fan_inputs()
3193 if (data->kind == nct6775) { in nct6775_check_fan_inputs()
3207 } else if (data->kind == nct6776) { in nct6775_check_fan_inputs()
3222 if ((data->sio_reg_enable & 0xe0) != 0xe0) { in nct6775_check_fan_inputs()
3223 data->sio_reg_enable |= 0xe0; in nct6775_check_fan_inputs()
3225 data->sio_reg_enable); in nct6775_check_fan_inputs()
3230 if (data->sio_reg_enable & 0x80) in nct6775_check_fan_inputs()
3235 if (data->sio_reg_enable & 0x40) in nct6775_check_fan_inputs()
3240 if (data->sio_reg_enable & 0x20) in nct6775_check_fan_inputs()
3251 } else if (data->kind == nct6106) { in nct6775_check_fan_inputs()
3276 if (data->kind == nct6791 || data->kind == nct6792) { in nct6775_check_fan_inputs()
3287 data->has_fan = 0x03 | (fan3pin << 2) | (fan4pin << 3) | in nct6775_check_fan_inputs()
3289 data->has_fan_min = 0x03 | (fan3pin << 2) | (fan4min << 3) | in nct6775_check_fan_inputs()
3291 data->has_pwm = 0x03 | (pwm3pin << 2) | (pwm4pin << 3) | in nct6775_check_fan_inputs()
3295 static void add_temp_sensors(struct nct6775_data *data, const u16 *regp, in add_temp_sensors() argument
3301 for (i = 0; i < data->pwm_num && *available; i++) { in add_temp_sensors()
3306 src = nct6775_read_value(data, regp[i]); in add_temp_sensors()
3310 if (src >= data->temp_label_num || in add_temp_sensors()
3311 !strlen(data->temp_label[src])) in add_temp_sensors()
3315 nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src); in add_temp_sensors()
3325 struct nct6775_data *data; in nct6775_probe() local
3343 data = devm_kzalloc(&pdev->dev, sizeof(struct nct6775_data), in nct6775_probe()
3345 if (!data) in nct6775_probe()
3348 data->kind = sio_data->kind; in nct6775_probe()
3349 data->sioreg = sio_data->sioreg; in nct6775_probe()
3350 data->addr = res->start; in nct6775_probe()
3351 mutex_init(&data->update_lock); in nct6775_probe()
3352 data->name = nct6775_device_names[data->kind]; in nct6775_probe()
3353 data->bank = 0xff; /* Force initial bank selection */ in nct6775_probe()
3354 platform_set_drvdata(pdev, data); in nct6775_probe()
3356 switch (data->kind) { in nct6775_probe()
3358 data->in_num = 9; in nct6775_probe()
3359 data->pwm_num = 3; in nct6775_probe()
3360 data->auto_pwm_num = 4; in nct6775_probe()
3361 data->temp_fixed_num = 3; in nct6775_probe()
3362 data->num_temp_alarms = 6; in nct6775_probe()
3363 data->num_temp_beeps = 6; in nct6775_probe()
3365 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3366 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3368 data->temp_label = nct6776_temp_label; in nct6775_probe()
3369 data->temp_label_num = ARRAY_SIZE(nct6776_temp_label); in nct6775_probe()
3371 data->REG_VBAT = NCT6106_REG_VBAT; in nct6775_probe()
3372 data->REG_DIODE = NCT6106_REG_DIODE; in nct6775_probe()
3373 data->DIODE_MASK = NCT6106_DIODE_MASK; in nct6775_probe()
3374 data->REG_VIN = NCT6106_REG_IN; in nct6775_probe()
3375 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; in nct6775_probe()
3376 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; in nct6775_probe()
3377 data->REG_TARGET = NCT6106_REG_TARGET; in nct6775_probe()
3378 data->REG_FAN = NCT6106_REG_FAN; in nct6775_probe()
3379 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE; in nct6775_probe()
3380 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN; in nct6775_probe()
3381 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES; in nct6775_probe()
3382 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT; in nct6775_probe()
3383 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME; in nct6775_probe()
3384 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3385 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3386 data->REG_PWM[0] = NCT6106_REG_PWM; in nct6775_probe()
3387 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; in nct6775_probe()
3388 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3389 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3390 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3391 data->REG_PWM_READ = NCT6106_REG_PWM_READ; in nct6775_probe()
3392 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; in nct6775_probe()
3393 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; in nct6775_probe()
3394 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP; in nct6775_probe()
3395 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM; in nct6775_probe()
3396 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP; in nct6775_probe()
3397 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3399 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3400 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3402 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM; in nct6775_probe()
3403 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; in nct6775_probe()
3404 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE; in nct6775_probe()
3405 data->REG_TEMP_SEL = NCT6106_REG_TEMP_SEL; in nct6775_probe()
3406 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3407 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3408 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3409 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3410 data->REG_ALARM = NCT6106_REG_ALARM; in nct6775_probe()
3411 data->ALARM_BITS = NCT6106_ALARM_BITS; in nct6775_probe()
3412 data->REG_BEEP = NCT6106_REG_BEEP; in nct6775_probe()
3413 data->BEEP_BITS = NCT6106_BEEP_BITS; in nct6775_probe()
3429 data->in_num = 9; in nct6775_probe()
3430 data->pwm_num = 3; in nct6775_probe()
3431 data->auto_pwm_num = 6; in nct6775_probe()
3432 data->has_fan_div = true; in nct6775_probe()
3433 data->temp_fixed_num = 3; in nct6775_probe()
3434 data->num_temp_alarms = 3; in nct6775_probe()
3435 data->num_temp_beeps = 3; in nct6775_probe()
3437 data->ALARM_BITS = NCT6775_ALARM_BITS; in nct6775_probe()
3438 data->BEEP_BITS = NCT6775_BEEP_BITS; in nct6775_probe()
3440 data->fan_from_reg = fan_from_reg16; in nct6775_probe()
3441 data->fan_from_reg_min = fan_from_reg8; in nct6775_probe()
3442 data->target_temp_mask = 0x7f; in nct6775_probe()
3443 data->tolerance_mask = 0x0f; in nct6775_probe()
3444 data->speed_tolerance_limit = 15; in nct6775_probe()
3446 data->temp_label = nct6775_temp_label; in nct6775_probe()
3447 data->temp_label_num = ARRAY_SIZE(nct6775_temp_label); in nct6775_probe()
3449 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3450 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3451 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3452 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3453 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3454 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3455 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3456 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3457 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3458 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3459 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN; in nct6775_probe()
3460 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES; in nct6775_probe()
3461 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3462 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3463 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3464 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3465 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3466 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3467 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3468 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT; in nct6775_probe()
3469 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT; in nct6775_probe()
3470 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3471 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3472 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE; in nct6775_probe()
3473 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK; in nct6775_probe()
3474 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3475 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3476 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3477 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3479 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3480 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3481 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3482 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3483 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3484 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3485 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3486 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3487 data->REG_BEEP = NCT6775_REG_BEEP; in nct6775_probe()
3501 data->in_num = 9; in nct6775_probe()
3502 data->pwm_num = 3; in nct6775_probe()
3503 data->auto_pwm_num = 4; in nct6775_probe()
3504 data->has_fan_div = false; in nct6775_probe()
3505 data->temp_fixed_num = 3; in nct6775_probe()
3506 data->num_temp_alarms = 3; in nct6775_probe()
3507 data->num_temp_beeps = 6; in nct6775_probe()
3509 data->ALARM_BITS = NCT6776_ALARM_BITS; in nct6775_probe()
3510 data->BEEP_BITS = NCT6776_BEEP_BITS; in nct6775_probe()
3512 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3513 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3514 data->target_temp_mask = 0xff; in nct6775_probe()
3515 data->tolerance_mask = 0x07; in nct6775_probe()
3516 data->speed_tolerance_limit = 63; in nct6775_probe()
3518 data->temp_label = nct6776_temp_label; in nct6775_probe()
3519 data->temp_label_num = ARRAY_SIZE(nct6776_temp_label); in nct6775_probe()
3521 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3522 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3523 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3524 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3525 data->REG_VIN = NCT6775_REG_IN; in nct6775_probe()
3526 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3527 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3528 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3529 data->REG_FAN = NCT6775_REG_FAN; in nct6775_probe()
3530 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3531 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3532 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES; in nct6775_probe()
3533 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3534 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3535 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3536 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3537 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3538 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3539 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3540 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3541 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3542 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3543 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3544 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3545 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3546 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3547 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3548 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3549 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3551 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET; in nct6775_probe()
3552 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3553 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3554 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3555 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3556 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3557 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3558 data->REG_ALARM = NCT6775_REG_ALARM; in nct6775_probe()
3559 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3573 data->in_num = 15; in nct6775_probe()
3574 data->pwm_num = 5; in nct6775_probe()
3575 data->auto_pwm_num = 4; in nct6775_probe()
3576 data->has_fan_div = false; in nct6775_probe()
3577 data->temp_fixed_num = 6; in nct6775_probe()
3578 data->num_temp_alarms = 2; in nct6775_probe()
3579 data->num_temp_beeps = 2; in nct6775_probe()
3581 data->ALARM_BITS = NCT6779_ALARM_BITS; in nct6775_probe()
3582 data->BEEP_BITS = NCT6779_BEEP_BITS; in nct6775_probe()
3584 data->fan_from_reg = fan_from_reg13; in nct6775_probe()
3585 data->fan_from_reg_min = fan_from_reg13; in nct6775_probe()
3586 data->target_temp_mask = 0xff; in nct6775_probe()
3587 data->tolerance_mask = 0x07; in nct6775_probe()
3588 data->speed_tolerance_limit = 63; in nct6775_probe()
3590 data->temp_label = nct6779_temp_label; in nct6775_probe()
3591 data->temp_label_num = ARRAY_SIZE(nct6779_temp_label); in nct6775_probe()
3593 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3594 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3595 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3596 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3597 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3598 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3599 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3600 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3601 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3602 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3603 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3604 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3605 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3606 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3607 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3608 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3609 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3610 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3611 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3612 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3613 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3614 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3615 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3616 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3617 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3618 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3619 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3620 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3621 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3623 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3624 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3626 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3627 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3628 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3629 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3630 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3631 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3632 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3633 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3634 data->REG_ALARM = NCT6779_REG_ALARM; in nct6775_probe()
3635 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3650 data->in_num = 15; in nct6775_probe()
3651 data->pwm_num = 6; 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 = 6; in nct6775_probe()
3655 data->num_temp_alarms = 2; in nct6775_probe()
3656 data->num_temp_beeps = 2; in nct6775_probe()
3658 data->ALARM_BITS = NCT6791_ALARM_BITS; in nct6775_probe()
3659 data->BEEP_BITS = NCT6779_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 = nct6779_temp_label; in nct6775_probe()
3668 data->temp_label_num = ARRAY_SIZE(nct6779_temp_label); in nct6775_probe()
3670 data->REG_CONFIG = NCT6775_REG_CONFIG; in nct6775_probe()
3671 data->REG_VBAT = NCT6775_REG_VBAT; in nct6775_probe()
3672 data->REG_DIODE = NCT6775_REG_DIODE; in nct6775_probe()
3673 data->DIODE_MASK = NCT6775_DIODE_MASK; in nct6775_probe()
3674 data->REG_VIN = NCT6779_REG_IN; in nct6775_probe()
3675 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN; in nct6775_probe()
3676 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX; in nct6775_probe()
3677 data->REG_TARGET = NCT6775_REG_TARGET; in nct6775_probe()
3678 data->REG_FAN = NCT6779_REG_FAN; in nct6775_probe()
3679 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE; in nct6775_probe()
3680 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN; in nct6775_probe()
3681 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES; in nct6775_probe()
3682 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT; in nct6775_probe()
3683 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME; in nct6775_probe()
3684 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME; in nct6775_probe()
3685 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME; in nct6775_probe()
3686 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H; in nct6775_probe()
3687 data->REG_PWM[0] = NCT6775_REG_PWM; in nct6775_probe()
3688 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT; in nct6775_probe()
3689 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT; in nct6775_probe()
3690 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP; in nct6775_probe()
3691 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE; in nct6775_probe()
3692 data->REG_PWM_READ = NCT6775_REG_PWM_READ; in nct6775_probe()
3693 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE; in nct6775_probe()
3694 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK; in nct6775_probe()
3695 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP; in nct6775_probe()
3696 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM; in nct6775_probe()
3697 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP; in nct6775_probe()
3698 data->REG_CRITICAL_TEMP_TOLERANCE in nct6775_probe()
3700 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE; in nct6775_probe()
3701 data->CRITICAL_PWM_ENABLE_MASK in nct6775_probe()
3703 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM; in nct6775_probe()
3704 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET; in nct6775_probe()
3705 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE; in nct6775_probe()
3706 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL; in nct6775_probe()
3707 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL; in nct6775_probe()
3708 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP; in nct6775_probe()
3709 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL; in nct6775_probe()
3710 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE; in nct6775_probe()
3711 data->REG_ALARM = NCT6791_REG_ALARM; in nct6775_probe()
3712 if (data->kind == nct6791) in nct6775_probe()
3713 data->REG_BEEP = NCT6776_REG_BEEP; in nct6775_probe()
3715 data->REG_BEEP = NCT6792_REG_BEEP; in nct6775_probe()
3719 if (data->kind == nct6791) { in nct6775_probe()
3736 data->have_in = (1 << data->in_num) - 1; in nct6775_probe()
3737 data->have_temp = 0; in nct6775_probe()
3753 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
3764 add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask); in nct6775_probe()
3765 add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask); in nct6775_probe()
3773 src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; in nct6775_probe()
3777 if (src >= data->temp_label_num || in nct6775_probe()
3778 !strlen(data->temp_label[src])) { in nct6775_probe()
3781 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]); in nct6775_probe()
3788 if (src <= data->temp_fixed_num) { in nct6775_probe()
3789 data->have_temp |= 1 << (src - 1); in nct6775_probe()
3790 data->have_temp_fixed |= 1 << (src - 1); in nct6775_probe()
3791 data->reg_temp[0][src - 1] = reg_temp[i]; in nct6775_probe()
3792 data->reg_temp[1][src - 1] = reg_temp_over[i]; in nct6775_probe()
3793 data->reg_temp[2][src - 1] = reg_temp_hyst[i]; in nct6775_probe()
3795 data->reg_temp[3][src - 1] = reg_temp_crit_h[i]; in nct6775_probe()
3797 data->reg_temp[3][src - 1] in nct6775_probe()
3800 data->reg_temp[4][src - 1] = reg_temp_crit_l[i]; in nct6775_probe()
3801 data->reg_temp_config[src - 1] = reg_temp_config[i]; in nct6775_probe()
3802 data->temp_src[src - 1] = src; in nct6775_probe()
3810 data->have_temp |= 1 << s; in nct6775_probe()
3811 data->reg_temp[0][s] = reg_temp[i]; in nct6775_probe()
3812 data->reg_temp[1][s] = reg_temp_over[i]; in nct6775_probe()
3813 data->reg_temp[2][s] = reg_temp_hyst[i]; in nct6775_probe()
3814 data->reg_temp_config[s] = reg_temp_config[i]; in nct6775_probe()
3816 data->reg_temp[3][s] = reg_temp_crit_h[i]; in nct6775_probe()
3818 data->reg_temp[3][s] = reg_temp_crit[src - 1]; in nct6775_probe()
3820 data->reg_temp[4][s] = reg_temp_crit_l[i]; in nct6775_probe()
3822 data->temp_src[s] = src; in nct6775_probe()
3834 src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; in nct6775_probe()
3838 if (src >= data->temp_label_num || in nct6775_probe()
3839 !strlen(data->temp_label[src])) { in nct6775_probe()
3842 src, i, data->REG_TEMP_SEL[i], in nct6775_probe()
3850 if (src <= data->temp_fixed_num) { in nct6775_probe()
3851 if (data->have_temp & (1 << (src - 1))) in nct6775_probe()
3853 data->have_temp |= 1 << (src - 1); in nct6775_probe()
3854 data->have_temp_fixed |= 1 << (src - 1); in nct6775_probe()
3855 data->reg_temp[0][src - 1] = reg_temp_mon[i]; in nct6775_probe()
3856 data->temp_src[src - 1] = src; in nct6775_probe()
3864 data->have_temp |= 1 << s; in nct6775_probe()
3865 data->reg_temp[0][s] = reg_temp_mon[i]; in nct6775_probe()
3866 data->temp_src[s] = src; in nct6775_probe()
3877 for (i = 0; i < data->temp_label_num - 1; i++) { in nct6775_probe()
3882 if (i < data->temp_fixed_num) { in nct6775_probe()
3883 if (data->have_temp & (1 << i)) in nct6775_probe()
3885 data->have_temp |= 1 << i; in nct6775_probe()
3886 data->have_temp_fixed |= 1 << i; in nct6775_probe()
3887 data->reg_temp[0][i] = reg_temp_alternate[i]; in nct6775_probe()
3889 data->reg_temp[1][i] = reg_temp_over[i]; in nct6775_probe()
3890 data->reg_temp[2][i] = reg_temp_hyst[i]; in nct6775_probe()
3892 data->temp_src[i] = i + 1; in nct6775_probe()
3899 data->have_temp |= 1 << s; in nct6775_probe()
3900 data->reg_temp[0][s] = reg_temp_alternate[i]; in nct6775_probe()
3901 data->temp_src[s] = i + 1; in nct6775_probe()
3907 nct6775_init_device(data); in nct6775_probe()
3914 switch (data->kind) { in nct6775_probe()
3916 data->have_vid = (cr2a & 0x40); in nct6775_probe()
3919 data->have_vid = (cr2a & 0x60) == 0x40; in nct6775_probe()
3932 if (data->have_vid) { in nct6775_probe()
3934 data->vid = superio_inb(sio_data->sioreg, 0xe3); in nct6775_probe()
3935 data->vrm = vid_which_vrm(); in nct6775_probe()
3944 switch (data->kind) { in nct6775_probe()
3963 data->name); in nct6775_probe()
3966 nct6775_check_fan_inputs(data); in nct6775_probe()
3971 nct6775_init_fan_common(dev, data); in nct6775_probe()
3975 data->pwm_num); in nct6775_probe()
3979 data->groups[num_attr_groups++] = group; in nct6775_probe()
3982 fls(data->have_in)); in nct6775_probe()
3986 data->groups[num_attr_groups++] = group; in nct6775_probe()
3989 fls(data->has_fan)); in nct6775_probe()
3993 data->groups[num_attr_groups++] = group; in nct6775_probe()
3996 fls(data->have_temp)); in nct6775_probe()
4000 data->groups[num_attr_groups++] = group; in nct6775_probe()
4001 data->groups[num_attr_groups++] = &nct6775_group_other; in nct6775_probe()
4003 hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name, in nct6775_probe()
4004 data, data->groups); in nct6775_probe()
4022 struct nct6775_data *data = nct6775_update_device(dev); in nct6775_suspend() local
4024 mutex_lock(&data->update_lock); in nct6775_suspend()
4025 data->vbat = nct6775_read_value(data, data->REG_VBAT); in nct6775_suspend()
4026 if (data->kind == nct6775) { in nct6775_suspend()
4027 data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1); in nct6775_suspend()
4028 data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2); in nct6775_suspend()
4030 mutex_unlock(&data->update_lock); in nct6775_suspend()
4037 struct nct6775_data *data = dev_get_drvdata(dev); in nct6775_resume() local
4038 int sioreg = data->sioreg; in nct6775_resume()
4042 mutex_lock(&data->update_lock); in nct6775_resume()
4043 data->bank = 0xff; /* Force initial bank selection */ in nct6775_resume()
4051 if (reg != data->sio_reg_enable) in nct6775_resume()
4052 superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable); in nct6775_resume()
4054 if (data->kind == nct6791 || data->kind == nct6792) in nct6775_resume()
4060 for (i = 0; i < data->in_num; i++) { in nct6775_resume()
4061 if (!(data->have_in & (1 << i))) in nct6775_resume()
4064 nct6775_write_value(data, data->REG_IN_MINMAX[0][i], in nct6775_resume()
4065 data->in[i][1]); in nct6775_resume()
4066 nct6775_write_value(data, data->REG_IN_MINMAX[1][i], in nct6775_resume()
4067 data->in[i][2]); in nct6775_resume()
4070 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { in nct6775_resume()
4071 if (!(data->has_fan_min & (1 << i))) in nct6775_resume()
4074 nct6775_write_value(data, data->REG_FAN_MIN[i], in nct6775_resume()
4075 data->fan_min[i]); in nct6775_resume()
4079 if (!(data->have_temp & (1 << i))) in nct6775_resume()
4082 for (j = 1; j < ARRAY_SIZE(data->reg_temp); j++) in nct6775_resume()
4083 if (data->reg_temp[j][i]) in nct6775_resume()
4084 nct6775_write_temp(data, data->reg_temp[j][i], in nct6775_resume()
4085 data->temp[j][i]); in nct6775_resume()
4089 nct6775_write_value(data, data->REG_VBAT, data->vbat); in nct6775_resume()
4090 if (data->kind == nct6775) { in nct6775_resume()
4091 nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); in nct6775_resume()
4092 nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); in nct6775_resume()
4097 data->valid = false; in nct6775_resume()
4098 mutex_unlock(&data->update_lock); in nct6775_resume()