Message ID | 1410914571-8388-1-git-send-email-chanho.min@lge.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 09/17, Chanho Min wrote: > When sp804 is registerd as clock event device, it may not be added to s/registerd/registered/ > tick device if the higher rated device is already registerd. In this case, s/registerd/registered/ > for uncertan reason, inetrrupt is occured without event_handler it cause s/inetrrupt/interrupt/ > kernel panic. So Interrupt should be cleared before clockevent is registered. > > Signed-off-by: Chanho Min <chanho.min@lge.com> > --- > arch/arm/common/timer-sp.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c > index fd6bff0..b658873 100644 > --- a/arch/arm/common/timer-sp.c > +++ b/arch/arm/common/timer-sp.c > @@ -205,6 +205,8 @@ void __init __sp804_clockevents_init(void __iomem *base, unsigned int irq, struc > > writel(0, base + TIMER_CTRL); > > + /* Ensure interrupt is cleared */ > + writel(1, clkevt_base + TIMER_INTCLR); > setup_irq(irq, &sp804_timer_irq); > clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); Or just flip the order of clockevents_config_and_register() and setup_irq()? We've done this in other clockevents drivers.
> > + /* Ensure interrupt is cleared */ > > + writel(1, clkevt_base + TIMER_INTCLR); > > setup_irq(irq, &sp804_timer_irq); > > clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); > > Or just flip the order of clockevents_config_and_register() and > setup_irq()? We've done this in other clockevents drivers. It won't fix this issue. clockevents_config_and_register will do nothing if the higher rated device is registered. if pending interrupt is existed, interrupt will be triggered as soon as setup_irq is done.
diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index fd6bff0..b658873 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c @@ -205,6 +205,8 @@ void __init __sp804_clockevents_init(void __iomem *base, unsigned int irq, struc writel(0, base + TIMER_CTRL); + /* Ensure interrupt is cleared */ + writel(1, clkevt_base + TIMER_INTCLR); setup_irq(irq, &sp804_timer_irq); clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); }
When sp804 is registerd as clock event device, it may not be added to tick device if the higher rated device is already registerd. In this case, for uncertan reason, inetrrupt is occured without event_handler it cause kernel panic. So Interrupt should be cleared before clockevent is registered. Signed-off-by: Chanho Min <chanho.min@lge.com> --- arch/arm/common/timer-sp.c | 2 ++ 1 file changed, 2 insertions(+)