From 5c373f9e3d10d2ee61c87b4ade31946e3a700b2e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 7 Feb 2012 18:41:50 +0800 Subject: [PATCH] rk30: timer: fix ic bug --- arch/arm/mach-rk30/timer.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-rk30/timer.c b/arch/arm/mach-rk30/timer.c index 1ee3310eb3d6..071fd1447c64 100644 --- a/arch/arm/mach-rk30/timer.c +++ b/arch/arm/mach-rk30/timer.c @@ -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: -- 2.34.1