summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOllie Lho <ollie@sis.com.tw>2005-01-11 02:48:22 +0000
committerOllie Lho <ollie@sis.com.tw>2005-01-11 02:48:22 +0000
commita1439cfdee780d20eafb787cfef2abae9eea00b1 (patch)
tree606d368c9e428ab5d10ef1e4b4718a0aaa360163
parentefa28589b1c2c402e62c8d5b1e32e5e45b164c2d (diff)
downloadflashrom-a1439cfdee780d20eafb787cfef2abae9eea00b1.tar.gz
flashrom-a1439cfdee780d20eafb787cfef2abae9eea00b1.tar.bz2
flashrom-a1439cfdee780d20eafb787cfef2abae9eea00b1.zip
Add dedicated chip erase function for SST49LF040
Corresponding to flashrom svn r31 and coreboot v2 svn r1852.
-rw-r--r--flash_rom.c2
-rw-r--r--sst49lf040.c19
-rw-r--r--sst49lf040.h1
3 files changed, 19 insertions, 3 deletions
diff --git a/flash_rom.c b/flash_rom.c
index 35a9f5098..ceb56ad8f 100644
--- a/flash_rom.c
+++ b/flash_rom.c
@@ -66,7 +66,7 @@ struct flashchip flashchips[] = {
{"SST39VF020", SST_ID, SST_39VF020, NULL, 256, 4096,
probe_jedec, erase_chip_jedec, write_39sf020,NULL},
{"SST49LF040", SST_ID, SST_49LF040, NULL, 512, 4096,
- probe_jedec, erase_chip_jedec, write_49lf040,NULL},
+ probe_jedec, erase_49lf040, write_49lf040,NULL},
{"SST49LF080A", SST_ID, SST_49LF080A, NULL, 1024, 4096,
probe_jedec, erase_chip_jedec, write_49lf040,NULL},
{"SST49LF002A/B", SST_ID, SST_49LF002A, NULL, 256, 16 * 1024,
diff --git a/sst49lf040.c b/sst49lf040.c
index 624a8655e..f19b91e1c 100644
--- a/sst49lf040.c
+++ b/sst49lf040.c
@@ -30,6 +30,21 @@
#include "jedec.h"
#include "sst49lf040.h"
+int erase_49lf040(struct flashchip *flash)
+{
+ int i;
+ int total_size = flash->total_size * 1024;
+ int page_size = flash->page_size;
+ volatile char *bios = flash->virt_addr;
+
+ for (i = 0; i < total_size / page_size; i++) {
+ /* Chip erase only works in parallel programming mode
+ * for the 49lf040. Use sector-erase instead */
+ erase_sector_jedec(bios, i * page_size);
+ }
+ return 0;
+}
+
int write_49lf040(struct flashchip *flash, unsigned char *buf)
{
int i;
@@ -40,8 +55,8 @@ int write_49lf040(struct flashchip *flash, unsigned char *buf)
printf("Programming Page: ");
for (i = 0; i < total_size / page_size; i++) {
/* erase the page before programming
- * Chip erase only works in parallel programming mode for the 49lf040.
- * Use sector-erase instead */
+ * Chip erase only works in parallel programming mode
+ * for the 49lf040. Use sector-erase instead */
erase_sector_jedec(bios, i * page_size);
/* write to the sector */
diff --git a/sst49lf040.h b/sst49lf040.h
index 9e3cfa423..79dfec99f 100644
--- a/sst49lf040.h
+++ b/sst49lf040.h
@@ -1,6 +1,7 @@
#ifndef __SST49LF040_H__
#define __SST49LF040_H__ 1
+extern int erase_49lf040(struct flashchip *flash);
extern int write_49lf040(struct flashchip *flash, unsigned char *buf);
#endif /* !__SST49LF040_H__ */