Commit 5f053e4e authored by Kevin Hilman's avatar Kevin Hilman Committed by Tony Lindgren

ARM: OMAP: fix OMAP1 clockevent support for hrtimers

One-shot mode was broken in MPU-timer support for OMAP1 due to a typo.

Also, ensure timer is stopped before changing the auto-reload flag.
The TRM says changing the AR flag when timer is running is undefined.
Signed-off-by: default avatarTim Bird <tim.bird@am.sony.com>
Signed-off-by: Kevin Hilman <khilman@mvista.com.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 47c77850
...@@ -132,13 +132,20 @@ static inline void omap_mpu_timer_start(int nr, unsigned long load_val, ...@@ -132,13 +132,20 @@ static inline void omap_mpu_timer_start(int nr, unsigned long load_val,
timer->cntl = timerflags; timer->cntl = timerflags;
} }
static inline void omap_mpu_timer_stop(int nr)
{
volatile omap_mpu_timer_regs_t* timer = omap_mpu_timer_base(nr);
timer->cntl &= ~MPU_TIMER_ST;
}
/* /*
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
* MPU timer 1 ... count down to zero, interrupt, reload * MPU timer 1 ... count down to zero, interrupt, reload
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
*/ */
static int omap_mpu_set_next_event(unsigned long cycles, static int omap_mpu_set_next_event(unsigned long cycles,
struct clock_event_device *evt) struct clock_event_device *evt)
{ {
omap_mpu_timer_start(0, cycles, 0); omap_mpu_timer_start(0, cycles, 0);
return 0; return 0;
...@@ -152,6 +159,7 @@ static void omap_mpu_set_mode(enum clock_event_mode mode, ...@@ -152,6 +159,7 @@ static void omap_mpu_set_mode(enum clock_event_mode mode,
omap_mpu_set_autoreset(0); omap_mpu_set_autoreset(0);
break; break;
case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT:
omap_mpu_timer_stop(0);
omap_mpu_remove_autoreset(0); omap_mpu_remove_autoreset(0);
break; break;
case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED:
...@@ -163,7 +171,7 @@ static void omap_mpu_set_mode(enum clock_event_mode mode, ...@@ -163,7 +171,7 @@ static void omap_mpu_set_mode(enum clock_event_mode mode,
static struct clock_event_device clockevent_mpu_timer1 = { static struct clock_event_device clockevent_mpu_timer1 = {
.name = "mpu_timer1", .name = "mpu_timer1",
.features = CLOCK_EVT_FEAT_PERIODIC, CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
.shift = 32, .shift = 32,
.set_next_event = omap_mpu_set_next_event, .set_next_event = omap_mpu_set_next_event,
.set_mode = omap_mpu_set_mode, .set_mode = omap_mpu_set_mode,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment