All of lore.kernel.org
 help / color / mirror / Atom feed
From: daniel.lezcano@linaro.org (Daniel Lezcano)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] clocksource: sun4i: Clear interrupts after stopping timer in probe function
Date: Tue, 16 Aug 2016 12:25:16 +0200	[thread overview]
Message-ID: <57B2EA0C.80006@linaro.org> (raw)
In-Reply-To: <1471237024-16655-1-git-send-email-wens@csie.org>

On 08/15/2016 06:57 AM, Chen-Yu Tsai wrote:
> The bootloader (U-boot) sometimes uses this timer for various delays.
> It uses it as a ongoing counter, and does comparisons on the current
> counter value. The timer counter is never stopped.
> 
> In some cases when the user interacts with the bootloader, or lets
> it idle for some time before loading Linux, the timer may expire,
> and an interrupt will be pending. This results in an unexpected
> interrupt when the timer interrupt is enabled by the kernel, at
> which point the event_handler isn't set yet. This results in a NULL
> pointer dereference exception, panic, and no way to reboot.
> 
> Clear any pending interrupts after we stop the timer in the probe
> function to avoid this.
> 
> Cc: stable at vger.kernel.org
> Signed-off-by: Chen-Yu Tsai <wens@csie.org>
> ---
> Changes since v1:
> 
>   - Add stable kernel to Cc.
> ---
>  drivers/clocksource/sun4i_timer.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/clocksource/sun4i_timer.c b/drivers/clocksource/sun4i_timer.c
> index 97669ee4df2a..7ab69b36f744 100644
> --- a/drivers/clocksource/sun4i_timer.c
> +++ b/drivers/clocksource/sun4i_timer.c
> @@ -208,6 +208,9 @@ static int __init sun4i_timer_init(struct device_node *node)
>  	/* Make sure timer is stopped before playing with interrupts */
>  	sun4i_clkevt_time_stop(0);
>  
> +	/* clear timer0 interrupt */
> +	writel(0x1, timer_base + TIMER_IRQ_ST_REG);

Can you replace this call with a static inline function and reuse it
also in 'sun4i_timer_interrupt' ?

Thanks.

  -- Daniel



-- 
 <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

WARNING: multiple messages have this Message-ID (diff)
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Chen-Yu Tsai <wens@csie.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH v2] clocksource: sun4i: Clear interrupts after stopping timer in probe function
Date: Tue, 16 Aug 2016 12:25:16 +0200	[thread overview]
Message-ID: <57B2EA0C.80006@linaro.org> (raw)
In-Reply-To: <1471237024-16655-1-git-send-email-wens@csie.org>

On 08/15/2016 06:57 AM, Chen-Yu Tsai wrote:
> The bootloader (U-boot) sometimes uses this timer for various delays.
> It uses it as a ongoing counter, and does comparisons on the current
> counter value. The timer counter is never stopped.
> 
> In some cases when the user interacts with the bootloader, or lets
> it idle for some time before loading Linux, the timer may expire,
> and an interrupt will be pending. This results in an unexpected
> interrupt when the timer interrupt is enabled by the kernel, at
> which point the event_handler isn't set yet. This results in a NULL
> pointer dereference exception, panic, and no way to reboot.
> 
> Clear any pending interrupts after we stop the timer in the probe
> function to avoid this.
> 
> Cc: stable@vger.kernel.org
> Signed-off-by: Chen-Yu Tsai <wens@csie.org>
> ---
> Changes since v1:
> 
>   - Add stable kernel to Cc.
> ---
>  drivers/clocksource/sun4i_timer.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/clocksource/sun4i_timer.c b/drivers/clocksource/sun4i_timer.c
> index 97669ee4df2a..7ab69b36f744 100644
> --- a/drivers/clocksource/sun4i_timer.c
> +++ b/drivers/clocksource/sun4i_timer.c
> @@ -208,6 +208,9 @@ static int __init sun4i_timer_init(struct device_node *node)
>  	/* Make sure timer is stopped before playing with interrupts */
>  	sun4i_clkevt_time_stop(0);
>  
> +	/* clear timer0 interrupt */
> +	writel(0x1, timer_base + TIMER_IRQ_ST_REG);

Can you replace this call with a static inline function and reuse it
also in 'sun4i_timer_interrupt' ?

Thanks.

  -- Daniel



-- 
 <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

  parent reply	other threads:[~2016-08-16 10:25 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-15  4:57 [PATCH v2] clocksource: sun4i: Clear interrupts after stopping timer in probe function Chen-Yu Tsai
2016-08-15  4:57 ` Chen-Yu Tsai
2016-08-15 20:55 ` Rask Ingemann Lambertsen
2016-08-15 20:55   ` Rask Ingemann Lambertsen
2016-08-16 10:25 ` Daniel Lezcano [this message]
2016-08-16 10:25   ` Daniel Lezcano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57B2EA0C.80006@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.