diff mbox

ARM: timer-sp: ensure interrupt is cleared at sp804_clockevents_init

Message ID 1410914571-8388-1-git-send-email-chanho.min@lge.com (mailing list archive)
State New, archived
Headers show

Commit Message

Chanho Min Sept. 17, 2014, 12:42 a.m. UTC
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(+)

Comments

Stephen Boyd Sept. 17, 2014, 1:09 a.m. UTC | #1
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.
Chanho Min Sept. 17, 2014, 2:58 a.m. UTC | #2
> > +	/* 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 mbox

Patch

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);
 }