aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--flash.h6
-rw-r--r--flashchips.c18
-rw-r--r--jedec.c4
-rw-r--r--sst_fwhub.c2
4 files changed, 24 insertions, 6 deletions
diff --git a/flash.h b/flash.h
index 4bbd9a7f..8e0ad7f6 100644
--- a/flash.h
+++ b/flash.h
@@ -225,6 +225,7 @@ struct flashchip {
#define TEST_OK_WRITE (1 << 3)
#define TEST_OK_PR (TEST_OK_PROBE | TEST_OK_READ)
#define TEST_OK_PRE (TEST_OK_PROBE | TEST_OK_READ | TEST_OK_ERASE)
+#define TEST_OK_PRW (TEST_OK_PROBE | TEST_OK_READ | TEST_OK_WRITE)
#define TEST_OK_PREW (TEST_OK_PROBE | TEST_OK_READ | TEST_OK_ERASE | TEST_OK_WRITE)
#define TEST_OK_MASK 0x0f
@@ -596,8 +597,8 @@ int write_byte_program_jedec(chipaddr bios, uint8_t *src,
int probe_jedec(struct flashchip *flash);
int erase_chip_jedec(struct flashchip *flash);
int write_jedec(struct flashchip *flash, uint8_t *buf);
-int erase_sector_jedec(struct flashchip *flash, unsigned int page, int pagesize);
-int erase_block_jedec(struct flashchip *flash, unsigned int page, int blocksize);
+int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int pagesize);
+int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int blocksize);
int write_sector_jedec(chipaddr bios, uint8_t *src,
chipaddr dst, unsigned int page_size);
@@ -657,6 +658,7 @@ int write_49lfxxxc(struct flashchip *flash, uint8_t *buf);
/* sst_fwhub.c */
int probe_sst_fwhub(struct flashchip *flash);
int erase_sst_fwhub(struct flashchip *flash);
+int erase_sst_fwhub_block(struct flashchip *flash, unsigned int offset, unsigned int page_size);
int write_sst_fwhub(struct flashchip *flash, uint8_t *buf);
/* w39v040c.c */
diff --git a/flashchips.c b/flashchips.c
index 83f6e96c..1292d3e4 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -2141,6 +2141,9 @@ struct flashchip flashchips[] = {
},
{
+ /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
+ * and is only honored for 64k block erase, but not 4k sector erase.
+ */
.vendor = "SST",
.name = "SST49LF004A/B",
.bustype = CHIP_BUSTYPE_FWH, /* A/A Mux */
@@ -2151,7 +2154,20 @@ struct flashchip flashchips[] = {
.tested = TEST_OK_PREW,
.probe = probe_sst_fwhub,
.probe_timing = 1, /* 150 ns | routine is wrapper to probe_jedec (sst_fwhub.c) */
- .erase = erase_sst_fwhub,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 128} },
+ .block_erase = erase_sector_jedec, /* missing unlock */
+ }, {
+ .eraseblocks = { {64 * 1024, 8} },
+ .block_erase = erase_sst_fwhub_block, /* same as erase_sector_block, but with unlock */
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = NULL, /* AA 55 80 AA 55 10, only in PP mode */
+ },
+ },
.write = write_sst_fwhub,
.read = read_memmapped,
},
diff --git a/jedec.c b/jedec.c
index d51f122c..7029e980 100644
--- a/jedec.c
+++ b/jedec.c
@@ -175,7 +175,7 @@ int probe_jedec(struct flashchip *flash)
return 0;
}
-int erase_sector_jedec(struct flashchip *flash, unsigned int page, int pagesize)
+int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int pagesize)
{
chipaddr bios = flash->virtual_memory;
@@ -204,7 +204,7 @@ int erase_sector_jedec(struct flashchip *flash, unsigned int page, int pagesize)
return 0;
}
-int erase_block_jedec(struct flashchip *flash, unsigned int block, int blocksize)
+int erase_block_jedec(struct flashchip *flash, unsigned int block, unsigned int blocksize)
{
chipaddr bios = flash->virtual_memory;
diff --git a/sst_fwhub.c b/sst_fwhub.c
index e7ae9e93..ed454077 100644
--- a/sst_fwhub.c
+++ b/sst_fwhub.c
@@ -94,7 +94,7 @@ int probe_sst_fwhub(struct flashchip *flash)
return 1;
}
-int erase_sst_fwhub_block(struct flashchip *flash, int offset, int page_size)
+int erase_sst_fwhub_block(struct flashchip *flash, unsigned int offset, unsigned int page_size)
{
uint8_t blockstatus = clear_sst_fwhub_block_lock(flash, offset);