]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
microblaze: timer: Prepare for device-tree initialization
authorMichal Simek <monstr@monstr.eu>
Fri, 29 Jun 2012 11:46:54 +0000 (13:46 +0200)
committerMichal Simek <monstr@monstr.eu>
Tue, 11 Sep 2012 07:24:58 +0000 (09:24 +0200)
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>
arch/microblaze/cpu/timer.c
arch/microblaze/include/asm/microblaze_timer.h
arch/microblaze/lib/board.c
include/configs/microblaze-generic.h

index cc6b897fbb570a8bea12d1c51a0bd355429654c8..1330401a93429bb5313f9233e72d33fa6554089c 100644 (file)
 #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).
index 844c8db1151ab343a61e5ca4098fd2426be90f8a..28e8b027cbde18937385c6300ff8f721c4f0ec3a 100644 (file)
@@ -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);
+
index b5f21d8a39b4b8f033456995b550bc0204764a8f..fde109f56bb54b179c055b46d3d7b8ecfe5c8aef 100644 (file)
@@ -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
index 1266cf72faf4cc71b9da8c6726e88a95ad6fd692..721cd906adb151ae5214c1bd4f9a7082b38aa5cb 100644 (file)
 #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 */