Message ID | 1344239199-11445-5-git-send-email-monstr@monstr.eu |
---|---|
State | Deferred |
Delegated to: | Mike Frysinger |
Headers | show |
Hi Michal, looks fine, but ... (see below) Am Montag, den 06.08.2012, 09:46 +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@monstr.eu> > > --- > v2: Fix irq type irq == -1 means no IRQ > --- > 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..1330401 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 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 b5f21d8..fde109f 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 1266cf7..21ddb2b 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_BASEADD) && defined(XILINX_TIMER_IRQ) typo here XILINX_TIMER_BASEADD <--- missing 'R' br, Stephan > # 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 */
On 08/07/2012 10:10 PM, Stephan Linz wrote: > Hi Michal, > > looks fine, but ... (see below) > > Am Montag, den 06.08.2012, 09:46 +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@monstr.eu> >> >> --- >> v2: Fix irq type irq == -1 means no IRQ >> --- >> 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..1330401 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 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 b5f21d8..fde109f 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 1266cf7..21ddb2b 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_BASEADD) && defined(XILINX_TIMER_IRQ) > > typo here XILINX_TIMER_BASEADD <--- missing 'R' Will fix it when I add this to my branch. Thanks, Michal
diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index cc6b897..1330401 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 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 b5f21d8..fde109f 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 1266cf7..21ddb2b 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_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 */
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@monstr.eu> --- v2: Fix irq type irq == -1 means no IRQ --- 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(-)