diff --git a/82802ab.c b/82802ab.c
index 1316939fb8a7436756217f9159082b7991177237..3aa76b4b793d8d31a3aded10d8dcf3c909748a45 100644
--- a/82802ab.c
+++ b/82802ab.c
@@ -205,3 +205,52 @@ int write_82802ab(struct flashchip *flash, uint8_t *buf)
 
 	return 0;
 }
+
+int unlock_28f004s5(struct flashrom *flash)
+{
+	chipaddr bios = flash->virtual_memory;
+	uint8_t mcfg, bcfg, need_unlock = 0, can_unlock = 0;
+
+	/* Clear status register */
+	chip_writeb(0x50, bios);
+
+	/* Read identifier codes */
+	chip_writeb(0x90, bios);
+
+	/* Read master lock-bit */
+	mcfg = chip_readb(bios + 0x3);
+	msg_cinfo("master lock is ");
+	if (mcfg) {
+		msg_cdbg("locked!\n");
+	} else {
+		msg_cdbg("unlocked!\n");
+		can_unlock = 1;
+	}
+	
+	/* Read block lock-bits */
+	for (i = 0; i < flash->total_size * 1024; i+= (64 * 1024)) {
+		bcfg = chip_readb(bios + i + 2); // read block lock config
+		msg_cdbg("block lock at %06x is %slocked!\n", i, bcfg ? "" : "un");
+		if (bcfg) {
+			need_unlock = 1;
+		}
+	}
+
+	/* Reset chip */
+	chip_writeb(0xFF, bios);
+
+	/* Unlock: clear block lock-bits, if needed */
+	if (can_unlock && need_unlock) {
+		chip_writeb(0x60, bios);
+		chip_writeb(0xD0, bios);
+		chip_writeb(0xFF, bios);
+	}
+
+	/* Error: master locked or a block is locked */
+	if (!can_unlock && need_unlock) {
+		msg_cerr("At least one block is locked and lockdown is active!\n");
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/flashchips.c b/flashchips.c
index 86c766bec22f964e951f478baac4f071177cf6f7..1d239da6ea1af6831c617f5320d34162f5551eb8 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -2316,7 +2316,7 @@ struct flashchip flashchips[] = {
 		.model_id	= P28F001BXB,
 		.total_size	= 128,
 		.page_size	= 128 * 1024, /* 8k + 2x4k + 112k */
-		.tested		= TEST_BAD_WRITE,
+		.tested		= TEST_UNTESTED,
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
@@ -2330,7 +2330,7 @@ struct flashchip flashchips[] = {
 				.block_erase = erase_block_82802ab,
 			},
 		},
-		.write		= NULL,
+		.write		= write_82802ab,
 		.read		= read_memmapped,
 	},
 
@@ -2342,7 +2342,7 @@ struct flashchip flashchips[] = {
 		.model_id	= P28F001BXT,
 		.total_size	= 128,
 		.page_size	= 128 * 1024, /* 112k + 2x4k + 8k */
-		.tested		= TEST_BAD_WRITE,
+		.tested		= TEST_UNTESTED,
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
@@ -2356,7 +2356,7 @@ struct flashchip flashchips[] = {
 				.block_erase = erase_block_82802ab,
 			},
 		},
-		.write		= NULL,
+		.write		= write_82802ab,
 		.read		= read_memmapped,
 	},
 
@@ -2368,7 +2368,6 @@ struct flashchip flashchips[] = {
 		.model_id	= E_28F004S5,
 		.total_size	= 512,
 		.page_size	= 256,
-		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_82802ab,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
@@ -2379,7 +2378,7 @@ struct flashchip flashchips[] = {
 				.block_erase = erase_block_82802ab,
 			},
 		},
-		.unlock		= unlock_82802ab,
+		.unlock		= unlock_28f004s5,
 		.write		= write_82802ab,
 		.read		= read_memmapped,
 	},