diff -Naur --exclude='\.*' superiotool.old/ali.c superiotool/ali.c
--- superiotool.old/ali.c	2010-11-25 12:48:17.000000000 +0100
+++ superiotool/ali.c	2011-01-09 21:38:39.000000000 +0100
@@ -69,7 +69,7 @@
 	OUTB(0xbb, port);
 }
 
-void probe_idregs_ali(uint16_t port)
+const struct superio_registers* probe_idregs_ali(uint16_t port)
 {
 	uint16_t id;
 	uint8_t rev;
@@ -88,16 +88,17 @@
 		if (verbose)
 			printf(NOTFOUND "id=0x%04x, rev=0x%02x\n", id, rev);
 		exit_conf_mode_ali(port);
-		return;
+		return NULL;
 	}
 
 	printf("Found ALi %s (id=0x%04x, rev=0x%02x) at 0x%x\n",
 	       get_superio_name(reg_table, id), id, rev, port);
-	chip_found = 1;
 
 	dump_superio("ALi", reg_table, port, id, LDN_SEL);
 
 	exit_conf_mode_ali(port);
+
+	return get_superio_regs_entry(reg_table, id);
 }
 
 void print_ali_chips(void)
diff -Naur --exclude='\.*' superiotool.old/fintek.c superiotool/fintek.c
--- superiotool.old/fintek.c	2010-12-28 10:10:04.000000000 +0100
+++ superiotool/fintek.c	2011-01-09 21:39:24.000000000 +0100
@@ -283,7 +283,7 @@
 	{EOT}
 };
 
-void probe_idregs_fintek(uint16_t port)
+const struct superio_registers* probe_idregs_fintek(uint16_t port)
 {
 	uint16_t vid, did;
 
@@ -301,20 +301,21 @@
 		if (verbose)
 			printf(NOTFOUND "vid=0x%04x, id=0x%04x\n", vid, did);
 		exit_conf_mode_winbond_fintek_ite_8787(port);
-		return;
+		return NULL;
 	}
 
 	printf("Found Fintek %s (vid=0x%04x, id=0x%04x) at 0x%x\n",
 	       get_superio_name(reg_table, did), vid, did, port);
-	chip_found = 1;
 
 	dump_superio("Fintek", reg_table, port, did, LDN_SEL);
 
 	exit_conf_mode_winbond_fintek_ite_8787(port);
+
+	return get_superio_regs_entry(reg_table, did);
 }
 
 
-void probe_idregs_fintek_alternative(uint16_t port)
+const struct superio_registers* probe_idregs_fintek_alternative(uint16_t port)
 {
 	uint16_t vid, did;
 
@@ -332,16 +333,17 @@
 		if (verbose)
 			printf(NOTFOUND "vid=0x%04x, id=0x%04x\n", vid, did);
 		exit_conf_mode_fintek_7777(port);
-		return;
+		return NULL;
 	}
 
 	printf("Found Fintek %s (vid=0x%04x, id=0x%04x) at 0x%x\n",
 	       get_superio_name(reg_table, did), vid, did, port);
-	chip_found = 1;
 
 	dump_superio("Fintek", reg_table, port, did, LDN_SEL);
 
 	exit_conf_mode_fintek_7777(port);
+
+	return get_superio_regs_entry(reg_table, did);
 }
 
 void print_fintek_chips(void)
diff -Naur --exclude='\.*' superiotool.old/ite.c superiotool/ite.c
--- superiotool.old/ite.c	2011-01-03 21:06:37.000000000 +0100
+++ superiotool/ite.c	2011-01-09 21:53:48.000000000 +0100
@@ -800,9 +800,7 @@
 	regwrite(port, 0x02, 0x02);
 }
 
-static int chip_found_at_port;
-
-static void probe_idregs_ite_helper(const char *init, uint16_t port)
+static const struct superio_registers* probe_idregs_ite_helper(const char *init, uint16_t port)
 {
 	uint16_t id, chipver, ecport;
 
@@ -815,13 +813,11 @@
 	if (superio_unknown(reg_table, id)) {
 		if (verbose)
 			printf(NOTFOUND "id=0x%04x, rev=0x%01x\n", id, chipver);
-		return;
+		return NULL;
 	}
 
 	printf("Found ITE %s (id=0x%04x, rev=0x%01x) at 0x%x\n",
 	       get_superio_name(reg_table, id), id, chipver, port);
-	chip_found = 1;
-	chip_found_at_port = 1;
 
 	dump_superio("ITE", reg_table, port, id, LDN_SEL);
 
@@ -838,48 +834,52 @@
 		printf("Environment controller (0x%04x)\n", ecport);
 		dump_superio("ITE-EC", ec_table, ecport, id, LDN_SEL);
 	}
+
+	return get_superio_regs_entry(reg_table, id);
 }
 
-void probe_idregs_ite(uint16_t port)
+const struct superio_registers* probe_idregs_ite(uint16_t port)
 {
-	chip_found_at_port = 0;
-
+	const struct superio_registers* retval = NULL;
+   
 	if (port == 0x3f0 || port == 0x3bd || port == 0x370) {
 		enter_conf_mode_ite_legacy(port, initkey_it8661f);
-		probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
+		retval = probe_idregs_ite_helper("(init=legacy/it8661f) ", port);
 		exit_conf_mode_ite(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 
 		enter_conf_mode_ite_legacy(port, initkey_it8671f);
-		probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
+		retval = probe_idregs_ite_helper("(init=legacy/it8671f) ", port);
 		exit_conf_mode_ite(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 	} else {
 		enter_conf_mode_ite(port);
-		probe_idregs_ite_helper("(init=standard) ", port);
+		retval = probe_idregs_ite_helper("(init=standard) ", port);
 		exit_conf_mode_ite(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 
 		enter_conf_mode_ite_it8502e(port);
-		probe_idregs_ite_helper("(init=it8502e) ", port);
+		retval = probe_idregs_ite_helper("(init=it8502e) ", port);
 		exit_conf_mode_ite(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 
 		enter_conf_mode_ite_it8761e(port);
-		probe_idregs_ite_helper("(init=it8761e) ", port);
+		retval = probe_idregs_ite_helper("(init=it8761e) ", port);
 		exit_conf_mode_ite(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 
 		enter_conf_mode_ite_it8228e(port);
-		probe_idregs_ite_helper("(init=it8228e) ", port);
+		retval = probe_idregs_ite_helper("(init=it8228e) ", port);
 		exit_conf_mode_ite(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 
 		enter_conf_mode_winbond_fintek_ite_8787(port);
-		probe_idregs_ite_helper("(init=0x87,0x87) ", port);
+		retval = probe_idregs_ite_helper("(init=0x87,0x87) ", port);
 		exit_conf_mode_winbond_fintek_ite_8787(port);
-		if (chip_found_at_port) return;
+		if (retval != NULL) return retval;
 	}
+
+	return NULL;
 }
 
 void print_ite_chips(void)
diff -Naur --exclude='\.*' superiotool.old/nsc.c superiotool/nsc.c
--- superiotool.old/nsc.c	2010-11-25 12:48:17.000000000 +0100
+++ superiotool/nsc.c	2011-01-09 21:48:19.000000000 +0100
@@ -548,7 +548,7 @@
 	{EOT}
 };
 
-void probe_idregs_nsc(uint16_t port)
+const struct superio_registers* probe_idregs_nsc(uint16_t port)
 {
 	uint8_t id, rev;
 	uint16_t magic;
@@ -560,7 +560,7 @@
 		if (verbose)
 			printf(NOTFOUND "port=0x%02x, port+1=0x%02x\n",
 			       INB(port), INB(port + 1));
-		return;
+		return NULL;
 	}
 	id = INB(port + 1);
 
@@ -584,16 +584,17 @@
 	if (superio_unknown(reg_table, magic)) {
 		if (verbose)
 			printf(NOTFOUND "sid=0x%02x, srid=0x%02x\n", id, rev);
-		return;
+		return NULL;
 	}
 
 	printf("Found %s %s (sid=0x%02x, srid=0x%02x) at 0x%x\n",
 	       magic == 0x8f1 ? "Winbond" : "NSC",
 	       get_superio_name(reg_table, magic), id, rev, port);
-	chip_found = 1;
 
 	dump_superio(magic == 0x8f1 ? "Winbond" : "NSC",
 		     reg_table, port, magic, LDN_SEL);
+
+	return get_superio_regs_entry(reg_table, magic);
 }
 
 void print_nsc_chips(void)
diff -Naur --exclude='\.*' superiotool.old/nuvoton.c superiotool/nuvoton.c
--- superiotool.old/nuvoton.c	2011-01-03 21:04:17.000000000 +0100
+++ superiotool/nuvoton.c	2011-01-09 21:49:37.000000000 +0100
@@ -69,7 +69,7 @@
 	{EOT}
 };
 
-void probe_idregs_nuvoton(uint16_t port)
+const struct superio_registers* probe_idregs_nuvoton(uint16_t port)
 {
 	uint8_t sid, srid;
 	uint8_t chip_id = 0, chip_rev = 0;
@@ -93,14 +93,15 @@
 			printf(NOTFOUND
 			       "sid=0x%02x, id=0x%02x, rev=0x%02x\n", sid,
 			       chip_id, chip_rev);
-		return;
+		return NULL;
 	}
 
 	printf("Found Nuvoton %s (id=0x%02x, rev=0x%02x) at 0x%x\n",
 	       get_superio_name(reg_table, sid), chip_id, chip_rev, port);
-	chip_found = 1;
 
 	dump_superio("Nuvoton", reg_table, port, sid, LDN_SEL);
+
+	return get_superio_regs_entry(reg_table, sid);
 }
 
 void print_nuvoton_chips(void)
diff -Naur --exclude='\.*' superiotool.old/smsc.c superiotool/smsc.c
--- superiotool.old/smsc.c	2010-11-25 12:48:17.000000000 +0100
+++ superiotool/smsc.c	2011-01-09 22:08:06.000000000 +0100
@@ -761,7 +761,7 @@
 	OUTB(0xaa, port);
 }
 
-static void probe_idregs_smsc_helper(uint16_t port, uint8_t idreg,
+static const struct superio_registers* probe_idregs_smsc_helper(uint16_t port, uint8_t idreg,
 				     uint8_t revreg)
 {
 	uint8_t id, rev;
@@ -780,13 +780,12 @@
 		if (verbose)
 			printf(NOTFOUND "id=0x%02x, rev=0x%02x\n", id, rev);
 		exit_conf_mode_smsc(port);
-		return;
+		return NULL;
 	}
 
 	printf("Found %s %s (id=0x%02x, rev=0x%02x) at 0x%x\n",
 	       (id == 0x77 ? "ASUS" : "SMSC"), get_superio_name(reg_table, id),
 	       id, rev, port);
-	chip_found = 1;
 
 	dump_superio((id == 0x77 ? "ASUS" : "SMSC"), reg_table, port, id,
 		     LDN_SEL);
@@ -806,12 +805,21 @@
 	}
 
 	exit_conf_mode_smsc(port);
+
+	return get_superio_regs_entry(reg_table, id);
 }
 
-void probe_idregs_smsc(uint16_t port)
+const struct superio_registers* probe_idregs_smsc(uint16_t port)
 {
-	probe_idregs_smsc_helper(port, DEVICE_ID_REG, DEVICE_REV_REG);
-	probe_idregs_smsc_helper(port, DEVICE_ID_REG_OLD, DEVICE_REV_REG_OLD);
+	const struct superio_registers* retval = NULL;
+	
+	retval = probe_idregs_smsc_helper(port, DEVICE_ID_REG, DEVICE_REV_REG);
+	if (retval != NULL) return retval;
+	
+	retval = probe_idregs_smsc_helper(port, DEVICE_ID_REG_OLD, DEVICE_REV_REG_OLD);
+	if (retval != NULL) return retval;
+
+	return NULL;
 }
 
 void print_smsc_chips(void)
diff -Naur --exclude='\.*' superiotool.old/superiotool.c superiotool/superiotool.c
--- superiotool.old/superiotool.c	2011-01-03 21:15:12.000000000 +0100
+++ superiotool/superiotool.c	2011-01-09 22:07:22.000000000 +0100
@@ -28,6 +28,67 @@
 #include <unistd.h>
 #endif
 
+#define MAX_CHIPS_FOUND 10
+
+/** Table of which config ports to probe for each Super I/O family. */
+static const struct {
+	const struct superio_registers* (*probe_idregs) (uint16_t port);
+	int ports[MAXNUMPORTS]; /* Signed, as we need EOT. */
+} superio_ports_table[] = {
+	{probe_idregs_ali,	{0x3f0, 0x370, EOT}},
+	{probe_idregs_fintek,	{0x2e, 0x4e, EOT}},
+	{probe_idregs_fintek_alternative,	{0x2e, 0x4e, EOT}},
+	/* Only use 0x370 for ITE, but 0x3f0 or 0x3bd would also be valid. */
+	{probe_idregs_ite,	{0x25e, 0x2e, 0x4e, 0x370, EOT}},
+	{probe_idregs_nsc,	{0x2e, 0x4e, 0x15c, EOT}},
+	/* I/O pairs on Nuvoton EC chips can be configured by firmware in
+	 * addition to the following hardware strapping options. */
+	{probe_idregs_nuvoton, {0x164e, 0x2e, EOT}},
+	{probe_idregs_smsc,	{0x2e, 0x4e, 0x162e, 0x164e, 0x3f0, 0x370, EOT}},
+	{probe_idregs_winbond,	{0x2e, 0x4e, 0x3f0, 0x370, 0x250, EOT}},
+#ifdef PCI_SUPPORT
+	{probe_idregs_via,	{0x3f0, EOT}},
+#endif
+};
+
+/** Table of functions to print out supported Super I/O chips. */
+static const struct {
+	void (*print_list) (void);
+} vendor_print_functions[] = {
+	{print_ali_chips},
+	{print_fintek_chips},
+	{print_ite_chips},
+	{print_nsc_chips},
+	{print_nuvoton_chips},
+	{print_smsc_chips},
+	{print_winbond_chips},
+#ifdef PCI_SUPPORT
+	{print_via_chips},
+#endif
+};
+
+struct chip_found {
+	int16_t port;
+	const struct superio_registers* dev;
+};
+
+struct chip_found chips_found[MAX_CHIPS_FOUND]; 
+int num_chips_found = 0;
+
+/* if something's been detected on the port, return 1. Otherwise, return 0 = chip free. */
+static int port_already_inhabited(int port)
+{
+ int i;	
+
+	for (i=0; i < num_chips_found; i++) {
+		if (chips_found[i].port == port)
+			return 1;
+	}
+
+	return 0;
+}
+
+
 /* Command line options. */
 int dump = 0, verbose = 0, extra_dump = 0;
 
@@ -93,6 +154,24 @@
 	return "<unknown>";
 }
 
+const struct superio_registers* get_superio_regs_entry(const struct superio_registers reg_table[],
+			     uint16_t id)
+{
+	int i;
+
+	for (i = 0; /* Nothing */; i++) {
+		if (reg_table[i].superio_id == EOT)
+			break;
+
+		if ((uint16_t)reg_table[i].superio_id != id)
+			continue;
+
+		return &reg_table[i];
+	}
+
+	return NULL;
+}
+
 static void dump_regs(const struct superio_registers reg_table[],
 		      int i, int j, uint16_t port, uint8_t ldn_sel)
 {
@@ -305,14 +384,24 @@
 #endif
 
 	for (i = 0; i < ARRAY_SIZE(superio_ports_table); i++) {
-		for (j = 0; superio_ports_table[i].ports[j] != EOT; j++)
-                {
-			superio_ports_table[i].probe_idregs(
-				superio_ports_table[i].ports[j]);
+		for (j = 0; superio_ports_table[i].ports[j] != EOT; j++) {
+		  const struct superio_registers* dev_found = NULL;
+		  int port = superio_ports_table[i].ports[j];
+                 
+			if (! port_already_inhabited(port)) {
+				dev_found = superio_ports_table[i].probe_idregs(port);
+				if (dev_found != NULL) {
+					chips_found[num_chips_found].port = port;
+					chips_found[num_chips_found].dev = dev_found;
+					num_chips_found++;
+				} /* else no device found on this port by this 
+                                     vendor's probe - try another one */
+			} /* else some device has already been 
+                            detected here - try another port */
                 }
 	}
 
-	if (!chip_found)
+	if (num_chips_found == 0)
 		printf("No Super I/O found\n");
 
 #if defined(__FreeBSD__)
diff -Naur --exclude='\.*' superiotool.old/superiotool.h superiotool/superiotool.h
--- superiotool.old/superiotool.h	2010-11-25 12:48:17.000000000 +0100
+++ superiotool/superiotool.h	2011-01-09 21:32:07.000000000 +0100
@@ -142,8 +142,6 @@
 /* Command line parameters. */
 extern int dump, verbose, extra_dump;
 
-extern int chip_found;
-
 struct superio_registers {
 	int32_t superio_id;		/* Signed, as we need EOT. */
 	const char *name;		/* Super I/O name */
@@ -171,6 +169,8 @@
 int superio_unknown(const struct superio_registers reg_table[], uint16_t id);
 const char *get_superio_name(const struct superio_registers reg_table[],
 			     uint16_t id);
+const struct superio_registers* get_superio_regs_entry(const struct superio_registers reg_table[],
+			     uint16_t id);
 void dump_superio(const char *name, const struct superio_registers reg_table[],
 		  uint16_t port, uint16_t id, uint8_t ldn_sel);
 void dump_io(uint16_t iobase, uint16_t length);
@@ -179,75 +179,38 @@
 			const struct superio_registers reg_table[]);
 
 /* ali.c */
-void probe_idregs_ali(uint16_t port);
+const struct superio_registers* probe_idregs_ali(uint16_t port);
 void print_ali_chips(void);
 
 /* fintek.c */
-void probe_idregs_fintek(uint16_t port);
-void probe_idregs_fintek_alternative(uint16_t port);
+const struct superio_registers* probe_idregs_fintek(uint16_t port);
+const struct superio_registers* probe_idregs_fintek_alternative(uint16_t port);
 void print_fintek_chips(void);
 
 /* ite.c */
-void probe_idregs_ite(uint16_t port);
+const struct superio_registers* probe_idregs_ite(uint16_t port);
 void print_ite_chips(void);
 
 /* nsc.c */
-void probe_idregs_nsc(uint16_t port);
+const struct superio_registers* probe_idregs_nsc(uint16_t port);
 void print_nsc_chips(void);
 
 /* nuvoton.c */
-void probe_idregs_nuvoton(uint16_t port);
+const struct superio_registers* probe_idregs_nuvoton(uint16_t port);
 void print_nuvoton_chips(void);
 
 /* smsc.c */
-void probe_idregs_smsc(uint16_t port);
+const struct superio_registers* probe_idregs_smsc(uint16_t port);
 void print_smsc_chips(void);
 
 /* winbond.c */
-void probe_idregs_winbond(uint16_t port);
+const struct superio_registers* probe_idregs_winbond(uint16_t port);
 void print_winbond_chips(void);
 
 /* via.c */
 #ifdef PCI_SUPPORT
-void probe_idregs_via(uint16_t port);
+const struct superio_registers* probe_idregs_via(uint16_t port);
 void print_via_chips(void);
 #endif
 
-/** Table of which config ports to probe for each Super I/O family. */
-static const struct {
-	void (*probe_idregs) (uint16_t port);
-	int ports[MAXNUMPORTS]; /* Signed, as we need EOT. */
-} superio_ports_table[] = {
-	{probe_idregs_ali,	{0x3f0, 0x370, EOT}},
-	{probe_idregs_fintek,	{0x2e, 0x4e, EOT}},
-	{probe_idregs_fintek_alternative,	{0x2e, 0x4e, EOT}},
-	/* Only use 0x370 for ITE, but 0x3f0 or 0x3bd would also be valid. */
-	{probe_idregs_ite,	{0x25e, 0x2e, 0x4e, 0x370, EOT}},
-	{probe_idregs_nsc,	{0x2e, 0x4e, 0x15c, EOT}},
-	/* I/O pairs on Nuvoton EC chips can be configured by firmware in
-	 * addition to the following hardware strapping options. */
-	{probe_idregs_nuvoton, {0x164e, 0x2e, EOT}},
-	{probe_idregs_smsc,	{0x2e, 0x4e, 0x162e, 0x164e, 0x3f0, 0x370, EOT}},
-	{probe_idregs_winbond,	{0x2e, 0x4e, 0x3f0, 0x370, 0x250, EOT}},
-#ifdef PCI_SUPPORT
-	{probe_idregs_via,	{0x3f0, EOT}},
-#endif
-};
-
-/** Table of functions to print out supported Super I/O chips. */
-static const struct {
-	void (*print_list) (void);
-} vendor_print_functions[] = {
-	{print_ali_chips},
-	{print_fintek_chips},
-	{print_ite_chips},
-	{print_nsc_chips},
-	{print_nuvoton_chips},
-	{print_smsc_chips},
-	{print_winbond_chips},
-#ifdef PCI_SUPPORT
-	{print_via_chips},
-#endif
-};
-
 #endif
diff -Naur --exclude='\.*' superiotool.old/via.c superiotool/via.c
--- superiotool.old/via.c	2010-11-25 12:48:17.000000000 +0100
+++ superiotool/via.c	2011-01-09 22:04:52.000000000 +0100
@@ -73,7 +73,7 @@
 	pci_write_byte(dev, 0x85, vt82c686_conf);
 }
 
-void probe_idregs_via(uint16_t port)
+const struct superio_registers* probe_idregs_via(uint16_t port)
 {
 	uint16_t id;
 	uint8_t rev;
@@ -81,7 +81,7 @@
 	probing_for("VIA", "", port);
 
 	if (enter_conf_mode_via_vt82c686())
-		return;
+		return NULL;
 
 	id = regval(port, DEVICE_ID_VT82C686_REG);
 	rev = regval(port, DEVICE_REV_VT82C686_REG);
@@ -90,14 +90,15 @@
 		if (verbose)
 			printf(NOTFOUND "id=0x%04x, rev=0x%02x\n", id, rev);
 		exit_conf_mode_via_vt82c686();
-		return;
+		return NULL;
 	}
 
 	printf("Found VIA %s (id=0x%04x, rev=0x%02x) at 0x%x\n",
 	       get_superio_name(reg_table, id), id, rev, port);
-	chip_found = 1;
 
 	exit_conf_mode_via_vt82c686();
+
+	return get_superio_regs_entry(reg_table, id);
 }
 
 void print_via_chips(void)
diff -Naur --exclude='\.*' superiotool.old/winbond.c superiotool/winbond.c
--- superiotool.old/winbond.c	2011-01-03 21:06:37.000000000 +0100
+++ superiotool/winbond.c	2011-01-09 22:09:13.000000000 +0100
@@ -625,9 +625,7 @@
 	OUTB(0x86, port);
 }
 
-static int chip_found_at_port;
-
-static void probe_idregs_winbond_helper(const char *init, uint16_t port)
+static const struct superio_registers* probe_idregs_winbond_helper(const char *init, uint16_t port)
 {
 	uint16_t id, hwmport;
 	uint8_t devid, rev, olddevid;
@@ -654,7 +652,7 @@
 		if (verbose)
 			printf(NOTFOUND "id/oldid=0x%02x/0x%02x, rev=0x%02x\n",
 			       devid, olddevid, rev);
-		return;
+		return NULL;
 	}
 
 	if (olddevid >= 0x0a && olddevid <= 0x0d)
@@ -663,8 +661,6 @@
 	else
 		printf("Found Winbond %s (id=0x%02x, rev=0x%02x) at 0x%x\n",
 		       get_superio_name(reg_table, id), devid, rev, port);
-	chip_found = 1;
-	chip_found_at_port = 1;
 
 	dump_superio("Winbond", reg_table, port, id, LDN_SEL);
 
@@ -673,7 +669,8 @@
 
 		if ((regval(port, 0x30) & (1 << 0)) != (1 << 0)) {
 			printf("Hardware Monitor disabled or does not exist.\n");
-			return;
+			/* Yet the SuperIO chip is valid, so return a positive result! */
+			return get_superio_regs_entry(reg_table, id);
 		}
 
 		/* Get HWM base address (stored in LDN 0xb, index 0x60/0x61). */
@@ -687,31 +684,35 @@
 		dump_superio("Winbond-HWM", hwm_table, hwmport, id,
 			     WINBOND_HWM_SEL);
 	}
+
+	return get_superio_regs_entry(reg_table, id);
 }
 
-void probe_idregs_winbond(uint16_t port)
+const struct superio_registers* probe_idregs_winbond(uint16_t port)
 {
-	chip_found_at_port = 0;
-
+	const struct superio_registers* retval = NULL;
+   
 	enter_conf_mode_winbond_88(port);
-	probe_idregs_winbond_helper("(init=0x88) ", port);
+	retval = probe_idregs_winbond_helper("(init=0x88) ", port);
 	exit_conf_mode_winbond_fintek_ite_8787(port);
-	if (chip_found_at_port) return;
+	if (retval != NULL) return retval;
 
 	enter_conf_mode_winbond_89(port);
-	probe_idregs_winbond_helper("(init=0x89) ", port);
+	retval = probe_idregs_winbond_helper("(init=0x89) ", port);
 	exit_conf_mode_winbond_fintek_ite_8787(port);
-	if (chip_found_at_port) return;
+	if (retval != NULL) return retval;
 
 	enter_conf_mode_winbond_86(port);
-	probe_idregs_winbond_helper("(init=0x86,0x86) ", port);
+	retval = probe_idregs_winbond_helper("(init=0x86,0x86) ", port);
 	exit_conf_mode_winbond_fintek_ite_8787(port);
-	if (chip_found_at_port) return;
+	if (retval != NULL) return retval;
 
 	enter_conf_mode_winbond_fintek_ite_8787(port);
-	probe_idregs_winbond_helper("(init=0x87,0x87) ", port);
+	retval = probe_idregs_winbond_helper("(init=0x87,0x87) ", port);
 	exit_conf_mode_winbond_fintek_ite_8787(port);
-	if (chip_found_at_port) return;
+	if (retval != NULL) return retval;
+
+        return(NULL);
 }
 
 void print_winbond_chips(void)
