Commit 73055405 authored by Guenter Roeck's avatar Guenter Roeck

hwmon: (it87) Add feature flag for AVCC3 support

AVCC3 is supported on IT8620E, similar to IT8603E. Add feature flag
to indicate AVCC3 support. Don't enable it for now on IT8620E since
it is unclear if this chip supports it correctly.
Tested-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 11b83608
...@@ -233,6 +233,8 @@ static const u8 IT87_REG_TEMP_OFFSET[] = { 0x56, 0x57, 0x59 }; ...@@ -233,6 +233,8 @@ static const u8 IT87_REG_TEMP_OFFSET[] = { 0x56, 0x57, 0x59 };
#define IT87_REG_VIN(nr) (0x20 + (nr)) #define IT87_REG_VIN(nr) (0x20 + (nr))
#define IT87_REG_TEMP(nr) (0x29 + (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_MAX(nr) (0x30 + (nr) * 2)
#define IT87_REG_VIN_MIN(nr) (0x31 + (nr) * 2) #define IT87_REG_VIN_MIN(nr) (0x31 + (nr) * 2)
#define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2) #define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2)
...@@ -269,6 +271,7 @@ struct it87_devices { ...@@ -269,6 +271,7 @@ struct it87_devices {
#define FEAT_IN7_INTERNAL (1 << 10) /* Set if in7 is internal */ #define FEAT_IN7_INTERNAL (1 << 10) /* Set if in7 is internal */
#define FEAT_SIX_FANS (1 << 11) /* Supports six fans */ #define FEAT_SIX_FANS (1 << 11) /* Supports six fans */
#define FEAT_10_9MV_ADC (1 << 12) #define FEAT_10_9MV_ADC (1 << 12)
#define FEAT_AVCC3 (1 << 13) /* Chip supports in9/AVCC3 */
static const struct it87_devices it87_devices[] = { static const struct it87_devices it87_devices[] = {
[it87] = { [it87] = {
...@@ -389,7 +392,8 @@ static const struct it87_devices it87_devices[] = { ...@@ -389,7 +392,8 @@ static const struct it87_devices it87_devices[] = {
.name = "it8603", .name = "it8603",
.suffix = "E", .suffix = "E",
.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS .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, .peci_mask = 0x07,
}, },
[it8620] = { [it8620] = {
...@@ -419,6 +423,7 @@ static const struct it87_devices it87_devices[] = { ...@@ -419,6 +423,7 @@ static const struct it87_devices it87_devices[] = {
#define has_vid(data) ((data)->features & FEAT_VID) #define has_vid(data) ((data)->features & FEAT_VID)
#define has_in7_internal(data) ((data)->features & FEAT_IN7_INTERNAL) #define has_in7_internal(data) ((data)->features & FEAT_IN7_INTERNAL)
#define has_six_fans(data) ((data)->features & FEAT_SIX_FANS) #define has_six_fans(data) ((data)->features & FEAT_SIX_FANS)
#define has_avcc3(data) ((data)->features & FEAT_AVCC3)
struct it87_sio_data { struct it87_sio_data {
enum chips type; enum chips type;
...@@ -1548,7 +1553,7 @@ static ssize_t show_label(struct device *dev, struct device_attribute *attr, ...@@ -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(in3_label, S_IRUGO, show_label, NULL, 0);
static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1); static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1);
static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 2); 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 SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 0);
static ssize_t show_name(struct device *dev, struct device_attribute static ssize_t show_name(struct device *dev, struct device_attribute
...@@ -1944,8 +1949,10 @@ static int __init it87_find(unsigned short *address, ...@@ -1944,8 +1949,10 @@ static int __init it87_find(unsigned short *address,
/* in8 (Vbat) is always internal */ /* in8 (Vbat) is always internal */
sio_data->internal |= (1 << 2); sio_data->internal |= (1 << 2);
/* Only the IT8603E has in9 */ /* in9 (AVCC3), always internal if supported */
if (sio_data->type != it8603) if (has_avcc3(config))
sio_data->internal |= (1 << 3); /* in9 is AVCC */
else
sio_data->skip_in |= (1 << 9); sio_data->skip_in |= (1 << 9);
if (!has_vid(config)) if (!has_vid(config))
...@@ -2044,8 +2051,6 @@ static int __init it87_find(unsigned short *address, ...@@ -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 << 5); /* No VIN5 */
sio_data->skip_in |= (1 << 6); /* No VIN6 */ 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; sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
} else if (sio_data->type == it8620) { } else if (sio_data->type == it8620) {
int reg; int reg;
...@@ -2689,8 +2694,8 @@ static struct it87_data *it87_update_device(struct device *dev) ...@@ -2689,8 +2694,8 @@ static struct it87_data *it87_update_device(struct device *dev)
} }
/* in8 (battery) has no limit registers */ /* in8 (battery) has no limit registers */
data->in[8][0] = it87_read_value(data, IT87_REG_VIN(8)); data->in[8][0] = it87_read_value(data, IT87_REG_VIN(8));
if (data->type == it8603) if (has_avcc3(data))
data->in[9][0] = it87_read_value(data, 0x2f); data->in[9][0] = it87_read_value(data, IT87_REG_AVCC3);
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
/* Skip disabled fans */ /* Skip disabled fans */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment