diff mbox

[U-Boot,1/2] cfi: Check for blank before erase

Message ID 1345235801-16820-1-git-send-email-joe.hershberger@ni.com
State Accepted
Commit 6822a647b94cb05869231251e5a29f9742bb3ce2
Delegated to: Stefan Roese
Headers show

Commit Message

Joe Hershberger Aug. 17, 2012, 8:36 p.m. UTC
Added an optional check in the CFI driver to evaluate if the sector is
already blank before issuing an erase command.  Improves erase time by
over a factor of 10 if already blank.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
---
 drivers/mtd/cfi_flash.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Stefan Roese Sept. 3, 2012, 9:34 a.m. UTC | #1
On 08/17/2012 10:36 PM, Joe Hershberger wrote:
> Added an optional check in the CFI driver to evaluate if the sector is
> already blank before issuing an erase command.  Improves erase time by
> over a factor of 10 if already blank.
> 
> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>

Applied to u-boot-cfi-flash/master.

Thanks,
Stefan
diff mbox

Patch

diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
index f0f301a..97a4fd7 100644
--- a/drivers/mtd/cfi_flash.c
+++ b/drivers/mtd/cfi_flash.c
@@ -1078,6 +1078,32 @@  int flash_erase (flash_info_t * info, int s_first, int s_last)
 
 	for (sect = s_first; sect <= s_last; sect++) {
 		if (info->protect[sect] == 0) { /* not protected */
+#ifdef CONFIG_SYS_FLASH_CHECK_BLANK_BEFORE_ERASE
+			int k;
+			int size;
+			int erased;
+			u32 *flash;
+
+			/*
+			 * Check if whole sector is erased
+			 */
+			size = flash_sector_size(info, sect);
+			erased = 1;
+			flash = (u32 *)info->start[sect];
+			/* divide by 4 for longword access */
+			size = size >> 2;
+			for (k = 0; k < size; k++) {
+				if (flash_read32(flash++) != 0xffffffff) {
+					erased = 0;
+					break;
+				}
+			}
+			if (erased) {
+				if (flash_verbose)
+					putc(',');
+				continue;
+			}
+#endif
 			switch (info->vendor) {
 			case CFI_CMDSET_INTEL_PROG_REGIONS:
 			case CFI_CMDSET_INTEL_STANDARD: