[U-Boot] [PATCH 08/12] microblaze: timer: Prepare for device-tree initialization
Stephan Linz
linz at li-pro.net
Mon Jul 9 21:06:18 CEST 2012
Am Montag, den 09.07.2012, 11:20 +0200 schrieb Michal Simek:
> microblaze: Fix CONFIG_SYS_HZ usage in board config
>
> Do not use hardcoded value. Use CONFIG_SYS_HZ instead.
> Separate static configuration to single block.
>
> Signed-off-by: Michal Simek <monstr at monstr.eu>
> ---
> arch/microblaze/cpu/timer.c | 69 ++++++++++++-----------
> arch/microblaze/include/asm/microblaze_timer.h | 3 +
> arch/microblaze/lib/board.c | 5 --
> 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 cc6b897..dfaaaf5 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))
> + ;
Hi Michal,
> + } else {
> + for (i = 0; i < (usec * XILINX_CLOCK_FREQ / 10000000); i++)
> + ;
this part should be enclosed by #ifdef XILINX_CLOCK_FREQ
br,
Stephan Linz
> + }
> }
> -#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);
> + u32 irq = 0;
> + 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 && irq && preload) {
> + 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 844c8db..28e8b02 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 8cf4266..ddbc862 100644
> --- a/arch/microblaze/lib/board.c
> +++ b/arch/microblaze/lib/board.c
> @@ -40,9 +40,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
> @@ -72,9 +69,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 44934eb..9f90107 100644
> --- a/include/configs/microblaze-generic.h
> +++ b/include/configs/microblaze-generic.h
> @@ -102,19 +102,11 @@
> #endif
>
> /* timer */
> -#ifdef XILINX_TIMER_BASEADDR
> -# if (XILINX_TIMER_IRQ != -1)
> -# define CONFIG_SYS_TIMER_0 1
> +#if defined(XILINX_TIMER_BASEADD) && 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 */
--
Viele Grüße,
Stephan Linz
______________________________________________________________________________
MB-Ref: http://www.li-pro.de/xilinx_mb:mbref:start
OpenDCC: http://www.li-pro.net/opendcc.phtml
PC/M: http://www.li-pro.net/pcm.phtml
Sourceforge: http://sourceforge.net/users/slz
Gitorious: https://gitorious.org/~slz
More information about the U-Boot
mailing list