[PATCH] Don't disable irqs in set_next_event and set_mode callbacks
Russell King - ARM Linux
linux at arm.linux.org.uk
Mon Sep 21 05:30:37 EDT 2009
On Mon, Sep 21, 2009 at 11:16:14AM +0200, Uwe Kleine-König wrote:
> On Mon, Sep 21, 2009 at 10:04:00AM +0100, Russell King - ARM Linux wrote:
> > On Mon, Sep 21, 2009 at 09:39:22AM +0200, Uwe Kleine-König wrote:
> > > These functions are called with irqs already off.
> > >
> > > at91rm2000 had a WARN_ON_ONCE if irqs were enabled since Nov 2008 with
> > > noone reporting having hit it.
> > It might be useful to document these clockevent interfaces. There's
> > at least a few ARM clockevent implementations which don't set the
> > periodic interval when set_next_event() is called - probably because
> > it wasn't realised that it was required.
> I'm a bit confused now as AFAIK set_next_event isn't called in periodic
> You mean they don't start the timer if mode==CLOCK_EVT_MODE_PERIODIC in
> It looks as if pxa is such an implementation, it does nothing in this
PXA doesn't support periodic mode - the hardware is incapable of providing
periodic interrupts without software support, so we only support it in
one-shot mode (that's actually what the hardware provides.)
I'm talking about this kind of thing:
/* timer load already set up */
ctrl = TWD_TIMER_CONTROL_ENABLE | TWD_TIMER_CONTROL_IT_ENABLE
/* period set, and timer enabled in 'next_event' hook */
ctrl = TWD_TIMER_CONTROL_IT_ENABLE | TWD_TIMER_CONTROL_ONESHOT;
The first comment is not true if we ever switch to oneshot mode - the
reload register is overwritten. If we then switch back to periodic
mode, we'll interrupt at whatever periodic rate which was programmed
by the oneshot code. OMAP mpu_timer1 looks to be the same.
Nomadik only works because it doesn't support periodic mode.
More information about the linux-arm-kernel