From e93729536690550e3c17c944f27523baefb73b40 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 26 Oct 2010 11:43:02 +0800 Subject: [PATCH] =?utf8?q?rk29:=20timer:=20FPGA=E5=9C=A8ONESHOT=E6=A8=A1?= =?utf8?q?=E5=BC=8F=E4=B8=8B=EF=BC=8C=E4=BC=9A=E5=87=BA=E7=8E=B0Current=20?= =?utf8?q?Value=E7=AA=81=E7=84=B6=E5=8F=98=E5=A4=A7=E7=9A=84=E6=83=85?= =?utf8?q?=E5=86=B5=EF=BC=8C=E5=8A=A0=E5=85=A5PERIODIC=E6=A8=A1=E5=BC=8F?= =?utf8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=B8=B4=E6=97=B6?= =?utf8?q?=E5=B1=8F=E8=94=BDONESHOT=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- arch/arm/mach-rk29/timer.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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); -- 2.34.1