diff options
Diffstat (limited to 'board/lwmon/flash.c')
| -rw-r--r-- | board/lwmon/flash.c | 21 | 
1 files changed, 21 insertions, 0 deletions
| diff --git a/board/lwmon/flash.c b/board/lwmon/flash.c index 4004865c3..b894887c9 100644 --- a/board/lwmon/flash.c +++ b/board/lwmon/flash.c @@ -403,6 +403,26 @@ int	flash_erase (flash_info_t *info, int s_first, int s_last)  			/* Disable interrupts which might cause a timeout here */  			flag = disable_interrupts(); +			*addr = 0x00600060;	/* clear lock bit setup */ +			*addr = 0x00D000D0;	/* clear lock bit confirm */ + +			udelay (1000); +			/* This takes awfully long - up to 50 ms and more */ +			while (((status = *addr) & 0x00800080) != 0x00800080) { +				if ((now=get_timer(start)) > CFG_FLASH_ERASE_TOUT) { +					printf ("Timeout\n"); +					*addr = 0x00FF00FF; /* reset to read mode */ +					return 1; +				} + +				/* show that we're waiting */ +				if ((now - last) > 1000) {	/* every second */ +					putc ('.'); +					last = now; +				} +				udelay (1000);	/* to trigger the watchdog */ +			} +  			*addr = 0x00500050;	/* clear status register */  			*addr = 0x00200020;	/* erase setup */  			*addr = 0x00D000D0;	/* erase confirm */ @@ -427,6 +447,7 @@ int	flash_erase (flash_info_t *info, int s_first, int s_last)  					putc ('.');  					last = now;  				} +				udelay (1000);	/* to trigger the watchdog */  			}  			*addr = 0x00FF00FF;	/* reset to read mode */ |