提交 751db1a6 编写于 作者: E Ezequiel Garcia 提交者: Daniel Lezcano

clocksource/drivers/lpc32xx: Don't use the prescaler counter for clockevents

This commit switches the clockevents one-shot current implementation
to avoid using the prescaler counter. The clockevents timer currently
uses MR0=1, PR=ticks; and after this commit is uses MR0=ticks, PR=0.

While using the prescaler with PR=1 works fine in one-shot mode,
it seems it doesn't work as expected in periodic mode.

By using the only match channel register (MR0) for the timer we make
the periodic mode introduction easier, and consistent with one-shot mode.
Signed-off-by: NEzequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: NDaniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: NJoachim Eastwood <manabian@gmail.com>
Tested-by: NJoachim Eastwood <manabian@gmail.com>
上级 522ed95c
...@@ -60,14 +60,13 @@ static int lpc32xx_clkevt_next_event(unsigned long delta, ...@@ -60,14 +60,13 @@ static int lpc32xx_clkevt_next_event(unsigned long delta,
container_of(evtdev, struct lpc32xx_clock_event_ddata, evtdev); container_of(evtdev, struct lpc32xx_clock_event_ddata, evtdev);
/* /*
* Place timer in reset and program the delta in the prescale * Place timer in reset and program the delta in the match
* register (PR). When the prescale counter matches the value * channel 0 (MR0). When the timer counter matches the value
* in PR the counter register is incremented and the compare * in MR0 register the match will trigger an interrupt.
* match will trigger. After setup the timer is released from * After setup the timer is released from reset and enabled.
* reset and enabled.
*/ */
writel_relaxed(LPC32XX_TIMER_TCR_CRST, ddata->base + LPC32XX_TIMER_TCR); writel_relaxed(LPC32XX_TIMER_TCR_CRST, ddata->base + LPC32XX_TIMER_TCR);
writel_relaxed(delta, ddata->base + LPC32XX_TIMER_PR); writel_relaxed(delta, ddata->base + LPC32XX_TIMER_MR0);
writel_relaxed(LPC32XX_TIMER_TCR_CEN, ddata->base + LPC32XX_TIMER_TCR); writel_relaxed(LPC32XX_TIMER_TCR_CEN, ddata->base + LPC32XX_TIMER_TCR);
return 0; return 0;
...@@ -210,13 +209,13 @@ static int __init lpc32xx_clockevent_init(struct device_node *np) ...@@ -210,13 +209,13 @@ static int __init lpc32xx_clockevent_init(struct device_node *np)
/* /*
* Disable timer and clear any pending interrupt (IR) on match * Disable timer and clear any pending interrupt (IR) on match
* channel 0 (MR0). Configure a compare match value of 1 on MR0 * channel 0 (MR0). Clear the prescaler as it's not used.
* and enable interrupt, reset on match and stop on match (MCR). * Enable interrupt, reset on match and stop on match (MCR).
*/ */
writel_relaxed(0, base + LPC32XX_TIMER_TCR); writel_relaxed(0, base + LPC32XX_TIMER_TCR);
writel_relaxed(0, base + LPC32XX_TIMER_PR);
writel_relaxed(0, base + LPC32XX_TIMER_CTCR); writel_relaxed(0, base + LPC32XX_TIMER_CTCR);
writel_relaxed(LPC32XX_TIMER_IR_MR0INT, base + LPC32XX_TIMER_IR); writel_relaxed(LPC32XX_TIMER_IR_MR0INT, base + LPC32XX_TIMER_IR);
writel_relaxed(1, base + LPC32XX_TIMER_MR0);
writel_relaxed(LPC32XX_TIMER_MCR_MR0I | LPC32XX_TIMER_MCR_MR0R | writel_relaxed(LPC32XX_TIMER_MCR_MR0I | LPC32XX_TIMER_MCR_MR0R |
LPC32XX_TIMER_MCR_MR0S, base + LPC32XX_TIMER_MCR); LPC32XX_TIMER_MCR_MR0S, base + LPC32XX_TIMER_MCR);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册