Lines Matching +full:3 +full:- +full:channel
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * w83627ehf - Driver for the hardware monitoring functionality of
4 * the Winbond W83627EHF Super-I/O chip
5 * Copyright (C) 2005-2012 Jean Delvare <jdelvare@suse.de>
10 * Copyright (C) 2010 Sheng-Yuan Huang (Nuvoton) (PS00)
18 * This driver also supports the W83627EHG, which is the lead-free
24 * w83627ehf 10 5 4 3 0x8850 0x88 0x5ca3
26 * w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3
27 * w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3
28 * w83627uhg 8 2 2 3 0xa230 0xc1 0x5ca3
29 * w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3
30 * w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3
41 #include <linux/hwmon-sysfs.h>
42 #include <linux/hwmon-vid.h>
54 /* used to set data->name = w83627ehf_device_names[data->sio_kind] */
71 * Super-I/O constants and functions
119 return -EBUSY; in superio_enter()
162 (0x554 + (((nr) - 7) * 2)))
164 (0x555 + (((nr) - 7) * 2)))
166 (0x550 + (nr) - 7))
185 #define W83627EHF_REG_CASEOPEN_CLR 0x46 /* SMI MASK #3 */
230 "PECI Agent 3",
337 u8 temp_type[3];
338 s8 temp_offset[3];
345 u8 pwm_mode[4]; /* 0->DC variable voltage, 1->PWM variable duty cycle */
346 u8 pwm_enable[4]; /* 1->manual
347 * 2->thermal cruise mode (also called SmartFan I)
348 * 3->fan speed cruise mode
349 * 4->variable thermal cruise (also called
351 * 5->enhanced variable thermal cruise (also called
389 * On older chips, only registers 0x50-0x5f are banked.
397 if (data->bank != bank) { in w83627ehf_set_bank()
398 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET); in w83627ehf_set_bank()
399 outb_p(bank, data->addr + DATA_REG_OFFSET); in w83627ehf_set_bank()
400 data->bank = bank; in w83627ehf_set_bank()
408 mutex_lock(&data->lock); in w83627ehf_read_value()
411 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in w83627ehf_read_value()
412 res = inb_p(data->addr + DATA_REG_OFFSET); in w83627ehf_read_value()
415 data->addr + ADDR_REG_OFFSET); in w83627ehf_read_value()
416 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET); in w83627ehf_read_value()
419 mutex_unlock(&data->lock); in w83627ehf_read_value()
428 mutex_lock(&data->lock); in w83627ehf_write_value()
431 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET); in w83627ehf_write_value()
433 outb_p(value >> 8, data->addr + DATA_REG_OFFSET); in w83627ehf_write_value()
435 data->addr + ADDR_REG_OFFSET); in w83627ehf_write_value()
437 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); in w83627ehf_write_value()
439 mutex_unlock(&data->lock); in w83627ehf_write_value()
443 /* We left-align 8-bit temperature values to make the code simpler */
463 /* This function assumes that the caller holds data->update_lock */
471 | ((data->fan_div[0] & 0x03) << 4); in w83627ehf_write_fan_div()
473 reg |= (data->has_fan & (1 << 4)) ? 1 : 0; in w83627ehf_write_fan_div()
476 | ((data->fan_div[0] & 0x04) << 3); in w83627ehf_write_fan_div()
481 | ((data->fan_div[1] & 0x03) << 6); in w83627ehf_write_fan_div()
483 reg |= (data->has_fan & (1 << 4)) ? 1 : 0; in w83627ehf_write_fan_div()
486 | ((data->fan_div[1] & 0x04) << 4); in w83627ehf_write_fan_div()
491 | ((data->fan_div[2] & 0x03) << 6); in w83627ehf_write_fan_div()
494 | ((data->fan_div[2] & 0x04) << 5); in w83627ehf_write_fan_div()
497 case 3: in w83627ehf_write_fan_div()
499 | (data->fan_div[3] & 0x03); in w83627ehf_write_fan_div()
502 | ((data->fan_div[3] & 0x04) << 5); in w83627ehf_write_fan_div()
507 | ((data->fan_div[4] & 0x03) << 2) in w83627ehf_write_fan_div()
508 | ((data->fan_div[4] & 0x04) << 5); in w83627ehf_write_fan_div()
519 data->fan_div[0] = (i >> 4) & 0x03; in w83627ehf_update_fan_div()
520 data->fan_div[1] = (i >> 6) & 0x03; in w83627ehf_update_fan_div()
522 data->fan_div[2] = (i >> 6) & 0x03; in w83627ehf_update_fan_div()
524 data->fan_div[0] |= (i >> 3) & 0x04; in w83627ehf_update_fan_div()
525 data->fan_div[1] |= (i >> 4) & 0x04; in w83627ehf_update_fan_div()
526 data->fan_div[2] |= (i >> 5) & 0x04; in w83627ehf_update_fan_div()
527 if (data->has_fan & ((1 << 3) | (1 << 4))) { in w83627ehf_update_fan_div()
529 data->fan_div[3] = i & 0x03; in w83627ehf_update_fan_div()
530 data->fan_div[4] = ((i >> 2) & 0x03) in w83627ehf_update_fan_div()
533 if (data->has_fan & (1 << 3)) { in w83627ehf_update_fan_div()
535 data->fan_div[3] |= (i >> 5) & 0x04; in w83627ehf_update_fan_div()
544 for (i = 0; i < data->pwm_num; i++) { in w83627ehf_update_pwm()
545 if (!(data->has_fan & (1 << i))) in w83627ehf_update_pwm()
555 data->pwm_mode[i] = in w83627ehf_update_pwm()
557 data->pwm_enable[i] = ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i]) in w83627ehf_update_pwm()
558 & 3) + 1; in w83627ehf_update_pwm()
559 data->pwm[i] = w83627ehf_read_value(data, W83627EHF_REG_PWM[i]); in w83627ehf_update_pwm()
561 data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0)) & 0x0f; in w83627ehf_update_pwm()
570 mutex_lock(&data->update_lock); in w83627ehf_update_device()
572 if (time_after(jiffies, data->last_updated + HZ + HZ/2) in w83627ehf_update_device()
573 || !data->valid) { in w83627ehf_update_device()
578 for (i = 0; i < data->in_num; i++) { in w83627ehf_update_device()
579 if ((i == 6) && data->in6_skip) in w83627ehf_update_device()
582 data->in[i] = w83627ehf_read_value(data, in w83627ehf_update_device()
584 data->in_min[i] = w83627ehf_read_value(data, in w83627ehf_update_device()
586 data->in_max[i] = w83627ehf_read_value(data, in w83627ehf_update_device()
594 if (!(data->has_fan & (1 << i))) in w83627ehf_update_device()
598 data->rpm[i] = fan_from_reg8(reg, data->fan_div[i]); in w83627ehf_update_device()
600 if (data->has_fan_min & (1 << i)) in w83627ehf_update_device()
601 data->fan_min[i] = w83627ehf_read_value(data, in w83627ehf_update_device()
609 if (reg >= 0xff && data->fan_div[i] < 0x07) { in w83627ehf_update_device()
612 i + 1, div_from_reg(data->fan_div[i]), in w83627ehf_update_device()
613 div_from_reg(data->fan_div[i] + 1)); in w83627ehf_update_device()
614 data->fan_div[i]++; in w83627ehf_update_device()
617 if ((data->has_fan_min & (1 << i)) in w83627ehf_update_device()
618 && data->fan_min[i] >= 2 in w83627ehf_update_device()
619 && data->fan_min[i] != 255) in w83627ehf_update_device()
622 (data->fan_min[i] /= 2)); in w83627ehf_update_device()
628 for (i = 0; i < data->pwm_num; i++) { in w83627ehf_update_device()
629 if (!(data->has_fan & (1 << i))) in w83627ehf_update_device()
632 data->fan_start_output[i] = in w83627ehf_update_device()
635 data->fan_stop_output[i] = in w83627ehf_update_device()
638 data->fan_stop_time[i] = in w83627ehf_update_device()
642 if (data->REG_FAN_MAX_OUTPUT && in w83627ehf_update_device()
643 data->REG_FAN_MAX_OUTPUT[i] != 0xff) in w83627ehf_update_device()
644 data->fan_max_output[i] = in w83627ehf_update_device()
646 data->REG_FAN_MAX_OUTPUT[i]); in w83627ehf_update_device()
648 if (data->REG_FAN_STEP_OUTPUT && in w83627ehf_update_device()
649 data->REG_FAN_STEP_OUTPUT[i] != 0xff) in w83627ehf_update_device()
650 data->fan_step_output[i] = in w83627ehf_update_device()
652 data->REG_FAN_STEP_OUTPUT[i]); in w83627ehf_update_device()
654 data->target_temp[i] = in w83627ehf_update_device()
657 (data->pwm_mode[i] == 1 ? 0x7f : 0xff); in w83627ehf_update_device()
662 if (!(data->have_temp & (1 << i))) in w83627ehf_update_device()
664 data->temp[i] = w83627ehf_read_temp(data, in w83627ehf_update_device()
665 data->reg_temp[i]); in w83627ehf_update_device()
666 if (data->reg_temp_over[i]) in w83627ehf_update_device()
667 data->temp_max[i] in w83627ehf_update_device()
669 data->reg_temp_over[i]); in w83627ehf_update_device()
670 if (data->reg_temp_hyst[i]) in w83627ehf_update_device()
671 data->temp_max_hyst[i] in w83627ehf_update_device()
673 data->reg_temp_hyst[i]); in w83627ehf_update_device()
676 if (data->have_temp_offset & (1 << i)) in w83627ehf_update_device()
677 data->temp_offset[i] in w83627ehf_update_device()
682 data->alarms = w83627ehf_read_value(data, in w83627ehf_update_device()
689 data->caseopen = w83627ehf_read_value(data, in w83627ehf_update_device()
692 data->last_updated = jiffies; in w83627ehf_update_device()
693 data->valid = 1; in w83627ehf_update_device()
696 mutex_unlock(&data->update_lock); in w83627ehf_update_device()
702 store_in_##reg(struct device *dev, struct w83627ehf_data *data, int channel, \
706 return -EINVAL; \
707 mutex_lock(&data->update_lock); \
708 data->in_##reg[channel] = in_to_reg(val, channel, data->scale_in); \
709 w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(channel), \
710 data->in_##reg[channel]); \
711 mutex_unlock(&data->update_lock); \
719 store_fan_min(struct device *dev, struct w83627ehf_data *data, int channel, in store_in_reg()
726 return -EINVAL; in store_in_reg()
728 mutex_lock(&data->update_lock); in store_in_reg()
731 data->fan_min[channel] = 255; in store_in_reg()
732 new_div = data->fan_div[channel]; /* No change */ in store_in_reg()
734 channel + 1); in store_in_reg()
740 data->fan_min[channel] = 254; in store_in_reg()
744 channel + 1, val, fan_from_reg8(254, 7)); in store_in_reg()
750 data->fan_min[channel] = 1; in store_in_reg()
754 channel + 1, val, fan_from_reg8(1, 0)); in store_in_reg()
766 data->fan_min[channel] = reg; in store_in_reg()
773 if (new_div != data->fan_div[channel]) { in store_in_reg()
775 channel + 1, div_from_reg(data->fan_div[channel]), in store_in_reg()
777 data->fan_div[channel] = new_div; in store_in_reg()
778 w83627ehf_write_fan_div(data, channel); in store_in_reg()
780 data->last_updated = jiffies; in store_in_reg()
783 w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[channel], in store_in_reg()
784 data->fan_min[channel]); in store_in_reg()
785 mutex_unlock(&data->update_lock); in store_in_reg()
792 store_##reg(struct device *dev, struct w83627ehf_data *data, int channel, \
795 mutex_lock(&data->update_lock); \
796 data->reg[channel] = LM75_TEMP_TO_REG(val); \
797 w83627ehf_write_temp(data, data->addr[channel], data->reg[channel]); \
798 mutex_unlock(&data->update_lock); \
805 store_temp_offset(struct device *dev, struct w83627ehf_data *data, int channel, in store_temp_offset() argument
808 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127); in store_temp_offset()
810 mutex_lock(&data->update_lock); in store_temp_offset()
811 data->temp_offset[channel] = val; in store_temp_offset()
812 w83627ehf_write_value(data, W83627EHF_REG_TEMP_OFFSET[channel], val); in store_temp_offset()
813 mutex_unlock(&data->update_lock); in store_temp_offset()
818 store_pwm_mode(struct device *dev, struct w83627ehf_data *data, int channel, in store_pwm_mode() argument
824 return -EINVAL; in store_pwm_mode()
826 mutex_lock(&data->update_lock); in store_pwm_mode()
827 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[channel]); in store_pwm_mode()
828 data->pwm_mode[channel] = val; in store_pwm_mode()
829 reg &= ~(1 << W83627EHF_PWM_MODE_SHIFT[channel]); in store_pwm_mode()
831 reg |= 1 << W83627EHF_PWM_MODE_SHIFT[channel]; in store_pwm_mode()
832 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[channel], reg); in store_pwm_mode()
833 mutex_unlock(&data->update_lock); in store_pwm_mode()
838 store_pwm(struct device *dev, struct w83627ehf_data *data, int channel, in store_pwm() argument
843 mutex_lock(&data->update_lock); in store_pwm()
844 data->pwm[channel] = val; in store_pwm()
845 w83627ehf_write_value(data, W83627EHF_REG_PWM[channel], val); in store_pwm()
846 mutex_unlock(&data->update_lock); in store_pwm()
851 store_pwm_enable(struct device *dev, struct w83627ehf_data *data, int channel, in store_pwm_enable() argument
857 (val > 4 && val != data->pwm_enable_orig[channel])) in store_pwm_enable()
858 return -EINVAL; in store_pwm_enable()
860 mutex_lock(&data->update_lock); in store_pwm_enable()
861 data->pwm_enable[channel] = val; in store_pwm_enable()
863 W83627EHF_REG_PWM_ENABLE[channel]); in store_pwm_enable()
864 reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[channel]); in store_pwm_enable()
865 reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[channel]; in store_pwm_enable()
866 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[channel], in store_pwm_enable()
868 mutex_unlock(&data->update_lock); in store_pwm_enable()
876 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); \
879 int nr = sensor_attr->index; \
880 return sprintf(buf, "%d\n", data->reg[nr] * 1000); \
892 int nr = sensor_attr->index; in show_tol_temp()
902 mutex_lock(&data->update_lock); in show_tol_temp()
903 data->target_temp[nr] = val; in show_tol_temp()
905 mutex_unlock(&data->update_lock); in show_tol_temp()
915 int nr = sensor_attr->index; in store_tolerance()
924 /* Limit the temp to 0C - 15C */ in store_tolerance()
927 mutex_lock(&data->update_lock); in store_tolerance()
934 data->tolerance[nr] = val; in store_tolerance()
935 mutex_unlock(&data->update_lock); in store_tolerance()
946 store_target_temp, 3);
955 store_tolerance, 3);
963 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); \
966 int nr = sensor_attr->index; \
967 return sprintf(buf, "%d\n", data->reg[nr]); \
976 int nr = sensor_attr->index; \
983 mutex_lock(&data->update_lock); \
984 data->reg[nr] = val; \
986 mutex_unlock(&data->update_lock); \
992 fan_functions(fan_max_output, data->REG_FAN_MAX_OUTPUT)
993 fan_functions(fan_step_output, data->REG_FAN_STEP_OUTPUT)
999 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); \
1002 int nr = sensor_attr->index; \
1004 step_time_from_reg(data->reg[nr], \
1005 data->pwm_mode[nr])); \
1015 int nr = sensor_attr->index; \
1021 val = step_time_to_reg(val, data->pwm_mode[nr]); \
1022 mutex_lock(&data->update_lock); \
1023 data->reg[nr] = val; \
1025 mutex_unlock(&data->update_lock); \
1032 store_fan_stop_time, 3);
1034 store_fan_start_output, 3);
1036 store_fan_stop_output, 3);
1038 store_fan_max_output, 3);
1040 store_fan_step_output, 3);
1084 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); in cpu0_vid_show()
1091 clear_caseopen(struct device *dev, struct w83627ehf_data *data, int channel, in clear_caseopen() argument
1097 if (val != 0 || channel != 0) in clear_caseopen()
1098 return -EINVAL; in clear_caseopen()
1100 mutex_lock(&data->update_lock); in clear_caseopen()
1104 data->valid = 0; /* Force cache refresh */ in clear_caseopen()
1105 mutex_unlock(&data->update_lock); in clear_caseopen()
1121 if (devattr->show == cpu0_vid_show && data->have_vid) in w83627ehf_attrs_visible()
1122 return a->mode; in w83627ehf_attrs_visible()
1126 if (sda->index < 2 && in w83627ehf_attrs_visible()
1127 (devattr->show == show_fan_stop_time || in w83627ehf_attrs_visible()
1128 devattr->show == show_fan_start_output || in w83627ehf_attrs_visible()
1129 devattr->show == show_fan_stop_output)) in w83627ehf_attrs_visible()
1130 return a->mode; in w83627ehf_attrs_visible()
1132 if (sda->index < 3 && in w83627ehf_attrs_visible()
1133 (devattr->show == show_fan_max_output || in w83627ehf_attrs_visible()
1134 devattr->show == show_fan_step_output) && in w83627ehf_attrs_visible()
1135 data->REG_FAN_STEP_OUTPUT && in w83627ehf_attrs_visible()
1136 data->REG_FAN_STEP_OUTPUT[sda->index] != 0xff) in w83627ehf_attrs_visible()
1137 return a->mode; in w83627ehf_attrs_visible()
1140 if (sda->index == 2 && in w83627ehf_attrs_visible()
1141 (data->has_fan & (1 << 2)) && data->pwm_num >= 3 && in w83627ehf_attrs_visible()
1142 (devattr->show == show_fan_stop_time || in w83627ehf_attrs_visible()
1143 devattr->show == show_fan_start_output || in w83627ehf_attrs_visible()
1144 devattr->show == show_fan_stop_output)) in w83627ehf_attrs_visible()
1145 return a->mode; in w83627ehf_attrs_visible()
1147 if (sda->index == 3 && in w83627ehf_attrs_visible()
1148 (data->has_fan & (1 << 3)) && data->pwm_num >= 4 && in w83627ehf_attrs_visible()
1149 (devattr->show == show_fan_stop_time || in w83627ehf_attrs_visible()
1150 devattr->show == show_fan_start_output || in w83627ehf_attrs_visible()
1151 devattr->show == show_fan_stop_output || in w83627ehf_attrs_visible()
1152 devattr->show == show_fan_max_output || in w83627ehf_attrs_visible()
1153 devattr->show == show_fan_step_output)) in w83627ehf_attrs_visible()
1154 return a->mode; in w83627ehf_attrs_visible()
1156 if ((devattr->show == show_target_temp || in w83627ehf_attrs_visible()
1157 devattr->show == show_tolerance) && in w83627ehf_attrs_visible()
1158 (data->has_fan & (1 << sda->index)) && in w83627ehf_attrs_visible()
1159 sda->index < data->pwm_num) in w83627ehf_attrs_visible()
1160 return a->mode; in w83627ehf_attrs_visible()
1165 /* These groups handle non-standard attributes used in this device */
1233 if (!(data->have_temp & (1 << i))) in w83627ehf_init_device()
1235 if (!data->reg_temp_config[i]) in w83627ehf_init_device()
1238 data->reg_temp_config[i]); in w83627ehf_init_device()
1241 data->reg_temp_config[i], in w83627ehf_init_device()
1261 for (i = 0; i < 3; i++) { in w83627ehf_init_device()
1264 if (data->temp_label) in w83627ehf_init_device()
1265 label = data->temp_label[data->temp_src[i]]; in w83627ehf_init_device()
1269 data->temp_type[i] = 6; in w83627ehf_init_device()
1270 else if (label && strncmp(label, "AMD", 3) == 0) in w83627ehf_init_device()
1271 data->temp_type[i] = 5; in w83627ehf_init_device()
1273 data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 3; in w83627ehf_init_device()
1275 data->temp_type[i] = 4; /* thermistor */ in w83627ehf_init_device()
1285 data->reg_temp[i] = W83627EHF_REG_TEMP[i]; in w83627ehf_set_temp_reg_ehf()
1286 data->reg_temp_over[i] = W83627EHF_REG_TEMP_OVER[i]; in w83627ehf_set_temp_reg_ehf()
1287 data->reg_temp_hyst[i] = W83627EHF_REG_TEMP_HYST[i]; in w83627ehf_set_temp_reg_ehf()
1288 data->reg_temp_config[i] = W83627EHF_REG_TEMP_CONFIG[i]; in w83627ehf_set_temp_reg_ehf()
1299 if (sio_data->kind == w83627uhg) { in w83627ehf_check_fan_inputs()
1300 data->has_fan = 0x03; /* fan1 and fan2 */ in w83627ehf_check_fan_inputs()
1301 data->has_fan_min = 0x03; in w83627ehf_check_fan_inputs()
1306 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { in w83627ehf_check_fan_inputs()
1308 fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40; in w83627ehf_check_fan_inputs()
1309 fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20; in w83627ehf_check_fan_inputs()
1312 fan4pin = !(superio_inb(sio_data->sioreg, 0x29) & 0x06); in w83627ehf_check_fan_inputs()
1313 fan5pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x02); in w83627ehf_check_fan_inputs()
1316 data->has_fan = data->has_fan_min = 0x03; /* fan1 and fan2 */ in w83627ehf_check_fan_inputs()
1317 data->has_fan |= (fan3pin << 2); in w83627ehf_check_fan_inputs()
1318 data->has_fan_min |= (fan3pin << 2); in w83627ehf_check_fan_inputs()
1329 data->has_fan |= (1 << 3); in w83627ehf_check_fan_inputs()
1330 data->has_fan_min |= (1 << 3); in w83627ehf_check_fan_inputs()
1333 data->has_fan |= (1 << 4); in w83627ehf_check_fan_inputs()
1334 data->has_fan_min |= (1 << 4); in w83627ehf_check_fan_inputs()
1340 u32 attr, int channel) in w83627ehf_is_visible() argument
1346 /* channel 0.., name 1.. */ in w83627ehf_is_visible()
1347 if (!(data->have_temp & (1 << channel))) in w83627ehf_is_visible()
1352 if (data->temp_label) in w83627ehf_is_visible()
1356 if (channel == 2 && data->temp3_val_only) in w83627ehf_is_visible()
1359 if (data->reg_temp_over[channel]) in w83627ehf_is_visible()
1365 if (data->reg_temp_hyst[channel]) in w83627ehf_is_visible()
1370 if (channel > 2) in w83627ehf_is_visible()
1375 if (data->have_temp_offset & (1 << channel)) in w83627ehf_is_visible()
1383 /* channel 0.., name 1.. */ in w83627ehf_is_visible()
1384 if (!(data->has_fan & (1 << channel))) in w83627ehf_is_visible()
1392 if (data->has_fan_min & (1 << channel)) in w83627ehf_is_visible()
1400 /* channel 0.., name 0.. */ in w83627ehf_is_visible()
1401 if (channel >= data->in_num) in w83627ehf_is_visible()
1403 if (channel == 6 && data->in6_skip) in w83627ehf_is_visible()
1412 /* channel 0.., name 1.. */ in w83627ehf_is_visible()
1413 if (!(data->has_fan & (1 << channel)) || in w83627ehf_is_visible()
1414 channel >= data->pwm_num) in w83627ehf_is_visible()
1433 int channel, long *val) in w83627ehf_do_read_temp() argument
1437 *val = LM75_TEMP_FROM_REG(data->temp[channel]); in w83627ehf_do_read_temp()
1440 *val = LM75_TEMP_FROM_REG(data->temp_max[channel]); in w83627ehf_do_read_temp()
1443 *val = LM75_TEMP_FROM_REG(data->temp_max_hyst[channel]); in w83627ehf_do_read_temp()
1446 *val = data->temp_offset[channel] * 1000; in w83627ehf_do_read_temp()
1449 *val = (int)data->temp_type[channel]; in w83627ehf_do_read_temp()
1452 if (channel < 3) { in w83627ehf_do_read_temp()
1454 *val = (data->alarms >> bit[channel]) & 1; in w83627ehf_do_read_temp()
1463 return -EOPNOTSUPP; in w83627ehf_do_read_temp()
1468 int channel, long *val) in w83627ehf_do_read_in() argument
1472 *val = in_from_reg(data->in[channel], channel, data->scale_in); in w83627ehf_do_read_in()
1475 *val = in_from_reg(data->in_min[channel], channel, in w83627ehf_do_read_in()
1476 data->scale_in); in w83627ehf_do_read_in()
1479 *val = in_from_reg(data->in_max[channel], channel, in w83627ehf_do_read_in()
1480 data->scale_in); in w83627ehf_do_read_in()
1483 if (channel < 10) { in w83627ehf_do_read_in()
1484 int bit[] = { 0, 1, 2, 3, 8, 21, 20, 16, 17, 19 }; in w83627ehf_do_read_in()
1485 *val = (data->alarms >> bit[channel]) & 1; in w83627ehf_do_read_in()
1492 return -EOPNOTSUPP; in w83627ehf_do_read_in()
1497 int channel, long *val) in w83627ehf_do_read_fan() argument
1501 *val = data->rpm[channel]; in w83627ehf_do_read_fan()
1504 *val = fan_from_reg8(data->fan_min[channel], in w83627ehf_do_read_fan()
1505 data->fan_div[channel]); in w83627ehf_do_read_fan()
1508 *val = div_from_reg(data->fan_div[channel]); in w83627ehf_do_read_fan()
1511 if (channel < 5) { in w83627ehf_do_read_fan()
1513 *val = (data->alarms >> bit[channel]) & 1; in w83627ehf_do_read_fan()
1520 return -EOPNOTSUPP; in w83627ehf_do_read_fan()
1525 int channel, long *val) in w83627ehf_do_read_pwm() argument
1529 *val = data->pwm[channel]; in w83627ehf_do_read_pwm()
1532 *val = data->pwm_enable[channel]; in w83627ehf_do_read_pwm()
1535 *val = data->pwm_enable[channel]; in w83627ehf_do_read_pwm()
1540 return -EOPNOTSUPP; in w83627ehf_do_read_pwm()
1545 int channel, long *val) in w83627ehf_do_read_intrusion() argument
1547 if (attr != hwmon_intrusion_alarm || channel != 0) in w83627ehf_do_read_intrusion()
1548 return -EOPNOTSUPP; /* shouldn't happen */ in w83627ehf_do_read_intrusion()
1550 *val = !!(data->caseopen & 0x10); in w83627ehf_do_read_intrusion()
1556 u32 attr, int channel, long *val) in w83627ehf_read() argument
1558 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); in w83627ehf_read()
1562 return w83627ehf_do_read_fan(data, attr, channel, val); in w83627ehf_read()
1565 return w83627ehf_do_read_in(data, attr, channel, val); in w83627ehf_read()
1568 return w83627ehf_do_read_pwm(data, attr, channel, val); in w83627ehf_read()
1571 return w83627ehf_do_read_temp(data, attr, channel, val); in w83627ehf_read()
1574 return w83627ehf_do_read_intrusion(data, attr, channel, val); in w83627ehf_read()
1580 return -EOPNOTSUPP; in w83627ehf_read()
1585 u32 attr, int channel, const char **str) in w83627ehf_read_string() argument
1592 *str = data->temp_label[data->temp_src[channel]]; in w83627ehf_read_string()
1601 return -EOPNOTSUPP; in w83627ehf_read_string()
1606 u32 attr, int channel, long val) in w83627ehf_write() argument
1611 return store_in_min(dev, data, channel, val); in w83627ehf_write()
1613 return store_in_max(dev, data, channel, val); in w83627ehf_write()
1616 return store_fan_min(dev, data, channel, val); in w83627ehf_write()
1619 return store_temp_max(dev, data, channel, val); in w83627ehf_write()
1621 return store_temp_max_hyst(dev, data, channel, val); in w83627ehf_write()
1623 return store_temp_offset(dev, data, channel, val); in w83627ehf_write()
1626 return store_pwm_mode(dev, data, channel, val); in w83627ehf_write()
1628 return store_pwm_enable(dev, data, channel, val); in w83627ehf_write()
1630 return store_pwm(dev, data, channel, val); in w83627ehf_write()
1633 return clear_caseopen(dev, data, channel, val); in w83627ehf_write()
1635 return -EOPNOTSUPP; in w83627ehf_write()
1699 struct device *dev = &pdev->dev; in w83627ehf_probe()
1708 if (!request_region(res->start, IOREGION_LENGTH, DRVNAME)) { in w83627ehf_probe()
1709 err = -EBUSY; in w83627ehf_probe()
1710 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n", in w83627ehf_probe()
1711 (unsigned long)res->start, in w83627ehf_probe()
1712 (unsigned long)res->start + IOREGION_LENGTH - 1); in w83627ehf_probe()
1716 data = devm_kzalloc(&pdev->dev, sizeof(struct w83627ehf_data), in w83627ehf_probe()
1719 err = -ENOMEM; in w83627ehf_probe()
1723 data->addr = res->start; in w83627ehf_probe()
1724 mutex_init(&data->lock); in w83627ehf_probe()
1725 mutex_init(&data->update_lock); in w83627ehf_probe()
1726 data->name = w83627ehf_device_names[sio_data->kind]; in w83627ehf_probe()
1727 data->bank = 0xff; /* Force initial bank selection */ in w83627ehf_probe()
1731 data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9; in w83627ehf_probe()
1732 /* 667HG has 3 pwms, and 627UHG has only 2 */ in w83627ehf_probe()
1733 switch (sio_data->kind) { in w83627ehf_probe()
1735 data->pwm_num = 4; in w83627ehf_probe()
1739 data->pwm_num = 3; in w83627ehf_probe()
1742 data->pwm_num = 2; in w83627ehf_probe()
1746 /* Default to 3 temperature inputs, code below will adjust as needed */ in w83627ehf_probe()
1747 data->have_temp = 0x07; in w83627ehf_probe()
1750 if (sio_data->kind == w83667hg_b) { in w83627ehf_probe()
1760 data->temp_src[0] = reg >> 5; in w83627ehf_probe()
1762 data->temp_src[1] = reg & 0x07; in w83627ehf_probe()
1763 data->temp_src[2] = (reg >> 4) & 0x07; in w83627ehf_probe()
1766 * W83667HG-B has another temperature register at 0x7e. in w83627ehf_probe()
1773 if (reg != data->temp_src[0] && reg != data->temp_src[1] in w83627ehf_probe()
1774 && reg != data->temp_src[2]) { in w83627ehf_probe()
1775 data->temp_src[3] = reg; in w83627ehf_probe()
1776 data->have_temp |= 1 << 3; in w83627ehf_probe()
1784 if (data->temp_src[2] == 2 && (reg & 0x01)) in w83627ehf_probe()
1785 data->have_temp &= ~(1 << 2); in w83627ehf_probe()
1787 if ((data->temp_src[2] == 2 && (data->have_temp & (1 << 2))) in w83627ehf_probe()
1788 || (data->temp_src[3] == 2 && (data->have_temp & (1 << 3)))) in w83627ehf_probe()
1789 data->in6_skip = 1; in w83627ehf_probe()
1791 data->temp_label = w83667hg_b_temp_label; in w83627ehf_probe()
1792 data->have_temp_offset = data->have_temp & 0x07; in w83627ehf_probe()
1793 for (i = 0; i < 3; i++) { in w83627ehf_probe()
1794 if (data->temp_src[i] > 2) in w83627ehf_probe()
1795 data->have_temp_offset &= ~(1 << i); in w83627ehf_probe()
1797 } else if (sio_data->kind == w83627uhg) { in w83627ehf_probe()
1800 w83627ehf_set_temp_reg_ehf(data, 3); in w83627ehf_probe()
1806 data->temp_src[0] = 0; /* SYSTIN */ in w83627ehf_probe()
1810 data->temp_src[1] = 1; in w83627ehf_probe()
1812 data->temp_src[1] = reg + 2; in w83627ehf_probe()
1814 data->have_temp &= ~(1 << 1); in w83627ehf_probe()
1816 data->temp_src[2] = reg >> 5; in w83627ehf_probe()
1822 if (data->temp_src[2] == 2 || data->temp_src[2] == 3 || in w83627ehf_probe()
1823 data->temp_src[2] == data->temp_src[0] || in w83627ehf_probe()
1824 ((data->have_temp & (1 << 1)) && in w83627ehf_probe()
1825 data->temp_src[2] == data->temp_src[1])) in w83627ehf_probe()
1826 data->have_temp &= ~(1 << 2); in w83627ehf_probe()
1828 data->temp3_val_only = 1; /* No limit regs */ in w83627ehf_probe()
1830 data->in6_skip = 1; /* No VIN3 */ in w83627ehf_probe()
1832 data->temp_label = w83667hg_b_temp_label; in w83627ehf_probe()
1833 data->have_temp_offset = data->have_temp & 0x03; in w83627ehf_probe()
1834 for (i = 0; i < 3; i++) { in w83627ehf_probe()
1835 if (data->temp_src[i] > 1) in w83627ehf_probe()
1836 data->have_temp_offset &= ~(1 << i); in w83627ehf_probe()
1839 w83627ehf_set_temp_reg_ehf(data, 3); in w83627ehf_probe()
1843 if (sio_data->kind == w83667hg) { in w83627ehf_probe()
1853 data->have_temp &= ~(1 << 2); in w83627ehf_probe()
1855 data->in6_skip = 1; in w83627ehf_probe()
1857 data->have_temp_offset = data->have_temp & 0x07; in w83627ehf_probe()
1860 if (sio_data->kind == w83667hg_b) { in w83627ehf_probe()
1861 data->REG_FAN_MAX_OUTPUT = in w83627ehf_probe()
1863 data->REG_FAN_STEP_OUTPUT = in w83627ehf_probe()
1866 data->REG_FAN_MAX_OUTPUT = in w83627ehf_probe()
1868 data->REG_FAN_STEP_OUTPUT = in w83627ehf_probe()
1873 if (sio_data->kind == w83627uhg) in w83627ehf_probe()
1874 data->scale_in = scale_in_w83627uhg; in w83627ehf_probe()
1876 data->scale_in = scale_in_common; in w83627ehf_probe()
1879 w83627ehf_init_device(data, sio_data->kind); in w83627ehf_probe()
1881 data->vrm = vid_which_vrm(); in w83627ehf_probe()
1883 err = superio_enter(sio_data->sioreg); in w83627ehf_probe()
1888 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { in w83627ehf_probe()
1894 superio_select(sio_data->sioreg, W83667HG_LD_VID); in w83627ehf_probe()
1895 data->vid = superio_inb(sio_data->sioreg, 0xe3); in w83627ehf_probe()
1896 data->have_vid = true; in w83627ehf_probe()
1897 } else if (sio_data->kind != w83627uhg) { in w83627ehf_probe()
1898 superio_select(sio_data->sioreg, W83627EHF_LD_HWM); in w83627ehf_probe()
1899 if (superio_inb(sio_data->sioreg, SIO_REG_VID_CTRL) & 0x80) { in w83627ehf_probe()
1907 if (sio_data->kind == w83627ehf) { in w83627ehf_probe()
1908 en_vrm10 = superio_inb(sio_data->sioreg, in w83627ehf_probe()
1910 if ((en_vrm10 & 0x08) && data->vrm == 90) { in w83627ehf_probe()
1913 superio_outb(sio_data->sioreg, in w83627ehf_probe()
1917 && data->vrm == 100) { in w83627ehf_probe()
1920 superio_outb(sio_data->sioreg, in w83627ehf_probe()
1926 data->vid = superio_inb(sio_data->sioreg, in w83627ehf_probe()
1928 if (sio_data->kind == w83627ehf) /* 6 VID pins only */ in w83627ehf_probe()
1929 data->vid &= 0x3f; in w83627ehf_probe()
1930 data->have_vid = true; in w83627ehf_probe()
1939 superio_exit(sio_data->sioreg); in w83627ehf_probe()
1946 for (i = 0; i < data->pwm_num; i++) in w83627ehf_probe()
1947 data->pwm_enable_orig[i] = data->pwm_enable[i]; in w83627ehf_probe()
1949 hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, in w83627ehf_probe()
1950 data->name, in w83627ehf_probe()
1962 release_region(res->start, IOREGION_LENGTH); in w83627ehf_probe()
1971 release_region(data->addr, IOREGION_LENGTH); in w83627ehf_remove()
1981 mutex_lock(&data->update_lock); in w83627ehf_suspend()
1982 data->vbat = w83627ehf_read_value(data, W83627EHF_REG_VBAT); in w83627ehf_suspend()
1983 mutex_unlock(&data->update_lock); in w83627ehf_suspend()
1993 mutex_lock(&data->update_lock); in w83627ehf_resume()
1994 data->bank = 0xff; /* Force initial bank selection */ in w83627ehf_resume()
1997 for (i = 0; i < data->in_num; i++) { in w83627ehf_resume()
1998 if ((i == 6) && data->in6_skip) in w83627ehf_resume()
2002 data->in_min[i]); in w83627ehf_resume()
2004 data->in_max[i]); in w83627ehf_resume()
2008 if (!(data->has_fan_min & (1 << i))) in w83627ehf_resume()
2012 data->fan_min[i]); in w83627ehf_resume()
2016 if (!(data->have_temp & (1 << i))) in w83627ehf_resume()
2019 if (data->reg_temp_over[i]) in w83627ehf_resume()
2020 w83627ehf_write_temp(data, data->reg_temp_over[i], in w83627ehf_resume()
2021 data->temp_max[i]); in w83627ehf_resume()
2022 if (data->reg_temp_hyst[i]) in w83627ehf_resume()
2023 w83627ehf_write_temp(data, data->reg_temp_hyst[i], in w83627ehf_resume()
2024 data->temp_max_hyst[i]); in w83627ehf_resume()
2027 if (data->have_temp_offset & (1 << i)) in w83627ehf_resume()
2030 data->temp_offset[i]); in w83627ehf_resume()
2034 w83627ehf_write_value(data, W83627EHF_REG_VBAT, data->vbat); in w83627ehf_resume()
2036 /* Force re-reading all values */ in w83627ehf_resume()
2037 data->valid = 0; in w83627ehf_resume()
2038 mutex_unlock(&data->update_lock); in w83627ehf_resume()
2064 /* w83627ehf_find() looks for a '627 in the Super-I/O config space */
2071 static const char sio_name_W83627DHG_P[] __initconst = "W83627DHG-P"; in w83627ehf_find()
2074 static const char sio_name_W83667HG_B[] __initconst = "W83667HG-B"; in w83627ehf_find()
2091 sio_data->kind = w83627ehf; in w83627ehf_find()
2095 sio_data->kind = w83627ehf; in w83627ehf_find()
2099 sio_data->kind = w83627dhg; in w83627ehf_find()
2103 sio_data->kind = w83627dhg_p; in w83627ehf_find()
2107 sio_data->kind = w83627uhg; in w83627ehf_find()
2111 sio_data->kind = w83667hg; in w83627ehf_find()
2115 sio_data->kind = w83667hg_b; in w83627ehf_find()
2122 return -ENODEV; in w83627ehf_find()
2131 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n"); in w83627ehf_find()
2133 return -ENODEV; in w83627ehf_find()
2139 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n"); in w83627ehf_find()
2145 sio_data->sioreg = sioaddr; in w83627ehf_find()
2151 * when Super-I/O functions move to a separate file, the Super-I/O
2166 * initialize sio_data->kind and sio_data->sioreg. in sensors_w83627ehf_init()
2168 * when Super-I/O functions move to a separate file, the Super-I/O in sensors_w83627ehf_init()
2169 * driver will probe 0x2e and 0x4e and auto-detect the presence of a in sensors_w83627ehf_init()
2174 return -ENODEV; in sensors_w83627ehf_init()
2182 err = -ENOMEM; in sensors_w83627ehf_init()
2197 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; in sensors_w83627ehf_init()