diff --git a/82802ab.c b/82802ab.c
index 8aa189d4d6ee48d477bd9db06a6485adfa6190ea..d7194c147a2524e64f63ee2d7695e5fbb9fd9084 100644
--- a/82802ab.c
+++ b/82802ab.c
@@ -47,14 +47,11 @@ int probe_82802ab(struct flashchip *flash)
 	chipaddr bios = flash->virtual_memory;
 	uint8_t id1, id2;
 
-#if 0
-	chip_writeb(0xAA, bios + 0x5555);
-	chip_writeb(0x55, bios + 0x2AAA);
-	chip_writeb(0x90, bios + 0x5555);
-#endif
-
-	chip_writeb(0xff, bios);
+	/* Reset to get a clean state */
+	chip_writeb(0xFF, bios);
 	programmer_delay(10);
+
+	/* Enter ID mode */
 	chip_writeb(0x90, bios);
 	programmer_delay(10);
 
@@ -62,9 +59,7 @@ int probe_82802ab(struct flashchip *flash)
 	id2 = chip_readb(bios + 0x01);
 
 	/* Leave ID mode */
-	chip_writeb(0xAA, bios + 0x5555);
-	chip_writeb(0x55, bios + 0x2AAA);
-	chip_writeb(0xF0, bios + 0x5555);
+	chip_writeb(0xFF, bios);
 
 	programmer_delay(10);
 
@@ -81,7 +76,6 @@ int probe_82802ab(struct flashchip *flash)
 uint8_t wait_82802ab(chipaddr bios)
 {
 	uint8_t status;
-	uint8_t id1, id2;
 
 	chip_writeb(0x70, bios);
 	if ((chip_readb(bios) & 0x80) == 0) {	// it's busy
@@ -90,18 +84,8 @@ uint8_t wait_82802ab(chipaddr bios)
 
 	status = chip_readb(bios);
 
-	// put another command to get out of status register mode
-
-	chip_writeb(0x90, bios);
-	programmer_delay(10);
-
-	id1 = chip_readb(bios);
-	id2 = chip_readb(bios + 0x01);
-
-	// this is needed to jam it out of "read id" mode
-	chip_writeb(0xAA, bios + 0x5555);
-	chip_writeb(0x55, bios + 0x2AAA);
-	chip_writeb(0xF0, bios + 0x5555);
+	/* Reset to get a clean state */
+	chip_writeb(0xFF, bios);
 
 	return status;
 }
diff --git a/stm50flw0x0x.c b/stm50flw0x0x.c
index 3a90d6b0de6bfcd1b7e6a919d9007bec451b401f..8cbafe2b5d3727d941b12f2d0db196d77010bf04 100644
--- a/stm50flw0x0x.c
+++ b/stm50flw0x0x.c
@@ -42,49 +42,10 @@ void protect_stm50flw0x0x(chipaddr bios)
 
 int probe_stm50flw0x0x(struct flashchip *flash)
 {
-	chipaddr bios = flash->virtual_memory;
-	uint8_t id1, id2;
-	uint32_t largeid1, largeid2;
-
-	/* Issue JEDEC Product ID Entry command */
-	chip_writeb(0xAA, bios + 0x5555);
-	programmer_delay(10);
-	chip_writeb(0x55, bios + 0x2AAA);
-	programmer_delay(10);
-	chip_writeb(0x90, bios + 0x5555);
-	programmer_delay(40);
-
-	/* Read product ID */
-	id1 = chip_readb(bios);
-	id2 = chip_readb(bios + 0x01);
-	largeid1 = id1;
-	largeid2 = id2;
-
-	/* Check if it is a continuation ID, this should be a while loop. */
-	if (id1 == 0x7F) {
-		largeid1 <<= 8;
-		id1 = chip_readb(bios + 0x100);
-		largeid1 |= id1;
-	}
-	if (id2 == 0x7F) {
-		largeid2 <<= 8;
-		id2 = chip_readb(bios + 0x101);
-		largeid2 |= id2;
-	}
-
-	/* Issue JEDEC Product ID Exit command */
-	chip_writeb(0xAA, bios + 0x5555);
-	programmer_delay(10);
-	chip_writeb(0x55, bios + 0x2AAA);
-	programmer_delay(10);
-	chip_writeb(0xF0, bios + 0x5555);
-	programmer_delay(40);
-
-	printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, largeid1,
-		     largeid2);
+	int result = probe_jedec(flash);
 
-	if (largeid1 != flash->manufacture_id || largeid2 != flash->model_id)
-		return 0;
+	if (!result)
+		return result;
 
 	map_flash_registers(flash);
 
diff --git a/w39v040c.c b/w39v040c.c
index 7fccd538b03ce554c7b7212f2cce25a7630bccc3..bfa98538c732d348e99b5b0b2969339181551369 100644
--- a/w39v040c.c
+++ b/w39v040c.c
@@ -23,7 +23,11 @@
 int probe_w39v040c(struct flashchip *flash)
 {
 	chipaddr bios = flash->virtual_memory;
-	uint8_t id1, id2, lock;
+	int result = probe_jedec(flash);
+	uint8_t lock;
+
+	if (!result)
+		return result;
 
 	chip_writeb(0xAA, bios + 0x5555);
 	programmer_delay(10);
@@ -32,8 +36,6 @@ int probe_w39v040c(struct flashchip *flash)
 	chip_writeb(0x90, bios + 0x5555);
 	programmer_delay(10);
 
-	id1 = chip_readb(bios);
-	id2 = chip_readb(bios + 1);
 	lock = chip_readb(bios + 0xfff2);
 
 	chip_writeb(0xAA, bios + 0x5555);
@@ -43,17 +45,9 @@ int probe_w39v040c(struct flashchip *flash)
 	chip_writeb(0xF0, bios + 0x5555);
 	programmer_delay(40);
 
-	printf_debug("%s: id1 0x%02x, id2 0x%02x", __func__, id1, id2);
-	if (!oddparity(id1))
-		printf_debug(", id1 parity violation");
-	printf_debug("\n");
-	if (flash->manufacture_id == id1 && flash->model_id == id2) {
-		printf("%s: Boot block #TBL is %slocked, rest of chip #WP is %slocked.\n",
-			__func__, lock & 0x4 ? "" : "un", lock & 0x8 ? "" : "un");
-		return 1;
-	}
-
-	return 0;
+	printf("%s: Boot block #TBL is %slocked, rest of chip #WP is %slocked.\n",
+		__func__, lock & 0x4 ? "" : "un", lock & 0x8 ? "" : "un");
+	return 1;
 }
 
 int erase_w39v040c(struct flashchip *flash)
diff --git a/w39v080fa.c b/w39v080fa.c
index 96e83a8e16b9d654584b4bb7e95fb0f1ab7d222e..580657f960341c8c46f8bebbd1cd6e6556133471 100644
--- a/w39v080fa.c
+++ b/w39v080fa.c
@@ -22,29 +22,10 @@
 
 int probe_winbond_fwhub(struct flashchip *flash)
 {
-	chipaddr bios = flash->virtual_memory;
-	uint8_t id1, id2;
-
-	/* Product Identification Entry */
-	chip_writeb(0xAA, bios + 0x5555);
-	chip_writeb(0x55, bios + 0x2AAA);
-	chip_writeb(0x90, bios + 0x5555);
-	programmer_delay(10);
-
-	/* Read product ID */
-	id1 = chip_readb(bios);
-	id2 = chip_readb(bios + 0x01);
+	int result = probe_jedec(flash);
 
-	/* Product Identifixation Exit */
-	chip_writeb(0xAA, bios + 0x5555);
-	chip_writeb(0x55, bios + 0x2AAA);
-	chip_writeb(0xF0, bios + 0x5555);
-	programmer_delay(10);
-
-	printf_debug("%s: id1 0x%x, id2 0x%x\n", __func__, id1, id2);
-
-	if (id1 != flash->manufacture_id || id2 != flash->model_id)
-		return 0;
+	if (!result)
+		return result;
 
 	map_flash_registers(flash);