This patch adds reset_timer() before the flash status check waiting loop. Since the timer is basically running asynchronous to the cfi code, it is possible to call get_timer(0), then only a few _SYSCLK_ cycles later an interrupt is generated. This causes timeout even though much less time has elapsed. So the timer period registers should be reset before get_timer(0) is called.
There is similar usage in nand_base.c. Signed-off-by: Thomas Chou <tho...@wytron.com.tw> --- drivers/mtd/cfi_flash.c | 2 ++ include/configs/EP3C120.h | 10 +++++----- include/configs/NEEK.h | 10 +++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index aae93bd..99300ba 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -544,6 +544,7 @@ static int flash_status_check (flash_info_t * info, flash_sect_t sector, #endif /* Wait for command completion */ + reset_timer(); start = get_timer (0); while (flash_is_busy (info, sector)) { if (get_timer (start) > tout) { @@ -630,6 +631,7 @@ static int flash_status_poll(flash_info_t *info, void *src, void *dst, #endif /* Wait for command completion */ + reset_timer(); start = get_timer(0); while (1) { switch (info->portwidth) { diff --git a/include/configs/EP3C120.h b/include/configs/EP3C120.h index cfd5569..6734a65 100644 --- a/include/configs/EP3C120.h +++ b/include/configs/EP3C120.h @@ -152,10 +152,10 @@ */ #define CONFIG_SYS_NIOS_TMRBASE (LINUX_TIMER_1MS_BASE | IO_REGION_BASE) #define CONFIG_SYS_NIOS_TMRIRQ LINUX_TIMER_1MS_IRQ -#define CONFIG_SYS_NIOS_TMRCNT ((LINUX_TIMER_1MS_FREQ / \ - CONFIG_SYS_HZ) - 1) -#define CONFIG_SYS_NIOS_TMRMS 1 /* Must be one */ -#define CONFIG_SYS_HZ 1000 +#define CONFIG_SYS_HZ 1000 /* Always 1000 */ +#define CONFIG_SYS_NIOS_TMRMS 10 /* Desired period (msec)*/ +#define CONFIG_SYS_NIOS_TMRCNT \ + (CONFIG_SYS_NIOS_TMRMS * (LINUX_TIMER_1MS_FREQ / 1000) - 1) /* * STATUS LED @@ -167,7 +167,7 @@ #define STATUS_LED_BIT 1 /* Bit-0 on PIO */ #define STATUS_LED_STATE 1 /* Blinking */ -#define STATUS_LED_PERIOD (CONFIG_SYS_HZ / 2) /* 500 mS */ +#define STATUS_LED_PERIOD (500 / CONFIG_SYS_NIOS_TMRMS) /* 500 msec */ /* * IDE support diff --git a/include/configs/NEEK.h b/include/configs/NEEK.h index f42701e..432a582 100644 --- a/include/configs/NEEK.h +++ b/include/configs/NEEK.h @@ -149,10 +149,10 @@ */ #define CONFIG_SYS_NIOS_TMRBASE (SYS_CLK_TIMER_BASE | IO_REGION_BASE) #define CONFIG_SYS_NIOS_TMRIRQ SYS_CLK_TIMER_IRQ -#define CONFIG_SYS_NIOS_TMRCNT ((SYS_CLK_TIMER_FREQ / \ - CONFIG_SYS_HZ) - 1) -#define CONFIG_SYS_NIOS_TMRMS 1 /* Must be one */ -#define CONFIG_SYS_HZ 1000 +#define CONFIG_SYS_HZ 1000 /* Always 1000 */ +#define CONFIG_SYS_NIOS_TMRMS 10 /* Desired period (msec)*/ +#define CONFIG_SYS_NIOS_TMRCNT \ + (CONFIG_SYS_NIOS_TMRMS * (SYS_CLK_TIMER_FREQ / 1000) - 1) /* * STATUS LED @@ -162,7 +162,7 @@ #define STATUS_LED_BIT CONFIG_SYS_GPIO_HBT #define STATUS_LED_STATE 1 /* Blinking */ -#define STATUS_LED_PERIOD (CONFIG_SYS_HZ / 2) /* 500 mS */ +#define STATUS_LED_PERIOD (500 / CONFIG_SYS_NIOS_TMRMS) /* 500 msec */ /* * IDE support -- 1.6.6.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot