]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/cpu/arm926ejs/mxs/timer.c
Merge branch 'u-boot-samsung/master' into 'u-boot-arm/master'
[karo-tx-uboot.git] / arch / arm / cpu / arm926ejs / mxs / timer.c
index 373841180ff84af4811695674170f278c5846c76..2039106e4074ef5d5a21f13f67a74627b30463a1 100644 (file)
 #include <asm/arch/sys_proto.h>
 
 /* Maximum fixed count */
-#define TIMER_LOAD_VAL 0xffffffff
+#if defined(CONFIG_MX23)
+#define TIMER_LOAD_VAL 0xffff
+#elif defined(CONFIG_MX28)
+#define TIMER_LOAD_VAL 0xffffffff
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -42,22 +46,22 @@ DECLARE_GLOBAL_DATA_PTR;
 /*
  * This driver uses 1kHz clock source.
  */
-#define        MX28_INCREMENTER_HZ             1000
+#define        MXS_INCREMENTER_HZ              1000
 
 static inline unsigned long tick_to_time(unsigned long tick)
 {
-       return tick / (MX28_INCREMENTER_HZ / CONFIG_SYS_HZ);
+       return tick / (MXS_INCREMENTER_HZ / CONFIG_SYS_HZ);
 }
 
 static inline unsigned long time_to_tick(unsigned long time)
 {
-       return time * (MX28_INCREMENTER_HZ / CONFIG_SYS_HZ);
+       return time * (MXS_INCREMENTER_HZ / CONFIG_SYS_HZ);
 }
 
 /* Calculate how many ticks happen in "us" microseconds */
 static inline unsigned long us_to_tick(unsigned long us)
 {
-       return (us * MX28_INCREMENTER_HZ) / 1000000;
+       return (us * MXS_INCREMENTER_HZ) / 1000000;
 }
 
 int timer_init(void)
@@ -69,7 +73,11 @@ int timer_init(void)
        mxs_reset_block(&timrot_regs->hw_timrot_rotctrl_reg);
 
        /* Set fixed_count to 0 */
+#if defined(CONFIG_MX23)
+       writel(0, &timrot_regs->hw_timrot_timcount0);
+#elif defined(CONFIG_MX28)
        writel(0, &timrot_regs->hw_timrot_fixed_count0);
+#endif
 
        /* Set UPDATE bit and 1Khz frequency */
        writel(TIMROT_TIMCTRLn_UPDATE | TIMROT_TIMCTRLn_RELOAD |
@@ -77,7 +85,11 @@ int timer_init(void)
                &timrot_regs->hw_timrot_timctrl0);
 
        /* Set fixed_count to maximal value */
+#if defined(CONFIG_MX23)
+       writel(TIMER_LOAD_VAL - 1, &timrot_regs->hw_timrot_timcount0);
+#elif defined(CONFIG_MX28)
        writel(TIMER_LOAD_VAL, &timrot_regs->hw_timrot_fixed_count0);
+#endif
 
        return 0;
 }
@@ -86,9 +98,16 @@ unsigned long long get_ticks(void)
 {
        struct mxs_timrot_regs *timrot_regs =
                (struct mxs_timrot_regs *)MXS_TIMROT_BASE;
+       uint32_t now;
 
        /* Current tick value */
-       uint32_t now = readl(&timrot_regs->hw_timrot_running_count0);
+#if defined(CONFIG_MX23)
+       /* Upper bits are the valid ones. */
+       now = readl(&timrot_regs->hw_timrot_timcount0) >>
+               TIMROT_RUNNING_COUNTn_RUNNING_COUNT_OFFSET;
+#elif defined(CONFIG_MX28)
+       now = readl(&timrot_regs->hw_timrot_running_count0);
+#endif
 
        if (lastdec >= now) {
                /*
@@ -117,17 +136,17 @@ ulong get_timer(ulong base)
 }
 
 /* We use the HW_DIGCTL_MICROSECONDS register for sub-millisecond timer. */
-#define        MX28_HW_DIGCTL_MICROSECONDS     0x8001c0c0
+#define        MXS_HW_DIGCTL_MICROSECONDS      0x8001c0c0
 
 void __udelay(unsigned long usec)
 {
        uint32_t old, new, incr;
        uint32_t counter = 0;
 
-       old = readl(MX28_HW_DIGCTL_MICROSECONDS);
+       old = readl(MXS_HW_DIGCTL_MICROSECONDS);
 
        while (counter < usec) {
-               new = readl(MX28_HW_DIGCTL_MICROSECONDS);
+               new = readl(MXS_HW_DIGCTL_MICROSECONDS);
 
                /* Check if the timer wrapped. */
                if (new < old) {
@@ -152,5 +171,5 @@ void __udelay(unsigned long usec)
 
 ulong get_tbclk(void)
 {
-       return MX28_INCREMENTER_HZ;
+       return MXS_INCREMENTER_HZ;
 }