Fintek F71889ED is unsupported (hack patch included)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux