diff options
author | Wolfgang Denk <wd@denx.de> | 2008-01-02 12:39:04 +0100 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2008-01-02 12:39:04 +0100 |
commit | 8f8b52ea5b35c29669f2471de644c0bb7339c70a (patch) | |
tree | 27a41caec3eb4c044d4ead8a7619eae39044b29c | |
parent | 3dfd708cc1b2a966ad454ca9ed125dd17dbadbcc (diff) | |
parent | d2995fe39229019c214aaf58b5a686ae8fa9b51e (diff) | |
download | u-boot-imx-8f8b52ea5b35c29669f2471de644c0bb7339c70a.zip u-boot-imx-8f8b52ea5b35c29669f2471de644c0bb7339c70a.tar.gz u-boot-imx-8f8b52ea5b35c29669f2471de644c0bb7339c70a.tar.bz2 |
Merge branch 'master' of /home/wd/git/u-boot/custodians
-rw-r--r-- | drivers/mtd/cfi_flash.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index f370e4f..d1124d3 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -769,7 +769,7 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest, } if (!flag) { unmap_physmem(dstaddr, info->portwidth); - return 2; + return ERR_NOT_ERASED; } /* Disable interrupts which might cause a timeout here */ @@ -826,7 +826,57 @@ static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, int retcode; void *src = cp; void *dst = map_physmem(dest, len, MAP_NOCACHE); + void *dst2 = dst; + int flag = 0; + switch (info->portwidth) { + case FLASH_CFI_8BIT: + cnt = len; + break; + case FLASH_CFI_16BIT: + cnt = len >> 1; + break; + case FLASH_CFI_32BIT: + cnt = len >> 2; + break; + case FLASH_CFI_64BIT: + cnt = len >> 3; + break; + default: + retcode = ERR_INVAL; + goto out_unmap; + } + + while ((cnt-- > 0) && (flag == 0)) { + switch (info->portwidth) { + case FLASH_CFI_8BIT: + flag = ((flash_read8(dst2) & flash_read8(src)) == + flash_read8(src)); + src += 1, dst2 += 1; + break; + case FLASH_CFI_16BIT: + flag = ((flash_read16(dst2) & flash_read16(src)) == + flash_read16(src)); + src += 2, dst2 += 2; + break; + case FLASH_CFI_32BIT: + flag = ((flash_read32(dst2) & flash_read32(src)) == + flash_read32(src)); + src += 4, dst2 += 4; + break; + case FLASH_CFI_64BIT: + flag = ((flash_read64(dst2) & flash_read64(src)) == + flash_read64(src)); + src += 8, dst2 += 8; + break; + } + } + if (!flag) { + retcode = ERR_NOT_ERASED; + goto out_unmap; + } + + src = cp; sector = find_sector (info, dest); switch (info->vendor) { |