Lines Matching +full:lpc +full:- +full:io +full:- +full:reg

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * it87.c - Part of lm_sensors, Linux kernel modules for hardware
6 * The IT8705F is an LPC-based Super I/O part that contains UARTs, a
14 * Supports: IT8603E Super I/O chip w/LPC interface
15 * IT8620E Super I/O chip w/LPC interface
16 * IT8622E Super I/O chip w/LPC interface
17 * IT8623E Super I/O chip w/LPC interface
18 * IT8628E Super I/O chip w/LPC interface
19 * IT8705F Super I/O chip w/LPC interface
20 * IT8712F Super I/O chip w/LPC interface
21 * IT8716F Super I/O chip w/LPC interface
22 * IT8718F Super I/O chip w/LPC interface
23 * IT8720F Super I/O chip w/LPC interface
24 * IT8721F Super I/O chip w/LPC interface
25 * IT8726F Super I/O chip w/LPC interface
26 * IT8728F Super I/O chip w/LPC interface
27 * IT8732F Super I/O chip w/LPC interface
28 * IT8758E Super I/O chip w/LPC interface
29 * IT8771E Super I/O chip w/LPC interface
30 * IT8772E Super I/O chip w/LPC interface
31 * IT8781F Super I/O chip w/LPC interface
32 * IT8782F Super I/O chip w/LPC interface
33 * IT8783E/F Super I/O chip w/LPC interface
34 * IT8786E Super I/O chip w/LPC interface
35 * IT8790E Super I/O chip w/LPC interface
36 * IT8792E Super I/O chip w/LPC interface
40 * Copyright (C) 2005-2010 Jean Delvare <jdelvare@suse.de>
52 #include <linux/hwmon-sysfs.h>
53 #include <linux/hwmon-vid.h>
60 #include <linux/io.h>
86 static inline int superio_inb(int ioreg, int reg) in superio_inb() argument
88 outb(reg, ioreg); in superio_inb()
92 static inline void superio_outb(int ioreg, int reg, int val) in superio_outb() argument
94 outb(reg, ioreg); in superio_outb()
98 static int superio_inw(int ioreg, int reg) in superio_inw() argument
102 outb(reg++, ioreg); in superio_inw()
104 outb(reg, ioreg); in superio_inw()
121 return -EBUSY; in superio_enter()
196 /*----- The IT87 registers -----*/
206 * Super-I/O configuration space.
211 * for fan divisors. Later IT8712F revisions must use 16-bit tachometer
219 * - up to 13 voltage (0 to 7, battery, avcc, 10 to 12)
220 * - up to 6 temp (1 to 6)
221 * - up to 6 fan (1 to 6)
284 #define FEAT_FAN16_CONFIG BIT(7) /* Need to enable 16-bit fans */
465 #define has_16bit_fans(data) ((data)->features & FEAT_16BIT_FANS)
466 #define has_12mv_adc(data) ((data)->features & FEAT_12MV_ADC)
467 #define has_10_9mv_adc(data) ((data)->features & FEAT_10_9MV_ADC)
468 #define has_newer_autopwm(data) ((data)->features & FEAT_NEWER_AUTOPWM)
469 #define has_old_autopwm(data) ((data)->features & FEAT_OLD_AUTOPWM)
470 #define has_temp_offset(data) ((data)->features & FEAT_TEMP_OFFSET)
471 #define has_temp_peci(data, nr) (((data)->features & FEAT_TEMP_PECI) && \
472 ((data)->peci_mask & BIT(nr)))
474 (((data)->features & FEAT_TEMP_OLD_PECI) && \
475 ((data)->old_peci_mask & BIT(nr)))
476 #define has_fan16_config(data) ((data)->features & FEAT_FAN16_CONFIG)
477 #define has_five_fans(data) ((data)->features & (FEAT_FIVE_FANS | \
479 #define has_vid(data) ((data)->features & FEAT_VID)
480 #define has_in7_internal(data) ((data)->features & FEAT_IN7_INTERNAL)
481 #define has_six_fans(data) ((data)->features & FEAT_SIX_FANS)
482 #define has_avcc3(data) ((data)->features & FEAT_AVCC3)
483 #define has_five_pwm(data) ((data)->features & (FEAT_FIVE_PWM \
485 #define has_six_pwm(data) ((data)->features & FEAT_SIX_PWM)
486 #define has_pwm_freq2(data) ((data)->features & FEAT_PWM_FREQ2)
487 #define has_six_temp(data) ((data)->features & FEAT_SIX_TEMP)
488 #define has_vin3_5v(data) ((data)->features & FEAT_VIN3_5V)
493 /* Values read from Super-I/O config space */
548 * the IT8720F. The meaning of bits 6-0 depends on the value of bit
552 * in separate registers (8-bit values), so the separate tracking
559 u8 pwm_temp_map[NUM_PWM];/* PWM to temp. chan. mapping (bits 1-0) */
562 u8 auto_pwm[NUM_AUTO_PWM][4]; /* [nr][3] is hard-coded */
576 if (data->in_scaled & BIT(nr)) in adc_lsb()
607 #define FAN_FROM_REG(val, div) ((val) == 0 ? -1 : (val) == 255 ? 0 : \
609 /* The divider is fixed to 2 in 16-bit mode */
610 #define FAN16_FROM_REG(val) ((val) == 0 ? -1 : (val) == 0xffff ? 0 : \
613 #define TEMP_TO_REG(val) (clamp_val(((val) < 0 ? (((val) - 500) / 1000) : \
614 ((val) + 500) / 1000), -128, 127))
625 static int pwm_from_reg(const struct it87_data *data, u8 reg) in pwm_from_reg() argument
628 return reg; in pwm_from_reg()
630 return (reg & 0x7f) << 1; in pwm_from_reg()
666 * Must be called with data->update_lock held, except during initialization.
667 * We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
670 static int it87_read_value(struct it87_data *data, u8 reg) in it87_read_value() argument
672 outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET); in it87_read_value()
673 return inb_p(data->addr + IT87_DATA_REG_OFFSET); in it87_read_value()
677 * Must be called with data->update_lock held, except during initialization.
678 * We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
681 static void it87_write_value(struct it87_data *data, u8 reg, u8 value) in it87_write_value() argument
683 outb_p(reg, data->addr + IT87_ADDR_REG_OFFSET); in it87_write_value()
684 outb_p(value, data->addr + IT87_DATA_REG_OFFSET); in it87_write_value()
689 data->pwm_ctrl[nr] = it87_read_value(data, IT87_REG_PWM[nr]); in it87_update_pwm_ctrl()
691 data->pwm_temp_map[nr] = data->pwm_ctrl[nr] & 0x03; in it87_update_pwm_ctrl()
692 data->pwm_duty[nr] = it87_read_value(data, in it87_update_pwm_ctrl()
695 if (data->pwm_ctrl[nr] & 0x80) /* Automatic mode */ in it87_update_pwm_ctrl()
696 data->pwm_temp_map[nr] = data->pwm_ctrl[nr] & 0x03; in it87_update_pwm_ctrl()
698 data->pwm_duty[nr] = data->pwm_ctrl[nr] & 0x7f; in it87_update_pwm_ctrl()
705 data->auto_temp[nr][i] = it87_read_value(data, in it87_update_pwm_ctrl()
708 data->auto_pwm[nr][i] = it87_read_value(data, in it87_update_pwm_ctrl()
719 data->auto_temp[nr][0] = in it87_update_pwm_ctrl()
723 data->auto_temp[nr][i + 1] = in it87_update_pwm_ctrl()
730 data->auto_pwm[nr][0] = in it87_update_pwm_ctrl()
732 data->auto_pwm[nr][1] = in it87_update_pwm_ctrl()
742 mutex_lock(&data->update_lock); in it87_update_device()
744 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || in it87_update_device()
745 !data->valid) { in it87_update_device()
755 if (!(data->has_in & BIT(i))) in it87_update_device()
758 data->in[i][0] = in it87_update_device()
765 data->in[i][1] = in it87_update_device()
767 data->in[i][2] = in it87_update_device()
773 if (!(data->has_fan & BIT(i))) in it87_update_device()
776 data->fan[i][1] = in it87_update_device()
778 data->fan[i][0] = it87_read_value(data, in it87_update_device()
780 /* Add high byte if in 16-bit mode */ in it87_update_device()
782 data->fan[i][0] |= it87_read_value(data, in it87_update_device()
784 data->fan[i][1] |= it87_read_value(data, in it87_update_device()
789 if (!(data->has_temp & BIT(i))) in it87_update_device()
791 data->temp[i][0] = in it87_update_device()
795 data->temp[i][3] = in it87_update_device()
802 data->temp[i][1] = in it87_update_device()
804 data->temp[i][2] = in it87_update_device()
809 if ((data->has_fan & 0x07) && !has_16bit_fans(data)) { in it87_update_device()
811 data->fan_div[0] = i & 0x07; in it87_update_device()
812 data->fan_div[1] = (i >> 3) & 0x07; in it87_update_device()
813 data->fan_div[2] = (i & 0x40) ? 3 : 1; in it87_update_device()
816 data->alarms = in it87_update_device()
820 data->beeps = it87_read_value(data, IT87_REG_BEEP_ENABLE); in it87_update_device()
822 data->fan_main_ctrl = it87_read_value(data, in it87_update_device()
824 data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL); in it87_update_device()
826 if (!(data->has_pwm & BIT(i))) in it87_update_device()
831 data->sensor = it87_read_value(data, IT87_REG_TEMP_ENABLE); in it87_update_device()
832 data->extra = it87_read_value(data, IT87_REG_TEMP_EXTRA); in it87_update_device()
838 if (data->type == it8712 || data->type == it8716) { in it87_update_device()
839 data->vid = it87_read_value(data, IT87_REG_VID); in it87_update_device()
844 data->vid &= 0x3f; in it87_update_device()
846 data->last_updated = jiffies; in it87_update_device()
847 data->valid = 1; in it87_update_device()
850 mutex_unlock(&data->update_lock); in it87_update_device()
860 int index = sattr->index; in show_in()
861 int nr = sattr->nr; in show_in()
863 return sprintf(buf, "%d\n", in_from_reg(data, nr, data->in[nr][index])); in show_in()
871 int index = sattr->index; in set_in()
872 int nr = sattr->nr; in set_in()
876 return -EINVAL; in set_in()
878 mutex_lock(&data->update_lock); in set_in()
879 data->in[nr][index] = in_to_reg(data, nr, val); in set_in()
883 data->in[nr][index]); in set_in()
884 mutex_unlock(&data->update_lock); in set_in()
947 int nr = sattr->nr; in show_temp()
948 int index = sattr->index; in show_temp()
951 return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr][index])); in show_temp()
958 int nr = sattr->nr; in set_temp()
959 int index = sattr->index; in set_temp()
962 u8 reg, regval; in set_temp() local
965 return -EINVAL; in set_temp()
967 mutex_lock(&data->update_lock); in set_temp()
972 reg = IT87_REG_TEMP_LOW(nr); in set_temp()
975 reg = IT87_REG_TEMP_HIGH(nr); in set_temp()
983 data->valid = 0; in set_temp()
984 reg = IT87_REG_TEMP_OFFSET[nr]; in set_temp()
988 data->temp[nr][index] = TEMP_TO_REG(val); in set_temp()
989 it87_write_value(data, reg, data->temp[nr][index]); in set_temp()
990 mutex_unlock(&data->update_lock); in set_temp()
1023 int nr = sensor_attr->index; in show_temp_type()
1025 u8 reg = data->sensor; /* In case value is updated while used */ in show_temp_type() local
1026 u8 extra = data->extra; in show_temp_type()
1028 if ((has_temp_peci(data, nr) && (reg >> 6 == nr + 1)) || in show_temp_type()
1031 if (reg & (1 << nr)) in show_temp_type()
1033 if (reg & (8 << nr)) in show_temp_type()
1042 int nr = sensor_attr->index; in set_temp_type()
1046 u8 reg, extra; in set_temp_type() local
1049 return -EINVAL; in set_temp_type()
1051 reg = it87_read_value(data, IT87_REG_TEMP_ENABLE); in set_temp_type()
1052 reg &= ~(1 << nr); in set_temp_type()
1053 reg &= ~(8 << nr); in set_temp_type()
1054 if (has_temp_peci(data, nr) && (reg >> 6 == nr + 1 || val == 6)) in set_temp_type()
1055 reg &= 0x3f; in set_temp_type()
1066 reg |= 1 << nr; in set_temp_type()
1068 reg |= 8 << nr; in set_temp_type()
1070 reg |= (nr + 1) << 6; in set_temp_type()
1074 return -EINVAL; in set_temp_type()
1076 mutex_lock(&data->update_lock); in set_temp_type()
1077 data->sensor = reg; in set_temp_type()
1078 data->extra = extra; in set_temp_type()
1079 it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor); in set_temp_type()
1081 it87_write_value(data, IT87_REG_TEMP_EXTRA, data->extra); in set_temp_type()
1082 data->valid = 0; /* Force cache refresh */ in set_temp_type()
1083 mutex_unlock(&data->update_lock); in set_temp_type()
1098 if (data->type != it8603 && nr < 3 && !(data->fan_main_ctrl & BIT(nr))) in pwm_mode()
1100 if (data->pwm_ctrl[nr] & 0x80) in pwm_mode()
1102 if ((data->type == it8603 || nr >= 3) && in pwm_mode()
1103 data->pwm_duty[nr] == pwm_to_reg(data, 0xff)) in pwm_mode()
1113 int nr = sattr->nr; in show_fan()
1114 int index = sattr->index; in show_fan()
1119 FAN16_FROM_REG(data->fan[nr][index]) : in show_fan()
1120 FAN_FROM_REG(data->fan[nr][index], in show_fan()
1121 DIV_FROM_REG(data->fan_div[nr])); in show_fan()
1130 int nr = sensor_attr->index; in show_fan_div()
1132 return sprintf(buf, "%lu\n", DIV_FROM_REG(data->fan_div[nr])); in show_fan_div()
1140 int nr = sensor_attr->index; in show_pwm_enable()
1150 int nr = sensor_attr->index; in show_pwm()
1153 pwm_from_reg(data, data->pwm_duty[nr])); in show_pwm()
1161 int nr = sensor_attr->index; in show_pwm_freq()
1166 index = (data->extra >> 4) & 0x07; in show_pwm_freq()
1168 index = (data->fan_ctl >> 4) & 0x07; in show_pwm_freq()
1179 int nr = sattr->nr; in set_fan()
1180 int index = sattr->index; in set_fan()
1184 u8 reg; in set_fan() local
1187 return -EINVAL; in set_fan()
1189 mutex_lock(&data->update_lock); in set_fan()
1192 data->fan[nr][index] = FAN16_TO_REG(val); in set_fan()
1194 data->fan[nr][index] & 0xff); in set_fan()
1196 data->fan[nr][index] >> 8); in set_fan()
1198 reg = it87_read_value(data, IT87_REG_FAN_DIV); in set_fan()
1201 data->fan_div[nr] = reg & 0x07; in set_fan()
1204 data->fan_div[nr] = (reg >> 3) & 0x07; in set_fan()
1207 data->fan_div[nr] = (reg & 0x40) ? 3 : 1; in set_fan()
1210 data->fan[nr][index] = in set_fan()
1211 FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); in set_fan()
1213 data->fan[nr][index]); in set_fan()
1216 mutex_unlock(&data->update_lock); in set_fan()
1225 int nr = sensor_attr->index; in set_fan_div()
1231 return -EINVAL; in set_fan_div()
1233 mutex_lock(&data->update_lock); in set_fan_div()
1237 min = FAN_FROM_REG(data->fan[nr][1], DIV_FROM_REG(data->fan_div[nr])); in set_fan_div()
1242 data->fan_div[nr] = DIV_TO_REG(val); in set_fan_div()
1246 data->fan_div[nr] = 1; in set_fan_div()
1248 data->fan_div[nr] = 3; in set_fan_div()
1251 val |= (data->fan_div[0] & 0x07); in set_fan_div()
1252 val |= (data->fan_div[1] & 0x07) << 3; in set_fan_div()
1253 if (data->fan_div[2] == 3) in set_fan_div()
1258 data->fan[nr][1] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); in set_fan_div()
1259 it87_write_value(data, IT87_REG_FAN_MIN[nr], data->fan[nr][1]); in set_fan_div()
1261 mutex_unlock(&data->update_lock); in set_fan_div()
1265 /* Returns 0 if OK, -EINVAL otherwise */
1273 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
1274 err = -EINVAL; in check_trip_points()
1277 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1]) in check_trip_points()
1278 err = -EINVAL; in check_trip_points()
1282 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1]) in check_trip_points()
1283 err = -EINVAL; in check_trip_points()
1300 int nr = sensor_attr->index; in set_pwm_enable()
1304 return -EINVAL; in set_pwm_enable()
1309 return -EINVAL; in set_pwm_enable()
1312 mutex_lock(&data->update_lock); in set_pwm_enable()
1315 if (nr < 3 && data->type != it8603) { in set_pwm_enable()
1321 data->fan_main_ctrl &= ~BIT(nr); in set_pwm_enable()
1323 data->fan_main_ctrl); in set_pwm_enable()
1328 data->pwm_duty[nr] = pwm_to_reg(data, 0xff); in set_pwm_enable()
1330 data->pwm_duty[nr]); in set_pwm_enable()
1333 ctrl = (data->pwm_ctrl[nr] & 0x7c) | in set_pwm_enable()
1334 data->pwm_temp_map[nr]; in set_pwm_enable()
1336 ctrl = data->pwm_duty[nr]; in set_pwm_enable()
1338 data->pwm_ctrl[nr] = ctrl; in set_pwm_enable()
1345 ctrl = (data->pwm_ctrl[nr] & 0x7c) | in set_pwm_enable()
1346 data->pwm_temp_map[nr]; in set_pwm_enable()
1350 ctrl = (val == 1 ? data->pwm_duty[nr] : 0x80); in set_pwm_enable()
1352 data->pwm_ctrl[nr] = ctrl; in set_pwm_enable()
1355 if (data->type != it8603 && nr < 3) { in set_pwm_enable()
1357 data->fan_main_ctrl |= BIT(nr); in set_pwm_enable()
1359 data->fan_main_ctrl); in set_pwm_enable()
1363 mutex_unlock(&data->update_lock); in set_pwm_enable()
1372 int nr = sensor_attr->index; in set_pwm()
1376 return -EINVAL; in set_pwm()
1378 mutex_lock(&data->update_lock); in set_pwm()
1383 * is read-only so we can't write the value. in set_pwm()
1385 if (data->pwm_ctrl[nr] & 0x80) { in set_pwm()
1386 mutex_unlock(&data->update_lock); in set_pwm()
1387 return -EBUSY; in set_pwm()
1389 data->pwm_duty[nr] = pwm_to_reg(data, val); in set_pwm()
1391 data->pwm_duty[nr]); in set_pwm()
1393 data->pwm_duty[nr] = pwm_to_reg(data, val); in set_pwm()
1398 if (!(data->pwm_ctrl[nr] & 0x80)) { in set_pwm()
1399 data->pwm_ctrl[nr] = data->pwm_duty[nr]; in set_pwm()
1401 data->pwm_ctrl[nr]); in set_pwm()
1404 mutex_unlock(&data->update_lock); in set_pwm()
1413 int nr = sensor_attr->index; in set_pwm_freq()
1418 return -EINVAL; in set_pwm_freq()
1429 mutex_lock(&data->update_lock); in set_pwm_freq()
1431 data->fan_ctl = it87_read_value(data, IT87_REG_FAN_CTL) & 0x8f; in set_pwm_freq()
1432 data->fan_ctl |= i << 4; in set_pwm_freq()
1433 it87_write_value(data, IT87_REG_FAN_CTL, data->fan_ctl); in set_pwm_freq()
1435 data->extra = it87_read_value(data, IT87_REG_TEMP_EXTRA) & 0x8f; in set_pwm_freq()
1436 data->extra |= i << 4; in set_pwm_freq()
1437 it87_write_value(data, IT87_REG_TEMP_EXTRA, data->extra); in set_pwm_freq()
1439 mutex_unlock(&data->update_lock); in set_pwm_freq()
1449 int nr = sensor_attr->index; in show_pwm_temp_map()
1452 map = data->pwm_temp_map[nr]; in show_pwm_temp_map()
1467 int nr = sensor_attr->index; in set_pwm_temp_map()
1469 u8 reg; in set_pwm_temp_map() local
1472 return -EINVAL; in set_pwm_temp_map()
1475 val -= 3; in set_pwm_temp_map()
1479 reg = 0x00; in set_pwm_temp_map()
1482 reg = 0x01; in set_pwm_temp_map()
1485 reg = 0x02; in set_pwm_temp_map()
1488 return -EINVAL; in set_pwm_temp_map()
1491 mutex_lock(&data->update_lock); in set_pwm_temp_map()
1493 data->pwm_temp_map[nr] = reg; in set_pwm_temp_map()
1498 if (data->pwm_ctrl[nr] & 0x80) { in set_pwm_temp_map()
1499 data->pwm_ctrl[nr] = (data->pwm_ctrl[nr] & 0xfc) | in set_pwm_temp_map()
1500 data->pwm_temp_map[nr]; in set_pwm_temp_map()
1501 it87_write_value(data, IT87_REG_PWM[nr], data->pwm_ctrl[nr]); in set_pwm_temp_map()
1503 mutex_unlock(&data->update_lock); in set_pwm_temp_map()
1513 int nr = sensor_attr->nr; in show_auto_pwm()
1514 int point = sensor_attr->index; in show_auto_pwm()
1517 pwm_from_reg(data, data->auto_pwm[nr][point])); in show_auto_pwm()
1526 int nr = sensor_attr->nr; in set_auto_pwm()
1527 int point = sensor_attr->index; in set_auto_pwm()
1532 return -EINVAL; in set_auto_pwm()
1534 mutex_lock(&data->update_lock); in set_auto_pwm()
1535 data->auto_pwm[nr][point] = pwm_to_reg(data, val); in set_auto_pwm()
1540 it87_write_value(data, regaddr, data->auto_pwm[nr][point]); in set_auto_pwm()
1541 mutex_unlock(&data->update_lock); in set_auto_pwm()
1550 int nr = sensor_attr->index; in show_auto_pwm_slope()
1552 return sprintf(buf, "%d\n", data->auto_pwm[nr][1] & 0x7f); in show_auto_pwm_slope()
1561 int nr = sensor_attr->index; in set_auto_pwm_slope()
1565 return -EINVAL; in set_auto_pwm_slope()
1567 mutex_lock(&data->update_lock); in set_auto_pwm_slope()
1568 data->auto_pwm[nr][1] = (data->auto_pwm[nr][1] & 0x80) | val; in set_auto_pwm_slope()
1570 data->auto_pwm[nr][1]); in set_auto_pwm_slope()
1571 mutex_unlock(&data->update_lock); in set_auto_pwm_slope()
1581 int nr = sensor_attr->nr; in show_auto_temp()
1582 int point = sensor_attr->index; in show_auto_temp()
1583 int reg; in show_auto_temp() local
1586 reg = data->auto_temp[nr][point]; in show_auto_temp()
1588 reg = data->auto_temp[nr][1] - (data->auto_temp[nr][0] & 0x1f); in show_auto_temp()
1590 return sprintf(buf, "%d\n", TEMP_FROM_REG(reg)); in show_auto_temp()
1599 int nr = sensor_attr->nr; in set_auto_temp()
1600 int point = sensor_attr->index; in set_auto_temp()
1602 int reg; in set_auto_temp() local
1604 if (kstrtol(buf, 10, &val) < 0 || val < -128000 || val > 127000) in set_auto_temp()
1605 return -EINVAL; in set_auto_temp()
1607 mutex_lock(&data->update_lock); in set_auto_temp()
1609 reg = data->auto_temp[nr][1] - TEMP_TO_REG(val); in set_auto_temp()
1610 reg = clamp_val(reg, 0, 0x1f) | (data->auto_temp[nr][0] & 0xe0); in set_auto_temp()
1611 data->auto_temp[nr][0] = reg; in set_auto_temp()
1612 it87_write_value(data, IT87_REG_AUTO_TEMP(nr, 5), reg); in set_auto_temp()
1614 reg = TEMP_TO_REG(val); in set_auto_temp()
1615 data->auto_temp[nr][point] = reg; in set_auto_temp()
1617 point--; in set_auto_temp()
1618 it87_write_value(data, IT87_REG_AUTO_TEMP(nr, point), reg); in set_auto_temp()
1620 mutex_unlock(&data->update_lock); in set_auto_temp()
1805 return sprintf(buf, "%u\n", data->alarms); in alarms_show()
1813 int bitnr = to_sensor_dev_attr(attr)->index; in show_alarm()
1815 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); in show_alarm()
1827 return -EINVAL; in clear_intrusion()
1829 mutex_lock(&data->update_lock); in clear_intrusion()
1836 /* Invalidate cache to force re-read */ in clear_intrusion()
1837 data->valid = 0; in clear_intrusion()
1839 mutex_unlock(&data->update_lock); in clear_intrusion()
1868 int bitnr = to_sensor_dev_attr(attr)->index; in show_beep()
1870 return sprintf(buf, "%u\n", (data->beeps >> bitnr) & 1); in show_beep()
1876 int bitnr = to_sensor_dev_attr(attr)->index; in set_beep()
1881 return -EINVAL; in set_beep()
1883 mutex_lock(&data->update_lock); in set_beep()
1884 data->beeps = it87_read_value(data, IT87_REG_BEEP_ENABLE); in set_beep()
1886 data->beeps |= BIT(bitnr); in set_beep()
1888 data->beeps &= ~BIT(bitnr); in set_beep()
1889 it87_write_value(data, IT87_REG_BEEP_ENABLE, data->beeps); in set_beep()
1890 mutex_unlock(&data->update_lock); in set_beep()
1920 return sprintf(buf, "%u\n", data->vrm); in vrm_show()
1930 return -EINVAL; in vrm_store()
1932 data->vrm = val; in vrm_store()
1943 return sprintf(buf, "%ld\n", (long)vid_from_reg(data->vid, data->vrm)); in cpu0_vid_show()
1963 int nr = to_sensor_dev_attr(attr)->index; in show_label()
1990 i = index - 40 + 8; in it87_in_is_visible()
1994 if (!(data->has_in & BIT(i))) in it87_in_is_visible()
1997 if (a == 4 && !data->has_beep) in it87_in_is_visible()
2000 return attr->mode; in it87_in_is_visible()
2074 i = index - 21 + 3; in it87_temp_is_visible()
2078 if (!(data->has_temp & BIT(i))) in it87_temp_is_visible()
2084 if (a == 6 && !data->has_beep) in it87_temp_is_visible()
2087 return attr->mode; in it87_temp_is_visible()
2132 if ((index == 2 || index == 3) && !data->has_vid) in it87_is_visible()
2135 if (index > 3 && !(data->in_internal & BIT(index - 4))) in it87_is_visible()
2138 return attr->mode; in it87_is_visible()
2167 i = (index - 15) / 4 + 3; in it87_fan_is_visible()
2168 a = (index - 15) % 4; in it87_fan_is_visible()
2171 if (!(data->has_fan & BIT(i))) in it87_fan_is_visible()
2175 if (!data->has_beep) in it87_fan_is_visible()
2178 if (i == __ffs(data->has_fan)) in it87_fan_is_visible()
2179 return attr->mode | S_IWUSR; in it87_fan_is_visible()
2185 return attr->mode; in it87_fan_is_visible()
2237 if (!(data->has_pwm & BIT(i))) in it87_pwm_is_visible()
2242 return attr->mode | S_IWUSR; in it87_pwm_is_visible()
2246 return attr->mode | S_IWUSR; in it87_pwm_is_visible()
2248 return attr->mode; in it87_pwm_is_visible()
2299 i = (index - 33) / 6 + 3; in it87_auto_pwm_is_visible()
2300 a = (index - 33) % 6 + 4; in it87_auto_pwm_is_visible()
2303 if (!(data->has_pwm & BIT(i))) in it87_auto_pwm_is_visible()
2317 return attr->mode; in it87_auto_pwm_is_visible()
2386 /* SuperIO detection - will change isa_address if a chip is found */
2399 err = -ENODEV; in it87_find()
2404 sio_data->type = it87; in it87_find()
2407 sio_data->type = it8712; in it87_find()
2411 sio_data->type = it8716; in it87_find()
2414 sio_data->type = it8718; in it87_find()
2417 sio_data->type = it8720; in it87_find()
2420 sio_data->type = it8721; in it87_find()
2423 sio_data->type = it8728; in it87_find()
2426 sio_data->type = it8732; in it87_find()
2429 sio_data->type = it8792; in it87_find()
2432 sio_data->type = it8771; in it87_find()
2435 sio_data->type = it8772; in it87_find()
2438 sio_data->type = it8781; in it87_find()
2441 sio_data->type = it8782; in it87_find()
2444 sio_data->type = it8783; in it87_find()
2447 sio_data->type = it8786; in it87_find()
2450 sio_data->type = it8790; in it87_find()
2454 sio_data->type = it8603; in it87_find()
2457 sio_data->type = it8620; in it87_find()
2460 sio_data->type = it8622; in it87_find()
2463 sio_data->type = it8628; in it87_find()
2478 *address = superio_inw(sioaddr, IT87_BASE_REG) & ~(IT87_EXTENT - 1); in it87_find()
2485 sio_data->sioaddr = sioaddr; in it87_find()
2486 sio_data->revision = superio_inb(sioaddr, DEVREV) & 0x0f; in it87_find()
2488 it87_devices[sio_data->type].suffix, in it87_find()
2489 *address, sio_data->revision); in it87_find()
2491 config = &it87_devices[sio_data->type]; in it87_find()
2495 sio_data->internal |= BIT(1); in it87_find()
2498 sio_data->internal |= BIT(2); in it87_find()
2502 sio_data->internal |= BIT(3); /* in9 is AVCC */ in it87_find()
2504 sio_data->skip_in |= BIT(9); in it87_find()
2507 sio_data->skip_pwm |= BIT(3) | BIT(4) | BIT(5); in it87_find()
2509 sio_data->skip_pwm |= BIT(5); in it87_find()
2512 sio_data->skip_vid = 1; in it87_find()
2515 if (sio_data->type == it87) { in it87_find()
2518 sio_data->beep_pin = superio_inb(sioaddr, in it87_find()
2520 } else if (sio_data->type == it8783) { in it87_find()
2533 sio_data->skip_fan |= BIT(2); in it87_find()
2536 sio_data->skip_pwm |= BIT(2); in it87_find()
2540 sio_data->skip_fan |= BIT(1); in it87_find()
2542 sio_data->skip_pwm |= BIT(1); in it87_find()
2546 sio_data->skip_in |= BIT(5); /* No VIN5 */ in it87_find()
2550 sio_data->skip_in |= BIT(6); /* No VIN6 */ in it87_find()
2566 * Since we don't know for sure, re-route it if that is in it87_find()
2574 sio_data->need_in7_reroute = true; in it87_find()
2582 sio_data->internal |= BIT(0); in it87_find()
2584 sio_data->internal |= BIT(1); in it87_find()
2586 sio_data->beep_pin = superio_inb(sioaddr, in it87_find()
2588 } else if (sio_data->type == it8603) { in it87_find()
2597 sio_data->skip_pwm |= BIT(2); in it87_find()
2599 sio_data->skip_fan |= BIT(2); in it87_find()
2604 sio_data->skip_pwm |= BIT(1); in it87_find()
2606 sio_data->skip_fan |= BIT(1); in it87_find()
2608 sio_data->skip_in |= BIT(5); /* No VIN5 */ in it87_find()
2609 sio_data->skip_in |= BIT(6); /* No VIN6 */ in it87_find()
2611 sio_data->beep_pin = superio_inb(sioaddr, in it87_find()
2613 } else if (sio_data->type == it8620 || sio_data->type == it8628) { in it87_find()
2614 int reg; in it87_find() local
2619 reg = superio_inb(sioaddr, IT87_SIO_GPIO1_REG); in it87_find()
2620 if (reg & BIT(6)) in it87_find()
2621 sio_data->skip_pwm |= BIT(4); in it87_find()
2624 reg = superio_inb(sioaddr, IT87_SIO_GPIO2_REG); in it87_find()
2625 if (!(reg & BIT(5))) in it87_find()
2626 sio_data->skip_fan |= BIT(3); in it87_find()
2627 if (!(reg & BIT(4))) in it87_find()
2628 sio_data->skip_fan |= BIT(4); in it87_find()
2631 reg = superio_inb(sioaddr, IT87_SIO_GPIO3_REG); in it87_find()
2632 if (reg & BIT(6)) in it87_find()
2633 sio_data->skip_pwm |= BIT(2); in it87_find()
2634 if (reg & BIT(7)) in it87_find()
2635 sio_data->skip_fan |= BIT(2); in it87_find()
2638 reg = superio_inb(sioaddr, IT87_SIO_GPIO4_REG); in it87_find()
2639 if (reg & BIT(2)) in it87_find()
2640 sio_data->skip_pwm |= BIT(3); in it87_find()
2643 reg = superio_inb(sioaddr, IT87_SIO_GPIO5_REG); in it87_find()
2644 if (reg & BIT(1)) in it87_find()
2645 sio_data->skip_pwm |= BIT(1); in it87_find()
2646 if (reg & BIT(2)) in it87_find()
2647 sio_data->skip_fan |= BIT(1); in it87_find()
2649 if (!(reg & BIT(7))) { in it87_find()
2650 sio_data->skip_pwm |= BIT(5); in it87_find()
2651 sio_data->skip_fan |= BIT(5); in it87_find()
2655 reg = superio_inb(sioaddr, IT87_SIO_PINX2_REG); in it87_find()
2656 if (reg & BIT(0)) in it87_find()
2657 sio_data->internal |= BIT(0); in it87_find()
2659 sio_data->skip_in |= BIT(9); in it87_find()
2661 sio_data->beep_pin = superio_inb(sioaddr, in it87_find()
2663 } else if (sio_data->type == it8622) { in it87_find()
2664 int reg; in it87_find() local
2669 reg = superio_inb(sioaddr, IT87_SIO_GPIO1_REG); in it87_find()
2670 if (reg & BIT(6)) in it87_find()
2671 sio_data->skip_fan |= BIT(3); in it87_find()
2672 if (reg & BIT(5)) in it87_find()
2673 sio_data->skip_pwm |= BIT(3); in it87_find()
2676 reg = superio_inb(sioaddr, IT87_SIO_GPIO3_REG); in it87_find()
2677 if (reg & BIT(6)) in it87_find()
2678 sio_data->skip_pwm |= BIT(2); in it87_find()
2679 if (reg & BIT(7)) in it87_find()
2680 sio_data->skip_fan |= BIT(2); in it87_find()
2681 if (reg & BIT(3)) in it87_find()
2682 sio_data->skip_pwm |= BIT(4); in it87_find()
2683 if (reg & BIT(1)) in it87_find()
2684 sio_data->skip_fan |= BIT(4); in it87_find()
2687 reg = superio_inb(sioaddr, IT87_SIO_GPIO5_REG); in it87_find()
2688 if (reg & BIT(1)) in it87_find()
2689 sio_data->skip_pwm |= BIT(1); in it87_find()
2690 if (reg & BIT(2)) in it87_find()
2691 sio_data->skip_fan |= BIT(1); in it87_find()
2694 reg = superio_inb(sioaddr, IT87_SIO_PINX2_REG); in it87_find()
2695 if (!(reg & BIT(0))) in it87_find()
2696 sio_data->skip_in |= BIT(9); in it87_find()
2698 sio_data->beep_pin = superio_inb(sioaddr, in it87_find()
2701 int reg; in it87_find() local
2708 reg = superio_inb(sioaddr, IT87_SIO_GPIO2_REG); in it87_find()
2709 switch (sio_data->type) { in it87_find()
2711 if (reg & BIT(5)) in it87_find()
2712 sio_data->skip_fan |= BIT(3); in it87_find()
2713 if (reg & BIT(4)) in it87_find()
2714 sio_data->skip_fan |= BIT(4); in it87_find()
2719 if (!(reg & BIT(5))) in it87_find()
2720 sio_data->skip_fan |= BIT(3); in it87_find()
2721 if (!(reg & BIT(4))) in it87_find()
2722 sio_data->skip_fan |= BIT(4); in it87_find()
2729 reg = superio_inb(sioaddr, IT87_SIO_GPIO3_REG); in it87_find()
2730 if (!sio_data->skip_vid) { in it87_find()
2732 if (reg & 0x0f) { in it87_find()
2734 sio_data->skip_vid = 1; in it87_find()
2739 if (reg & BIT(6)) in it87_find()
2740 sio_data->skip_pwm |= BIT(2); in it87_find()
2741 if (reg & BIT(7)) in it87_find()
2742 sio_data->skip_fan |= BIT(2); in it87_find()
2745 reg = superio_inb(sioaddr, IT87_SIO_GPIO5_REG); in it87_find()
2746 if (reg & BIT(1)) in it87_find()
2747 sio_data->skip_pwm |= BIT(1); in it87_find()
2748 if (reg & BIT(2)) in it87_find()
2749 sio_data->skip_fan |= BIT(1); in it87_find()
2751 if ((sio_data->type == it8718 || sio_data->type == it8720) && in it87_find()
2752 !(sio_data->skip_vid)) in it87_find()
2753 sio_data->vid_value = superio_inb(sioaddr, in it87_find()
2756 reg = superio_inb(sioaddr, IT87_SIO_PINX2_REG); in it87_find()
2758 uart6 = sio_data->type == it8782 && (reg & BIT(2)); in it87_find()
2771 * If UART6 is enabled, re-route VIN7 to the internal divider in it87_find()
2774 if ((sio_data->type == it8720 || uart6) && !(reg & BIT(1))) { in it87_find()
2775 reg |= BIT(1); in it87_find()
2776 superio_outb(sioaddr, IT87_SIO_PINX2_REG, reg); in it87_find()
2777 sio_data->need_in7_reroute = true; in it87_find()
2780 if (reg & BIT(0)) in it87_find()
2781 sio_data->internal |= BIT(0); in it87_find()
2782 if (reg & BIT(1)) in it87_find()
2783 sio_data->internal |= BIT(1); in it87_find()
2795 sio_data->skip_in |= BIT(5) | BIT(6); in it87_find()
2796 sio_data->skip_temp |= BIT(2); in it87_find()
2799 sio_data->beep_pin = superio_inb(sioaddr, in it87_find()
2802 if (sio_data->beep_pin) in it87_find()
2814 * has reported instant system power-off when changing in it87_find()
2820 sio_data->skip_pwm = BIT(1); in it87_find()
2833 * means -1 degree C, which surprisingly doesn't trigger an alarm,
2838 int i, reg; in it87_check_limit_regs() local
2841 reg = it87_read_value(data, IT87_REG_VIN_MIN(i)); in it87_check_limit_regs()
2842 if (reg == 0xff) in it87_check_limit_regs()
2846 reg = it87_read_value(data, IT87_REG_TEMP_HIGH(i)); in it87_check_limit_regs()
2847 if (reg == 0xff) in it87_check_limit_regs()
2855 int reg; in it87_check_voltage_monitors_reset() local
2857 reg = it87_read_value(data, IT87_REG_VIN_ENABLE); in it87_check_voltage_monitors_reset()
2858 if ((reg & 0xff) == 0) { in it87_check_voltage_monitors_reset()
2867 struct it87_sio_data *sio_data = dev_get_platdata(&pdev->dev); in it87_check_tachometers_reset()
2871 mask = 0x70 & ~(sio_data->skip_fan << 4); in it87_check_tachometers_reset()
2881 /* Set tachometers to 16-bit mode if needed */
2885 int reg; in it87_check_tachometers_16bit_mode() local
2890 reg = it87_read_value(data, IT87_REG_FAN_16BIT); in it87_check_tachometers_16bit_mode()
2891 if (~reg & 0x07 & data->has_fan) { in it87_check_tachometers_16bit_mode()
2892 dev_dbg(&pdev->dev, in it87_check_tachometers_16bit_mode()
2893 "Setting fan1-3 to 16-bit mode\n"); in it87_check_tachometers_16bit_mode()
2895 reg | 0x07); in it87_check_tachometers_16bit_mode()
2909 struct it87_sio_data *sio_data = dev_get_platdata(&pdev->dev); in it87_init_device()
2915 * - If it is in automatic mode, setting to manual mode should set in it87_init_device()
2917 * - If it is in manual mode, we need a mapping to temperature in it87_init_device()
2927 data->pwm_temp_map[i] = i; in it87_init_device()
2928 data->pwm_duty[i] = 0x7f; /* Full speed */ in it87_init_device()
2929 data->auto_pwm[i][3] = 0x7f; /* Full speed, hard-coded */ in it87_init_device()
2938 * run-time through the temp{1-3}_type sysfs accessors if needed. in it87_init_device()
2945 data->fan_main_ctrl = it87_read_value(data, IT87_REG_FAN_MAIN_CTRL); in it87_init_device()
2946 data->has_fan = (data->fan_main_ctrl >> 4) & 0x07; in it87_init_device()
2955 data->has_fan |= BIT(3); /* fan4 enabled */ in it87_init_device()
2957 data->has_fan |= BIT(4); /* fan5 enabled */ in it87_init_device()
2959 data->has_fan |= BIT(5); /* fan6 enabled */ in it87_init_device()
2963 data->has_fan &= ~sio_data->skip_fan; in it87_init_device()
2970 sio_data->skip_pwm |= BIT(4); in it87_init_device()
2972 sio_data->skip_pwm |= BIT(5); in it87_init_device()
3038 struct device *dev = &pdev->dev; in it87_probe()
3044 if (!devm_request_region(&pdev->dev, res->start, IT87_EC_EXTENT, in it87_probe()
3046 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n", in it87_probe()
3047 (unsigned long)res->start, in it87_probe()
3048 (unsigned long)(res->start + IT87_EC_EXTENT - 1)); in it87_probe()
3049 return -EBUSY; in it87_probe()
3052 data = devm_kzalloc(&pdev->dev, sizeof(struct it87_data), GFP_KERNEL); in it87_probe()
3054 return -ENOMEM; in it87_probe()
3056 data->addr = res->start; in it87_probe()
3057 data->sioaddr = sio_data->sioaddr; in it87_probe()
3058 data->type = sio_data->type; in it87_probe()
3059 data->features = it87_devices[sio_data->type].features; in it87_probe()
3060 data->peci_mask = it87_devices[sio_data->type].peci_mask; in it87_probe()
3061 data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask; in it87_probe()
3065 * These are the first revisions with 16-bit tachometer support. in it87_probe()
3067 switch (data->type) { in it87_probe()
3069 if (sio_data->revision >= 0x03) { in it87_probe()
3070 data->features &= ~FEAT_OLD_AUTOPWM; in it87_probe()
3071 data->features |= FEAT_FAN16_CONFIG | FEAT_16BIT_FANS; in it87_probe()
3075 if (sio_data->revision >= 0x08) { in it87_probe()
3076 data->features &= ~FEAT_OLD_AUTOPWM; in it87_probe()
3077 data->features |= FEAT_FAN16_CONFIG | FEAT_16BIT_FANS | in it87_probe()
3088 return -ENODEV; in it87_probe()
3092 mutex_init(&data->update_lock); in it87_probe()
3102 if (sio_data->internal & BIT(0)) in it87_probe()
3103 data->in_scaled |= BIT(3); /* in3 is AVCC */ in it87_probe()
3104 if (sio_data->internal & BIT(1)) in it87_probe()
3105 data->in_scaled |= BIT(7); /* in7 is VSB */ in it87_probe()
3106 if (sio_data->internal & BIT(2)) in it87_probe()
3107 data->in_scaled |= BIT(8); /* in8 is Vbat */ in it87_probe()
3108 if (sio_data->internal & BIT(3)) in it87_probe()
3109 data->in_scaled |= BIT(9); /* in9 is AVCC */ in it87_probe()
3110 } else if (sio_data->type == it8781 || sio_data->type == it8782 || in it87_probe()
3111 sio_data->type == it8783) { in it87_probe()
3112 if (sio_data->internal & BIT(0)) in it87_probe()
3113 data->in_scaled |= BIT(3); /* in3 is VCC5V */ in it87_probe()
3114 if (sio_data->internal & BIT(1)) in it87_probe()
3115 data->in_scaled |= BIT(7); /* in7 is VCCH5V */ in it87_probe()
3118 data->has_temp = 0x07; in it87_probe()
3119 if (sio_data->skip_temp & BIT(2)) { in it87_probe()
3120 if (sio_data->type == it8782 && in it87_probe()
3122 data->has_temp &= ~BIT(2); in it87_probe()
3125 data->in_internal = sio_data->internal; in it87_probe()
3126 data->need_in7_reroute = sio_data->need_in7_reroute; in it87_probe()
3127 data->has_in = 0x3ff & ~sio_data->skip_in; in it87_probe()
3130 u8 reg = it87_read_value(data, IT87_REG_TEMP456_ENABLE); in it87_probe() local
3133 if ((reg & 0x03) >= 0x02) in it87_probe()
3134 data->has_temp |= BIT(3); in it87_probe()
3135 if (((reg >> 2) & 0x03) >= 0x02) in it87_probe()
3136 data->has_temp |= BIT(4); in it87_probe()
3137 if (((reg >> 4) & 0x03) >= 0x02) in it87_probe()
3138 data->has_temp |= BIT(5); in it87_probe()
3141 if ((reg & 0x03) == 0x01) in it87_probe()
3142 data->has_in |= BIT(10); in it87_probe()
3143 if (((reg >> 2) & 0x03) == 0x01) in it87_probe()
3144 data->has_in |= BIT(11); in it87_probe()
3145 if (((reg >> 4) & 0x03) == 0x01) in it87_probe()
3146 data->has_in |= BIT(12); in it87_probe()
3149 data->has_beep = !!sio_data->beep_pin; in it87_probe()
3154 if (!sio_data->skip_vid) { in it87_probe()
3155 data->has_vid = true; in it87_probe()
3156 data->vrm = vid_which_vrm(); in it87_probe()
3157 /* VID reading from Super-I/O config space if available */ in it87_probe()
3158 data->vid = sio_data->vid_value; in it87_probe()
3162 data->groups[0] = &it87_group; in it87_probe()
3163 data->groups[1] = &it87_group_in; in it87_probe()
3164 data->groups[2] = &it87_group_temp; in it87_probe()
3165 data->groups[3] = &it87_group_fan; in it87_probe()
3168 data->has_pwm = BIT(ARRAY_SIZE(IT87_REG_PWM)) - 1; in it87_probe()
3169 data->has_pwm &= ~sio_data->skip_pwm; in it87_probe()
3171 data->groups[4] = &it87_group_pwm; in it87_probe()
3173 data->groups[5] = &it87_group_auto_pwm; in it87_probe()
3177 it87_devices[sio_data->type].name, in it87_probe()
3178 data, data->groups); in it87_probe()
3184 struct it87_data *data = dev_get_drvdata(&pdev->dev); in it87_resume_sio()
3188 if (!data->need_in7_reroute) in it87_resume_sio()
3191 err = superio_enter(data->sioaddr); in it87_resume_sio()
3193 dev_warn(&pdev->dev, in it87_resume_sio()
3199 superio_select(data->sioaddr, GPIO); in it87_resume_sio()
3201 reg2c = superio_inb(data->sioaddr, IT87_SIO_PINX2_REG); in it87_resume_sio()
3203 dev_dbg(&pdev->dev, in it87_resume_sio()
3207 superio_outb(data->sioaddr, IT87_SIO_PINX2_REG, in it87_resume_sio()
3211 superio_exit(data->sioaddr); in it87_resume_sio()
3221 mutex_lock(&data->update_lock); in it87_resume()
3232 data->valid = 0; in it87_resume()
3234 mutex_unlock(&data->update_lock); in it87_resume()
3257 .end = address + IT87_EC_OFFSET + IT87_EC_EXTENT - 1, in it87_device_add()
3269 return -ENOMEM; in it87_device_add()
3338 err = -ENODEV; in sm_it87_init()