* [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts
@ 2013-12-02 9:29 Marc Zyngier
2013-12-02 10:32 ` Daniel Lezcano
2013-12-02 11:57 ` Daniel Lezcano
0 siblings, 2 replies; 5+ messages in thread
From: Marc Zyngier @ 2013-12-02 9:29 UTC (permalink / raw)
To: linux-arm-kernel
The sun4i timer can still be ticking when we enable the interrupt.
If another timer is actually used (A7 architected timer, for example),
odds are that the interrupt will eventually fire with the event_handler
pointer being NULL.
The obvious fix it to stop the timer before registering the interrupt.
Observed and tested on sun7i (cubietruck).
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
Daniel,
Maxime asked me to forward this to you directly. Please consider merging
it for 3.13.
Thanks,
M.
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 2fb4695..a4f6119 100644
--- a/drivers/clocksource/sun4i_timer.c
+++ b/drivers/clocksource/sun4i_timer.c
@@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node *node)
writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
timer_base + TIMER_CTL_REG(0));
+ /* Make sure timer is stopped before playing with interrupts */
+ sun4i_clkevt_time_stop(0);
+
ret = setup_irq(irq, &sun4i_timer_irq);
if (ret)
pr_warn("failed to setup irq %d\n", irq);
--
1.8.2.3
^ permalink raw reply related [flat|nested] 5+ messages in thread* [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts
2013-12-02 9:29 [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts Marc Zyngier
@ 2013-12-02 10:32 ` Daniel Lezcano
2013-12-02 10:46 ` Marc Zyngier
2013-12-02 10:49 ` Maxime Ripard
2013-12-02 11:57 ` Daniel Lezcano
1 sibling, 2 replies; 5+ messages in thread
From: Daniel Lezcano @ 2013-12-02 10:32 UTC (permalink / raw)
To: linux-arm-kernel
On 12/02/2013 10:29 AM, Marc Zyngier wrote:
> The sun4i timer can still be ticking when we enable the interrupt.
> If another timer is actually used (A7 architected timer, for example),
> odds are that the interrupt will eventually fire with the event_handler
> pointer being NULL.
>
> The obvious fix it to stop the timer before registering the interrupt.
>
> Observed and tested on sun7i (cubietruck).
>
> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
> Daniel,
>
> Maxime asked me to forward this to you directly. Please consider merging
> it for 3.13.
>
> Thanks,
>
> M.
>
> 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 2fb4695..a4f6119 100644
> --- a/drivers/clocksource/sun4i_timer.c
> +++ b/drivers/clocksource/sun4i_timer.c
> @@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node *node)
> writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
> timer_base + TIMER_CTL_REG(0));
>
> + /* Make sure timer is stopped before playing with interrupts */
> + sun4i_clkevt_time_stop(0);
> +
It isn't possible to *not* enable it instead of stopping it ?
In the code before we have:
writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD |
TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
timer_base + TIMER_CTL_REG(1));
If we remove the TIMER_CTL_ENABLE flag, wouldn't it fix the issue ?
> ret = setup_irq(irq, &sun4i_timer_irq);
> if (ret)
> pr_warn("failed to setup irq %d\n", irq);
>
--
<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
^ permalink raw reply [flat|nested] 5+ messages in thread* [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts
2013-12-02 10:32 ` Daniel Lezcano
@ 2013-12-02 10:46 ` Marc Zyngier
2013-12-02 10:49 ` Maxime Ripard
1 sibling, 0 replies; 5+ messages in thread
From: Marc Zyngier @ 2013-12-02 10:46 UTC (permalink / raw)
To: linux-arm-kernel
On 02/12/13 10:32, Daniel Lezcano wrote:
> On 12/02/2013 10:29 AM, Marc Zyngier wrote:
>> The sun4i timer can still be ticking when we enable the interrupt.
>> If another timer is actually used (A7 architected timer, for example),
>> odds are that the interrupt will eventually fire with the event_handler
>> pointer being NULL.
>>
>> The obvious fix it to stop the timer before registering the interrupt.
>>
>> Observed and tested on sun7i (cubietruck).
>>
>> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
>> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> ---
>> Daniel,
>>
>> Maxime asked me to forward this to you directly. Please consider merging
>> it for 3.13.
>>
>> Thanks,
>>
>> M.
>>
>> 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 2fb4695..a4f6119 100644
>> --- a/drivers/clocksource/sun4i_timer.c
>> +++ b/drivers/clocksource/sun4i_timer.c
>> @@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node *node)
>> writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
>> timer_base + TIMER_CTL_REG(0));
>>
>> + /* Make sure timer is stopped before playing with interrupts */
>> + sun4i_clkevt_time_stop(0);
>> +
>
> It isn't possible to *not* enable it instead of stopping it ?
Well, it is already enabled by the bootloader.
> In the code before we have:
>
> writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD |
> TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
> timer_base + TIMER_CTL_REG(1));
>
> If we remove the TIMER_CTL_ENABLE flag, wouldn't it fix the issue ?
No. This piece of code enables the clocksource, which is implemented
using timer 1. Timer 0 still needs to be disabled.
M.
--
Jazz is not dead. It just smells funny...
^ permalink raw reply [flat|nested] 5+ messages in thread
* [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts
2013-12-02 10:32 ` Daniel Lezcano
2013-12-02 10:46 ` Marc Zyngier
@ 2013-12-02 10:49 ` Maxime Ripard
1 sibling, 0 replies; 5+ messages in thread
From: Maxime Ripard @ 2013-12-02 10:49 UTC (permalink / raw)
To: linux-arm-kernel
Hi Daniel,
On Mon, Dec 02, 2013 at 11:32:03AM +0100, Daniel Lezcano wrote:
>>+ /* Make sure timer is stopped before playing with interrupts */
>>+ sun4i_clkevt_time_stop(0);
>>+
>
> It isn't possible to *not* enable it instead of stopping it ?
>
> In the code before we have:
>
> writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD |
> TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M),
> timer_base + TIMER_CTL_REG(1));
>
> If we remove the TIMER_CTL_ENABLE flag, wouldn't it fix the issue ?
Actually, this excerpt enables the timer 1, that is used as a
clocksource, while Marc stops the timer 0, which is used as our clock
event.
The timer 0 is enabled only whenever either .set_mode or
.set_next_event is called.
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20131202/490fefcf/attachment.sig>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts
2013-12-02 9:29 [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts Marc Zyngier
2013-12-02 10:32 ` Daniel Lezcano
@ 2013-12-02 11:57 ` Daniel Lezcano
1 sibling, 0 replies; 5+ messages in thread
From: Daniel Lezcano @ 2013-12-02 11:57 UTC (permalink / raw)
To: linux-arm-kernel
On 12/02/2013 10:29 AM, Marc Zyngier wrote:
> The sun4i timer can still be ticking when we enable the interrupt.
> If another timer is actually used (A7 architected timer, for example),
> odds are that the interrupt will eventually fire with the event_handler
> pointer being NULL.
>
> The obvious fix it to stop the timer before registering the interrupt.
>
> Observed and tested on sun7i (cubietruck).
>
> Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
Applied to my tree as 3.13 fixes.
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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-12-02 11:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-02 9:29 [REPOST PATCH] ARM: sunxi: stop timer from ticking before enabling interrupts Marc Zyngier
2013-12-02 10:32 ` Daniel Lezcano
2013-12-02 10:46 ` Marc Zyngier
2013-12-02 10:49 ` Maxime Ripard
2013-12-02 11:57 ` Daniel Lezcano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).