rk29: timer: enable oneshot features
author黄涛 <huangtao@rock-chips.com>
Tue, 7 Dec 2010 10:45:49 +0000 (18:45 +0800)
committer黄涛 <huangtao@rock-chips.com>
Tue, 7 Dec 2010 10:50:26 +0000 (18:50 +0800)
arch/arm/mach-rk29/timer.c

index e1396f27bd3da3a690abf387e71e2564a8cef88e..8debd38050f9b8638726417966b3d1872e50c8d0 100644 (file)
 
 static int rk29_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;
 }
 
@@ -81,7 +83,7 @@ static void rk29_timer_set_mode(enum clock_event_mode mode, struct clock_event_d
 
 static struct clock_event_device rk29_timer_clockevent = {
        .name           = TIMER_CLKEVT_NAME,
-       .features       = CLOCK_EVT_FEAT_PERIODIC /*| CLOCK_EVT_FEAT_ONESHOT*/,
+       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
        .shift          = 32,
        .rating         = 200,
        .set_next_event = rk29_timer_set_next_event,