Index: /lm-sensors/trunk/lib/chips.c
===================================================================
--- /lm-sensors/trunk/lib/chips.c	(revision 4551)
+++ /lm-sensors/trunk/lib/chips.c	(revision 4563)
@@ -6142,4 +6142,70 @@
   };
 
+#define SENSORS_F71882FG_IN_FEATURES(nr) \
+	{ { SENSORS_F71882FG_IN(nr), "in" #nr, \
+		NOMAP, NOMAP, R }, \
+		NOSYSCTL, VALUE(3), 3 }
+
+#define SENSORS_F71882FG_TEMP_FEATURES(nr) \
+	{ { SENSORS_F71882FG_TEMP(nr), "temp" #nr, \
+		NOMAP, NOMAP, R }, \
+		NOSYSCTL, VALUE(3), 3 }, \
+	{ { SENSORS_F71882FG_TEMP_MAX(nr), "temp" #nr "_max", \
+		SENSORS_F71882FG_TEMP(nr), SENSORS_F71882FG_TEMP(nr), RW }, \
+		NOSYSCTL, VALUE(1), 3 }, \
+	{ { SENSORS_F71882FG_TEMP_MAX_HYST(nr), "temp" #nr "_max_hyst", \
+		SENSORS_F71882FG_TEMP(nr), SENSORS_F71882FG_TEMP(nr), RW }, \
+		NOSYSCTL, VALUE(2), 3 }, \
+	{ { SENSORS_F71882FG_TEMP_CRIT(nr), "temp" #nr "_crit", \
+		SENSORS_F71882FG_TEMP(nr), SENSORS_F71882FG_TEMP(nr), RW }, \
+		NOSYSCTL, VALUE(4), 3 }, \
+	{ { SENSORS_F71882FG_TEMP_CRIT_HYST(nr), "temp" #nr "_crit_hyst", \
+		SENSORS_F71882FG_TEMP(nr), SENSORS_F71882FG_TEMP(nr), R }, \
+		NOSYSCTL, VALUE(5), 3 }, \
+	{ { SENSORS_F71882FG_TEMP_ALARM(nr), "temp" #nr "_alarm", \
+		SENSORS_F71882FG_TEMP(nr), NOMAP, R }, \
+		NOSYSCTL, VALUE(1), 0 }, \
+	{ { SENSORS_F71882FG_TEMP_FAULT(nr), "temp" #nr "_fault", \
+		SENSORS_F71882FG_TEMP(nr), NOMAP, R }, \
+		NOSYSCTL, VALUE(2), 0 }, \
+	{ { SENSORS_F71882FG_TEMP_TYPE(nr), "temp" #nr "_type", \
+		SENSORS_F71882FG_TEMP(nr), NOMAP, R }, \
+		NOSYSCTL, VALUE(3), 0 }
+
+#define SENSORS_F71882FG_FAN_FEATURES(nr) \
+	{ { SENSORS_F71882FG_FAN(nr), "fan" #nr, \
+		NOMAP, NOMAP, R }, \
+		NOSYSCTL, VALUE(2), 0 }, \
+	{ { SENSORS_F71882FG_FAN_ALARM(nr), "fan" #nr "_alarm", \
+		SENSORS_F71882FG_FAN(nr), NOMAP, R }, \
+		NOSYSCTL, VALUE(1), 0 }
+
+static sensors_chip_feature f71882fg_features[] =
+{
+	SENSORS_F71882FG_IN_FEATURES(0),
+	SENSORS_F71882FG_IN_FEATURES(1),
+	{ { SENSORS_F71882FG_IN_MAX(1), "in1_max",
+		SENSORS_F71882FG_IN(1), SENSORS_F71882FG_IN(1), RW },
+		NOSYSCTL, VALUE(1), 3 },
+	{ { SENSORS_F71882FG_IN_ALARM(1), "in1_alarm",
+		SENSORS_F71882FG_IN(1), NOMAP, R },
+		NOSYSCTL, VALUE(1), 0 },
+	SENSORS_F71882FG_IN_FEATURES(2),
+	SENSORS_F71882FG_IN_FEATURES(3),
+	SENSORS_F71882FG_IN_FEATURES(4),
+	SENSORS_F71882FG_IN_FEATURES(5),
+	SENSORS_F71882FG_IN_FEATURES(6),
+	SENSORS_F71882FG_IN_FEATURES(7),
+	SENSORS_F71882FG_IN_FEATURES(8),
+	SENSORS_F71882FG_TEMP_FEATURES(1),
+	SENSORS_F71882FG_TEMP_FEATURES(2),
+	SENSORS_F71882FG_TEMP_FEATURES(3),
+	SENSORS_F71882FG_FAN_FEATURES(1),
+	SENSORS_F71882FG_FAN_FEATURES(2),
+	SENSORS_F71882FG_FAN_FEATURES(3),
+	SENSORS_F71882FG_FAN_FEATURES(4),
+	{ { 0 }, 0 }
+};
+
 sensors_chip_features sensors_chip_features_list[] =
 {
@@ -6258,4 +6324,5 @@
  { SENSORS_DME1737_PREFIX, dme1737_features },
  { SENSORS_APPLESMC_PREFIX, applesmc_features },
+ { SENSORS_F71882FG_PREFIX, f71882fg_features },
  { 0 }
 };
Index: /lm-sensors/trunk/lib/chips.h
===================================================================
--- /lm-sensors/trunk/lib/chips.h	(revision 4551)
+++ /lm-sensors/trunk/lib/chips.h	(revision 4563)
@@ -2314,3 +2314,23 @@
 #define SENSORS_APPLESMC_FAN_SAFE(n)		(0x81 + (n)) /* R */
 
+/* Fintek F71882FG and F71883FG chips */
+#define SENSORS_F71882FG_PREFIX		"f71882fg"
+
+/* in n from 0 to 8 */
+#define SENSORS_F71882FG_IN(n)			(1 + (n))
+#define SENSORS_F71882FG_IN_MAX(n)		(16 + (n))
+#define SENSORS_F71882FG_IN_ALARM(n)		(31 + (n))
+/* fan n from 1 to 4 */
+#define SENSORS_F71882FG_FAN(n)			(50 + (n))
+#define SENSORS_F71882FG_FAN_ALARM(n)		(60 + (n))
+/* temp n from 1 to 3 */
+#define SENSORS_F71882FG_TEMP(n)		(80 + (n))
+#define SENSORS_F71882FG_TEMP_MAX(n)		(90 + (n))
+#define SENSORS_F71882FG_TEMP_MAX_HYST(n)	(100 + (n))
+#define SENSORS_F71882FG_TEMP_CRIT(n)		(110 + (n))
+#define SENSORS_F71882FG_TEMP_CRIT_HYST(n)	(120 + (n))
+#define SENSORS_F71882FG_TEMP_ALARM(n)		(130 + (n))
+#define SENSORS_F71882FG_TEMP_FAULT(n)		(140 + (n))
+#define SENSORS_F71882FG_TEMP_TYPE(n)		(150 + (n))
+
 #endif /* def LIB_SENSORS_CHIPS_H */
Index: /lm-sensors/trunk/prog/sensors/main.c
===================================================================
--- /lm-sensors/trunk/prog/sensors/main.c	(revision 4551)
+++ /lm-sensors/trunk/prog/sensors/main.c	(revision 4563)
@@ -426,4 +426,5 @@
  	{ "dme1737", print_dme1737 },
 	{ "applesmc", print_applesmc },
+	{ "f71882fg", print_f71882fg },
 	{ NULL, NULL }
 };
Index: /lm-sensors/trunk/prog/sensors/chips.c
===================================================================
--- /lm-sensors/trunk/prog/sensors/chips.c	(revision 4551)
+++ /lm-sensors/trunk/prog/sensors/chips.c	(revision 4563)
@@ -6131,4 +6131,104 @@
 }
 
+static void print_f71882fg_in(const sensors_chip_name *name, int i)
+{
+  char *label;
+  double cur, max, alarm;
+  int valid;
+
+  if (!sensors_get_label_and_valid(*name, SENSORS_F71882FG_IN(i), &label,
+				   &valid) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_IN(i), &cur) && (i != 1 || (
+      !sensors_get_feature(*name, SENSORS_F71882FG_IN_MAX(i), &max) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_IN_ALARM(i), &alarm)))) {
+    if (valid) {
+      print_label(label, 10);
+      printf("%+6.2f V", cur);
+      if (i == 1)
+        printf("  (max = %+6.2f V)  %s", max, alarm ? "ALARM" : "");
+      printf("\n");        
+    }
+  } else {
+    printf("ERROR: Can't get in%d data!\n", i);
+  }
+  free(label);
+}
+
+static void print_f71882fg_fan(const sensors_chip_name *name, int i)
+{
+  char *label;
+  double cur, alarm;
+  int valid;
+
+  if (!sensors_get_label_and_valid(*name, SENSORS_F71882FG_FAN(i), &label,
+				   &valid) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_FAN(i), &cur) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_FAN_ALARM(i), &alarm)) {
+    if (valid) {
+      print_label(label, 10);
+      printf("%4.0f RPM  %s\n", cur, alarm ? "ALARM" : "");
+    }
+  } else {
+    printf("ERROR: Can't get fan%d data!\n", i);
+  }
+  free(label);
+}
+
+static void print_f71882fg_temp(const sensors_chip_name *name, int i)
+{
+  char *label;
+  double cur, max, max_hyst, crit, crit_hyst, alarm, fault, type;
+  int valid;
+
+  if (!sensors_get_label_and_valid(*name, SENSORS_F71882FG_TEMP(i), &label,
+				   &valid) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP(i), &cur) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_MAX(i), &max) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_MAX_HYST(i), &max_hyst) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_CRIT(i), &crit) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_CRIT_HYST(i), &crit_hyst) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_ALARM(i), &alarm) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_FAULT(i), &fault) &&
+      !sensors_get_feature(*name, SENSORS_F71882FG_TEMP_TYPE(i), &type)) {
+    if (valid) {
+      print_label(label, 10);
+      print_temp_info(cur, max, max_hyst, HYST, 0, 0);
+      printf("%s%s\n", fault ? "FAULT  " : "", alarm ? "ALARM" : "");
+
+      if (fahrenheit) {
+        crit = deg_ctof(crit);
+        crit_hyst = deg_ctof(crit_hyst);
+      }
+      printf("                    (crit = %+5.0f%s, hyst = %+5.0f%s)  ",
+             crit, degstr, crit_hyst, degstr);
+      printf("sensor = %s\n", (int)type == 0 ? "disabled" :
+                              (int)type == 1 ? "diode" :
+                              (int)type == 2 ? "transistor" :
+                              (int)type == 3 ? "thermal diode" :
+                              (int)type == 4 ? "thermistor" :
+                              (int)type == 5 ? "AMD AMDSI" :
+                              (int)type == 6 ? "Intel PECI" :
+                              "unknown");
+    }
+  } else {
+    printf("ERROR: Can't get temp%d data!\n", i);
+  }
+  free(label);
+}
+
+void print_f71882fg(const sensors_chip_name *name)
+{
+  int i;
+
+  for (i = 0; i <= 8; i++)
+    print_f71882fg_in(name, i);
+
+  for (i = 1; i <= 4; i++)
+    print_f71882fg_fan(name, i);
+
+  for (i = 1; i <= 3; i++)
+    print_f71882fg_temp(name, i);
+}
+
 void print_unknown_chip(const sensors_chip_name *name)
 {
Index: /lm-sensors/trunk/prog/sensors/chips.h
===================================================================
--- /lm-sensors/trunk/prog/sensors/chips.h	(revision 4551)
+++ /lm-sensors/trunk/prog/sensors/chips.h	(revision 4563)
@@ -80,4 +80,5 @@
 extern void print_dme1737(const sensors_chip_name *name);
 extern void print_applesmc(const sensors_chip_name *name);
+extern void print_f71882fg(const sensors_chip_name *name);
 
 #endif /* def PROG_SENSORS_CHIPS_H */
