This appears to be a pretty new Super I/O IC, which i found on my new motherboard (MSI 870A-G54). I couldn't find a datasheet, but this link (http://code.google.com/p/open-hardware-monitor/source/detail?r=130#) suggests that it can be trivially added to the f71882fg driver. So i tried that, pretending it was a f71889fg. This is the output i got, i appended what i think about the values: f71889ed-isa-0600 Adapter: ISA adapter in0: +1.66 V in1: +0.90 V (max = +2.04 V) <-- Vcore, 1.11 V when in high power mode, this seems accurate (compared to bios) in2: +1.07 V in3: +0.88 V in4: +0.62 V in5: +1.27 V in6: +1.55 V in7: +1.66 V in8: +1.64 V fan1: 785 RPM <-- cpu fan, accurate (compared to bios) fan2: 0 RPM ALARM fan3: 0 RPM ALARM temp1: +24.0 C (high = +255.0 C, hyst = +251.0 C) ALARM <-- cpu temp, probably accurate (compared to bios) (crit = +255.0 C, hyst = +251.0 C) ALARM sensor = Intel PECI temp2: FAULT (high = +255.0 C, hyst = +251.0 C) (crit = +255.0 C, hyst = +251.0 C) sensor = transistor temp3: +33.0 C (high = +255.0 C, hyst = +253.0 C) ALARM <-- system temp, probably accurate (compared to bios) (crit = +255.0 C, hyst = +253.0 C) ALARM sensor = transistor So please tell me what you think, any ideas how this can be improved. Especially the system voltages are horribly mis-calibrated it seems. Please CC me upon reply, i am not subscribed to the mailing-list. Maarten. -- Life spent, a precious moment, in the wink of an eye we live and we die.
diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c index a95fa42..b8fda89 100644 --- a/drivers/hwmon/f71882fg.c +++ b/drivers/hwmon/f71882fg.c @@ -48,7 +48,8 @@ #define SIO_F71858_ID 0x0507 /* Chipset ID */ #define SIO_F71862_ID 0x0601 /* Chipset ID */ #define SIO_F71882_ID 0x0541 /* Chipset ID */ -#define SIO_F71889_ID 0x0723 /* Chipset ID */ +#define SIO_F71889FG_ID 0x0723 /* Chipset ID */ +#define SIO_F71889ED_ID 0x0909 /* Chipset ID */ #define SIO_F8000_ID 0x0581 /* Chipset ID */ #define REGION_LENGTH 8 @@ -96,13 +97,14 @@ static unsigned short force_id; module_param(force_id, ushort, 0); MODULE_PARM_DESC(force_id, "Override the detected device ID"); -enum chips { f71858fg, f71862fg, f71882fg, f71889fg, f8000 }; +enum chips { f71858fg, f71862fg, f71882fg, f71889fg, f71889ed, f8000 }; static const char *f71882fg_names[] = { "f71858fg", "f71862fg", "f71882fg", "f71889fg", + "f71889ed", "f8000", }; @@ -306,7 +308,7 @@ static struct sensor_device_attribute_2 f71858fg_in_temp_attr[] = { SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2), }; -/* Temp and in attr common to the f71862fg, f71882fg and f71889fg */ +/* Temp and in attr common to the f71862fg, f71882fg, f71889fg and f71889ed */ static struct sensor_device_attribute_2 fxxxx_in_temp_attr[] = { SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0), SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1), @@ -477,7 +479,7 @@ static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = { }; /* PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the - f71858fg / f71882fg / f71889fg */ + f71858fg / f71882fg / f71889fg / f71889ed */ static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = { SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, show_pwm_auto_point_channel, @@ -546,7 +548,7 @@ static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = { show_pwm_auto_point_temp_hyst, NULL, 3, 2), }; -/* PWM attr common to the f71858fg, f71882fg and f71889fg */ +/* PWM attr common to the f71858fg, f71882fg, f71889fg and f71889ed */ static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { { SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, show_pwm_auto_point_channel, @@ -947,7 +949,7 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev) /* Update once every 60 seconds */ if ( time_after(jiffies, data->last_limits + 60 * HZ ) || !data->valid) { - if (data->type == f71882fg || data->type == f71889fg) { + if (data->type == f71882fg || data->type == f71889fg || data->type == f71889ed) { data->in1_max = f71882fg_read8(data, F71882FG_REG_IN1_HIGH); data->in_beep = @@ -970,7 +972,7 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev) } if (data->type == f71862fg || data->type == f71882fg || - data->type == f71889fg) { + data->type == f71889fg || data->type == f71889ed) { data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP); data->temp_beep = f71882fg_read8(data, @@ -981,7 +983,7 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev) data->temp_type[3] = (reg & 0x08) ? 2 : 4; } /* Determine temp index 1 sensor type */ - if (data->type == f71889fg) { + if (data->type == f71889fg || data->type == f71889ed) { reg2 = f71882fg_read8(data, F71882FG_REG_START); switch ((reg2 & 0x60) >> 5) { case 0x00: /* BJT / Thermistor */ @@ -1083,7 +1085,7 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev) if (data->type == f8000) data->fan[3] = f71882fg_read16(data, F71882FG_REG_FAN(3)); - if (data->type == f71882fg || data->type == f71889fg) + if (data->type == f71882fg || data->type == f71889fg || data->type == f71889ed) data->in_status = f71882fg_read8(data, F71882FG_REG_IN_STATUS); for (nr = 0; nr < nr_ins; nr++) @@ -1802,7 +1804,7 @@ static ssize_t store_pwm_auto_point_temp(struct device *dev, int point = to_sensor_dev_attr_2(devattr)->nr; long val = simple_strtol(buf, NULL, 10) / 1000; - if (data->type == f71889fg) + if (data->type == f71889fg || data->type == f71889ed) val = SENSORS_LIMIT(val, -128, 127); else val = SENSORS_LIMIT(val, 0, 127); @@ -1897,6 +1899,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) break; case f71882fg: case f71889fg: + case f71889ed: err = f71882fg_create_sysfs_files(pdev, fxxxx_in1_alarm_attr, ARRAY_SIZE(fxxxx_in1_alarm_attr)); @@ -1935,6 +1938,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) break; case f71882fg: case f71889fg: + case f71889ed: err = 0; break; case f8000: @@ -1955,7 +1959,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) goto exit_unregister_sysfs; if (data->type == f71862fg || data->type == f71882fg || - data->type == f71889fg) { + data->type == f71889fg || data->type == f71889ed) { err = f71882fg_create_sysfs_files(pdev, fxxxx_fan_beep_attr, nr_fans); if (err) @@ -1979,6 +1983,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) ARRAY_SIZE(f8000_auto_pwm_attr)); break; case f71889fg: + case f71889ed: for (i = 0; i < nr_fans; i++) { data->pwm_auto_point_mapping[i] = f71882fg_read8(data, @@ -2051,6 +2056,7 @@ static int f71882fg_remove(struct platform_device *pdev) break; case f71882fg: case f71889fg: + case f71889ed: f71882fg_remove_sysfs_files(pdev, fxxxx_in1_alarm_attr, ARRAY_SIZE(fxxxx_in1_alarm_attr)); @@ -2073,7 +2079,7 @@ static int f71882fg_remove(struct platform_device *pdev) ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans); if (data->type == f71862fg || data->type == f71882fg || - data->type == f71889fg) + data->type == f71889fg || data->type == f71889ed) f71882fg_remove_sysfs_files(pdev, fxxxx_fan_beep_attr, nr_fans); @@ -2091,7 +2097,7 @@ static int f71882fg_remove(struct platform_device *pdev) f8000_auto_pwm_attr, ARRAY_SIZE(f8000_auto_pwm_attr)); break; - default: /* f71858fg / f71882fg / f71889fg */ + default: /* f71858fg / f71882fg / f71889fg / f71889ed */ f71882fg_remove_sysfs_files(pdev, &fxxxx_auto_pwm_attr[0][0], ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans); @@ -2128,9 +2134,12 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address, case SIO_F71882_ID: sio_data->type = f71882fg; break; - case SIO_F71889_ID: + case SIO_F71889FG_ID: sio_data->type = f71889fg; break; + case SIO_F71889ED_ID: + sio_data->type = f71889ed; + break; case SIO_F8000_ID: sio_data->type = f8000; break;
_______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors