rk30: timer: fix ic bug
author黄涛 <huangtao@rock-chips.com>
Tue, 7 Feb 2012 10:41:50 +0000 (18:41 +0800)
committer黄涛 <huangtao@rock-chips.com>
Tue, 7 Feb 2012 10:41:50 +0000 (18:41 +0800)
arch/arm/mach-rk30/timer.c

index 1ee3310eb3d606dbf25eb9d0ad8a9c161f80a185..071fd1447c64e1590dae460c3de986d517a05833 100644 (file)
@@ -72,20 +72,26 @@ static inline u32 timer_read(u32 n, u32 offset)
 
 static int rk30_timer_set_next_event(unsigned long cycles, struct clock_event_device *evt)
 {
-       RK_TIMER_DISABLE(TIMER_CLKEVT);
-       RK_TIMER_SETCOUNT(TIMER_CLKEVT, cycles);
-       RK_TIMER_ENABLE(TIMER_CLKEVT);
+       do {
+               RK_TIMER_DISABLE(TIMER_CLKEVT);
+               RK_TIMER_SETCOUNT(TIMER_CLKEVT, cycles);
+               RK_TIMER_ENABLE(TIMER_CLKEVT);
+       } while (RK_TIMER_READVALUE(TIMER_CLKEVT) > cycles);
        return 0;
 }
 
 static void rk30_timer_set_mode(enum clock_event_mode mode, struct clock_event_device *evt)
 {
+       u32 count;
 
        switch (mode) {
        case CLOCK_EVT_MODE_PERIODIC:
-               RK_TIMER_DISABLE(TIMER_CLKEVT);
-               RK_TIMER_SETCOUNT(TIMER_CLKEVT, 24000000 / HZ - 1);
-               RK_TIMER_ENABLE(TIMER_CLKEVT);
+               count = 24000000 / HZ - 1;
+               do {
+                       RK_TIMER_DISABLE(TIMER_CLKEVT);
+                       RK_TIMER_SETCOUNT(TIMER_CLKEVT, count);
+                       RK_TIMER_ENABLE(TIMER_CLKEVT);
+               } while (RK_TIMER_READVALUE(TIMER_CLKEVT) > count);
                break;
        case CLOCK_EVT_MODE_RESUME:
        case CLOCK_EVT_MODE_ONESHOT: