From: 黄涛 Date: Tue, 26 Oct 2010 03:43:02 +0000 (+0800) Subject: rk29: timer: FPGA在ONESHOT模式下,会出现Current Value突然变大的情况,加入PERIODIC模式支持,并且临时屏蔽ONESHOT支持 X-Git-Tag: firefly_0821_release~11042 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e93729536690550e3c17c944f27523baefb73b40;p=firefly-linux-kernel-4.4.55.git rk29: timer: FPGA在ONESHOT模式下,会出现Current Value突然变大的情况,加入PERIODIC模式支持,并且临时屏蔽ONESHOT支持 --- diff --git a/arch/arm/mach-rk29/timer.c b/arch/arm/mach-rk29/timer.c index 4493362fe90d..e1396f27bd3d 100644 --- a/arch/arm/mach-rk29/timer.c +++ b/arch/arm/mach-rk29/timer.c @@ -30,7 +30,7 @@ #define TIMER_EOI 0x000C #define TIMER_INT_STATUS 0x0010 -#define TIMER_DISABLE 4 +#define TIMER_DISABLE 6 #define TIMER_ENABLE 3 #define TIMER_ENABLE_FREE_RUNNING 1 @@ -59,15 +59,17 @@ static int rk29_timer_set_next_event(unsigned long cycles, struct clock_event_de RK_TIMER_DISABLE(TIMER_CLKEVT); RK_TIMER_SETCOUNT(TIMER_CLKEVT, cycles); RK_TIMER_ENABLE(TIMER_CLKEVT); - return 0; } static void rk29_timer_set_mode(enum clock_event_mode mode, struct clock_event_device *evt) { switch (mode) { - case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_PERIODIC: + RK_TIMER_DISABLE(TIMER_CLKEVT); + RK_TIMER_SETCOUNT(TIMER_CLKEVT, 24000000/HZ - 1); + RK_TIMER_ENABLE(TIMER_CLKEVT); + case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_ONESHOT: break; case CLOCK_EVT_MODE_UNUSED: @@ -79,7 +81,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_ONESHOT, + .features = CLOCK_EVT_FEAT_PERIODIC /*| CLOCK_EVT_FEAT_ONESHOT*/, .shift = 32, .rating = 200, .set_next_event = rk29_timer_set_next_event, @@ -91,7 +93,8 @@ static irqreturn_t rk29_timer_clockevent_interrupt(int irq, void *dev_id) struct clock_event_device *evt = dev_id; RK_TIMER_INT_CLEAR(TIMER_CLKEVT); - RK_TIMER_DISABLE(TIMER_CLKEVT); + if (evt->mode == CLOCK_EVT_MODE_ONESHOT) + RK_TIMER_DISABLE(TIMER_CLKEVT); evt->event_handler(evt);