diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 1896e26df634..146f93584cde 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -233,6 +233,8 @@ static const u8 IT87_REG_TEMP_OFFSET[] = { 0x56, 0x57, 0x59 }; #define IT87_REG_VIN(nr) (0x20 + (nr)) #define IT87_REG_TEMP(nr) (0x29 + (nr)) +#define IT87_REG_AVCC3 0x2f + #define IT87_REG_VIN_MAX(nr) (0x30 + (nr) * 2) #define IT87_REG_VIN_MIN(nr) (0x31 + (nr) * 2) #define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2) @@ -269,6 +271,7 @@ struct it87_devices { #define FEAT_IN7_INTERNAL (1 << 10) /* Set if in7 is internal */ #define FEAT_SIX_FANS (1 << 11) /* Supports six fans */ #define FEAT_10_9MV_ADC (1 << 12) +#define FEAT_AVCC3 (1 << 13) /* Chip supports in9/AVCC3 */ static const struct it87_devices it87_devices[] = { [it87] = { @@ -389,7 +392,8 @@ static const struct it87_devices it87_devices[] = { .name = "it8603", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL, + | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL + | FEAT_AVCC3, .peci_mask = 0x07, }, [it8620] = { @@ -419,6 +423,7 @@ static const struct it87_devices it87_devices[] = { #define has_vid(data) ((data)->features & FEAT_VID) #define has_in7_internal(data) ((data)->features & FEAT_IN7_INTERNAL) #define has_six_fans(data) ((data)->features & FEAT_SIX_FANS) +#define has_avcc3(data) ((data)->features & FEAT_AVCC3) struct it87_sio_data { enum chips type; @@ -1548,7 +1553,7 @@ static ssize_t show_label(struct device *dev, struct device_attribute *attr, static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0); static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1); static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2); -/* special AVCC3 IT8603E in9 */ +/* AVCC3 */ static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0); static ssize_t show_name(struct device *dev, struct device_attribute @@ -1944,8 +1949,10 @@ static int __init it87_find(unsigned short *address, /* in8 (Vbat) is always internal */ sio_data->internal |= (1 << 2); - /* Only the IT8603E has in9 */ - if (sio_data->type != it8603) + /* in9 (AVCC3), always internal if supported */ + if (has_avcc3(config)) + sio_data->internal |= (1 << 3); /* in9 is AVCC */ + else sio_data->skip_in |= (1 << 9); if (!has_vid(config)) @@ -2044,8 +2051,6 @@ static int __init it87_find(unsigned short *address, sio_data->skip_in |= (1 << 5); /* No VIN5 */ sio_data->skip_in |= (1 << 6); /* No VIN6 */ - sio_data->internal |= (1 << 3); /* in9 is AVCC */ - sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f; } else if (sio_data->type == it8620) { int reg; @@ -2689,8 +2694,8 @@ static struct it87_data *it87_update_device(struct device *dev) } /* in8 (battery) has no limit registers */ data->in[8][0] = it87_read_value(data, IT87_REG_VIN(8)); - if (data->type == it8603) - data->in[9][0] = it87_read_value(data, 0x2f); + if (has_avcc3(data)) + data->in[9][0] = it87_read_value(data, IT87_REG_AVCC3); for (i = 0; i < 6; i++) { /* Skip disabled fans */