Sst49lfxxxc chips are functionally the same as 82802ab chips

Sst49lfxxxc software status register is functionally the same as the 
82802ab status register, "Block Protect Status"(49lfxxxc) can be treated 
the same as "Device Protect Status"(82802ab).
Erase_block_49lfxxxc is the same command sequence as erase_block_82802ab.
Add unlock_49lfxxxc to chips definitions.
Write_sector_49lfxxxc is the same as write_page_82802ab.

Corresponding to flashrom svn r972.

Signed-off-by: Sean Nelson <audiohacked@gmail.com>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
diff --git a/chipdrivers.h b/chipdrivers.h
index c96f445..6d5cef0 100644
--- a/chipdrivers.h
+++ b/chipdrivers.h
@@ -100,11 +100,7 @@
 int write_28sf040(struct flashchip *flash, uint8_t *buf);
 
 /* sst49lfxxxc.c */
-int probe_49lfxxxc(struct flashchip *flash);
-int erase_49lfxxxc(struct flashchip *flash);
 int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size);
-int erase_block_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size);
-int erase_chip_49lfxxxc(struct flashchip *flash, unsigned int addr, unsigned int blocksize);
 int write_49lfxxxc(struct flashchip *flash, uint8_t *buf);
 int unlock_49lfxxxc(struct flashchip *flash);
 
diff --git a/flashchips.c b/flashchips.c
index 47cdc32..c69dd57 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -4190,9 +4190,10 @@
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
+		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
@@ -4252,9 +4253,10 @@
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
+		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
@@ -4283,9 +4285,10 @@
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
+		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
@@ -4459,7 +4462,7 @@
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
 		.unlock		= unlock_49lfxxxc,
diff --git a/sst49lfxxxc.c b/sst49lfxxxc.c
index 9f9ee30..e7e5b61 100644
--- a/sst49lfxxxc.c
+++ b/sst49lfxxxc.c
@@ -24,19 +24,6 @@
 #include "flash.h"
 #include "chipdrivers.h"
 
-#define SECTOR_ERASE		0x30
-#define BLOCK_ERASE		0x20
-#define ERASE			0xD0
-#define AUTO_PGRM		0x10
-#define RESET			0xFF
-#define READ_ID			0x90
-#define READ_STATUS		0x70
-#define CLEAR_STATUS		0x50
-
-#define STATUS_BPS		(1 << 1)
-#define	STATUS_ESS		(1 << 6)
-#define	STATUS_WSMS		(1 << 7)
-
 int unlock_block_49lfxxxc(struct flashchip *flash, unsigned long address, unsigned char bits)
 {
 	unsigned long lock = flash->virtual_registers + address + 2;
@@ -90,21 +77,13 @@
 
 int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size)
 {
-	unsigned char status;
+	uint8_t status;
 	chipaddr bios = flash->virtual_memory;
 
-	chip_writeb(SECTOR_ERASE, bios);
-	chip_writeb(ERASE, bios + address);
+	chip_writeb(0x30, bios);
+	chip_writeb(0xD0, bios + address);
 
-	do {
-		status = chip_readb(bios);
-		if (status & (STATUS_ESS | STATUS_BPS)) {
-			printf("sector erase FAILED at address=0x%08lx status=0x%01x\n", bios + address, status);
-			chip_writeb(CLEAR_STATUS, bios);
-			return (-1);
-		}
-	} while (!(status & STATUS_WSMS));
-	chip_writeb(RESET, bios);
+	status = wait_82802ab(bios);
 
 	if (check_erased_range(flash, address, sector_size)) {
 		fprintf(stderr, "ERASE FAILED!\n");
@@ -113,101 +92,6 @@
 	return 0;
 }
 
-int erase_block_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int block_size)
-{
-	unsigned char status;
-	chipaddr bios = flash->virtual_memory;
-
-	chip_writeb(BLOCK_ERASE, bios);
-	chip_writeb(ERASE, bios + address);
-
-	do {
-		status = chip_readb(bios);
-		if (status & (STATUS_ESS | STATUS_BPS)) {
-			printf("block erase FAILED at address=0x%08lx status=0x%01x\n", bios + address, status);
-			chip_writeb(CLEAR_STATUS, bios);
-			return (-1);
-		}
-	} while (!(status & STATUS_WSMS));
-	chip_writeb(RESET, bios);
-
-	if (check_erased_range(flash, address, block_size)) {
-		fprintf(stderr, "ERASE FAILED!\n");
-		return -1;
-	}
-	return 0;
-}
-
-static int write_sector_49lfxxxc(chipaddr bios, uint8_t *src, chipaddr dst,
-				 unsigned int page_size)
-{
-	int i;
-	unsigned char status;
-
-	chip_writeb(CLEAR_STATUS, bios);
-	for (i = 0; i < page_size; i++) {
-		/* transfer data from source to destination */
-		if (*src == 0xFF) {
-			dst++, src++;
-			/* If the data is 0xFF, don't program it */
-			continue;
-		}
-		/*issue AUTO PROGRAM command */
-		chip_writeb(AUTO_PGRM, bios);
-		chip_writeb(*src++, dst++);
-
-		do {
-			status = chip_readb(bios);
-			if (status & (STATUS_ESS | STATUS_BPS)) {
-				printf("sector write FAILED at address=0x%08lx status=0x%01x\n", dst, status);
-				chip_writeb(CLEAR_STATUS, bios);
-				return (-1);
-			}
-		} while (!(status & STATUS_WSMS));
-	}
-
-	return 0;
-}
-
-int probe_49lfxxxc(struct flashchip *flash)
-{
-	chipaddr bios = flash->virtual_memory;
-	uint8_t id1, id2;
-
-	chip_writeb(RESET, bios);
-
-	chip_writeb(READ_ID, bios);
-	id1 = chip_readb(bios);
-	id2 = chip_readb(bios + 0x01);
-
-	chip_writeb(RESET, bios);
-
-	printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2);
-
-	if (!(id1 == flash->manufacture_id && id2 == flash->model_id))
-		return 0;
-
-	map_flash_registers(flash);
-
-	return 1;
-}
-
-int erase_49lfxxxc(struct flashchip *flash)
-{
-	chipaddr bios = flash->virtual_memory;
-	int i;
-	unsigned int total_size = flash->total_size * 1024;
-
-	write_lockbits_49lfxxxc(flash, 0);
-	for (i = 0; i < total_size; i += flash->page_size)
-		if (erase_sector_49lfxxxc(flash, i, flash->page_size))
-			return (-1);
-
-	chip_writeb(RESET, bios);
-
-	return 0;
-}
-
 int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
 {
 	int i;
@@ -226,13 +110,13 @@
 
 		/* write to the sector */
 		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_sector_49lfxxxc(bios, buf + i * page_size,
+		write_page_82802ab(bios, buf + i * page_size,
 				      bios + i * page_size, page_size);
 		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 	}
 	printf("\n");
 
-	chip_writeb(RESET, bios);
+	chip_writeb(0xFF, bios);
 
 	return 0;
 }