diff options
| -rw-r--r-- | arch/microblaze/cpu/timer.c | 69 | ||||
| -rw-r--r-- | arch/microblaze/include/asm/microblaze_timer.h | 3 | ||||
| -rw-r--r-- | arch/microblaze/lib/board.c | 5 | ||||
| -rw-r--r-- | include/configs/microblaze-generic.h | 12 | 
4 files changed, 41 insertions, 48 deletions
| diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index cc6b897fb..1330401a9 100644 --- a/arch/microblaze/cpu/timer.c +++ b/arch/microblaze/cpu/timer.c @@ -27,42 +27,30 @@  #include <asm/microblaze_intc.h>  volatile int timestamp = 0; +microblaze_timer_t *tmr; -#ifdef CONFIG_SYS_TIMER_0  ulong get_timer (ulong base)  { -	return (timestamp - base); +	if (tmr) +		return timestamp - base; +	return timestamp++ - base;  } -#else -ulong get_timer (ulong base) -{ -	return (timestamp++ - base); -} -#endif -#ifdef CONFIG_SYS_TIMER_0  void __udelay(unsigned long usec)  { -	int i; +	u32 i; -	i = get_timer(0); -	while ((get_timer(0) - i) < (usec / 1000)) -		; +	if (tmr) { +		i = get_timer(0); +		while ((get_timer(0) - i) < (usec / 1000)) +			; +	} else { +		for (i = 0; i < (usec * XILINX_CLOCK_FREQ / 10000000); i++) +			; +	}  } -#else -void __udelay(unsigned long usec) -{ -	unsigned int i; -	for (i = 0; i < (usec * CONFIG_XILINX_CLOCK_FREQ / 10000000); i++) -		; -} -#endif - -#ifdef CONFIG_SYS_TIMER_0 -microblaze_timer_t *tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); - -void timer_isr (void *arg) +static void timer_isr(void *arg)  {  	timestamp++;  	tmr->control = tmr->control | TIMER_INTERRUPT; @@ -70,15 +58,30 @@ void timer_isr (void *arg)  int timer_init (void)  { -	tmr->loadreg = CONFIG_SYS_TIMER_0_PRELOAD; -	tmr->control = TIMER_INTERRUPT | TIMER_RESET; -	tmr->control = -	    TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD | TIMER_DOWN_COUNT; -	timestamp = 0; -	install_interrupt_handler (CONFIG_SYS_TIMER_0_IRQ, timer_isr, (void *)tmr); +	int irq = -1; +	u32 preload = 0; +	u32 ret = 0; + +#if defined(CONFIG_SYS_TIMER_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM) +	preload = XILINX_CLOCK_FREQ / CONFIG_SYS_HZ; +	irq = CONFIG_SYS_TIMER_0_IRQ; +	tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); +#endif + +	if (tmr && preload && irq >= 0) { +		tmr->loadreg = preload; +		tmr->control = TIMER_INTERRUPT | TIMER_RESET; +		tmr->control = TIMER_ENABLE | TIMER_ENABLE_INTR |\ +					TIMER_RELOAD | TIMER_DOWN_COUNT; +		timestamp = 0; +		ret = install_interrupt_handler (irq, timer_isr, (void *)tmr); +		if (ret) +			tmr = NULL; +	} + +	/* No problem if timer is not found/initialized */  	return 0;  } -#endif  /*   * This function is derived from PowerPC code (read timebase as long long). diff --git a/arch/microblaze/include/asm/microblaze_timer.h b/arch/microblaze/include/asm/microblaze_timer.h index 844c8db11..28e8b027c 100644 --- a/arch/microblaze/include/asm/microblaze_timer.h +++ b/arch/microblaze/include/asm/microblaze_timer.h @@ -39,3 +39,6 @@ typedef volatile struct microblaze_timer_t {  	int loadreg; /* load register TLR */  	int counter; /* timer/counter register */  } microblaze_timer_t; + +int timer_init(void); + diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index b5f21d8a3..fde109f56 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -42,9 +42,6 @@ DECLARE_GLOBAL_DATA_PTR;  #ifdef CONFIG_SYS_GPIO_0  extern int gpio_init (void);  #endif -#ifdef CONFIG_SYS_TIMER_0 -extern int timer_init (void); -#endif  #ifdef CONFIG_SYS_FSL_2  extern void fsl_init2 (void);  #endif @@ -74,9 +71,7 @@ init_fnc_t *init_sequence[] = {  	gpio_init,  #endif  	interrupts_init, -#ifdef CONFIG_SYS_TIMER_0  	timer_init, -#endif  #ifdef CONFIG_SYS_FSL_2  	fsl_init2,  #endif diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h index 1266cf72f..721cd906a 100644 --- a/include/configs/microblaze-generic.h +++ b/include/configs/microblaze-generic.h @@ -115,19 +115,11 @@  #endif  /* timer */ -#ifdef XILINX_TIMER_BASEADDR -# if (XILINX_TIMER_IRQ != -1) -#  define CONFIG_SYS_TIMER_0		1 +#if defined(XILINX_TIMER_BASEADDR) && defined(XILINX_TIMER_IRQ)  #  define CONFIG_SYS_TIMER_0_ADDR	XILINX_TIMER_BASEADDR  #  define CONFIG_SYS_TIMER_0_IRQ	XILINX_TIMER_IRQ -#  define FREQUENCE	XILINX_CLOCK_FREQ -#  define CONFIG_SYS_TIMER_0_PRELOAD	( FREQUENCE/1000 ) -# endif -#elif XILINX_CLOCK_FREQ -# define CONFIG_XILINX_CLOCK_FREQ	XILINX_CLOCK_FREQ -#else -# error BAD CLOCK FREQ  #endif +  /* FSL */  /* #define	CONFIG_SYS_FSL_2 */  /* #define	FSL_INTR_2	1 */ |