diff options
author | Wolfgang Denk <wd@denx.de> | 2008-02-15 00:14:26 +0100 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2008-02-15 00:14:26 +0100 |
commit | 92915741fc7c77175680e036965fb88d7552d743 (patch) | |
tree | ea4fd23ae70a1e9f444582cf98529dc21358e612 /board/atmel/atstk1000/flash.c | |
parent | d9da0a394a141cf188d646dd89e30c083526ce77 (diff) | |
parent | d38da537943cd36356b9d3d9d9b60533554b81d8 (diff) | |
download | talos-obmc-uboot-92915741fc7c77175680e036965fb88d7552d743.tar.gz talos-obmc-uboot-92915741fc7c77175680e036965fb88d7552d743.zip |
Merge branch 'master' of git://www.denx.de/git/u-boot-avr32
Diffstat (limited to 'board/atmel/atstk1000/flash.c')
-rw-r--r-- | board/atmel/atstk1000/flash.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/board/atmel/atstk1000/flash.c b/board/atmel/atstk1000/flash.c index 93d790f173..40478258e7 100644 --- a/board/atmel/atstk1000/flash.c +++ b/board/atmel/atstk1000/flash.c @@ -159,7 +159,7 @@ int __flashprog write_buff(flash_info_t *info, uchar *src, { unsigned long flags; uint16_t *base, *p, *s, *end; - uint16_t word, status; + uint16_t word, status, status1; int ret = ERR_OK; if (addr < info->start[0] @@ -194,20 +194,33 @@ int __flashprog write_buff(flash_info_t *info, uchar *src, sync_write_buffer(); /* Wait for completion */ + status1 = readw(p); do { /* TODO: Timeout */ - status = readw(p); - } while ((status != word) && !(status & 0x28)); + status = status1; + status1 = readw(p); + } while (((status ^ status1) & 0x40) /* toggled */ + && !(status1 & 0x28)); /* error bits */ - writew(0xf0, base); - readw(base); - - if (status != word) { - printf("Flash write error at address 0x%p: 0x%02x\n", - p, status); + /* + * We'll need to check once again for toggle bit + * because the toggle bit may stop toggling as I/O5 + * changes to "1" (ref at49bv642.pdf p9) + */ + status1 = readw(p); + status = readw(p); + if ((status ^ status1) & 0x40) { + printf("Flash write error at address 0x%p: " + "0x%02x != 0x%02x\n", + p, status,word); ret = ERR_PROG_ERROR; + writew(0xf0, base); + readw(base); break; } + + writew(0xf0, base); + readw(base); } if (flags) |