Message ID | 1440453450-21203-1-git-send-email-daniel.lezcano@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 2015-08-24 at 23:57 +0200, Daniel Lezcano wrote: > After analysis done by Yingjoe Chen, the timer appears to have a pending > interrupt when it is enabled. > > Fix this by acknowledging the pending interrupt when enabling the timer > interrupt. > > Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> > --- > drivers/clocksource/mtk_timer.c | 16 ++++++---------- > 1 file changed, 6 insertions(+), 10 deletions(-) > > diff --git a/drivers/clocksource/mtk_timer.c b/drivers/clocksource/mtk_timer.c > index 4cd16fb..505f53d 100644 > --- a/drivers/clocksource/mtk_timer.c > +++ b/drivers/clocksource/mtk_timer.c > @@ -156,14 +156,6 @@ static irqreturn_t mtk_timer_interrupt(int irq, void *dev_id) > return IRQ_HANDLED; > } > > -static void mtk_timer_global_reset(struct mtk_clock_event_device *evt) > -{ > - /* Disable all interrupts */ > - writel(0x0, evt->gpt_base + GPT_IRQ_EN_REG); > - /* Acknowledge all interrupts */ > - writel(0x3f, evt->gpt_base + GPT_IRQ_ACK_REG); > -} > - > static void > mtk_timer_setup(struct mtk_clock_event_device *evt, u8 timer, u8 option) > { > @@ -183,6 +175,12 @@ static void mtk_timer_enable_irq(struct mtk_clock_event_device *evt, u8 timer) > { > u32 val; > > + /* Disable all interrupts */ > + writel(0x0, evt->gpt_base + GPT_IRQ_EN_REG); > + > + /* Acknowledge all spurious pending interrupts */ > + writel(0x3f, evt->gpt_base + GPT_IRQ_ACK_REG); > + > val = readl(evt->gpt_base + GPT_IRQ_EN_REG); > writel(val | GPT_IRQ_ENABLE(timer), > evt->gpt_base + GPT_IRQ_EN_REG); > @@ -232,8 +230,6 @@ static void __init mtk_timer_init(struct device_node *node) > } > rate = clk_get_rate(clk); > > - mtk_timer_global_reset(evt); > - > if (request_irq(evt->dev.irq, mtk_timer_interrupt, > IRQF_TIMER | IRQF_IRQPOLL, "mtk_timer", evt)) { > pr_warn("failed to setup irq %d\n", evt->dev.irq); Hi Daniel, Thanks for your patch, tested on mt8173 Tested-by: Yingjoe Chen <yingjoe.chen@mediatek.com> Joe.C
On 08/25/2015 03:21 PM, Yingjoe Chen wrote:
> Tested-by: Yingjoe Chen<yingjoe.chen@mediatek.com>
Applied to my tree for 4.4.
-- Daniel
On Wed, 2015-08-26 at 16:25 +0200, Daniel Lezcano wrote: > On 08/25/2015 03:21 PM, Yingjoe Chen wrote: > > Tested-by: Yingjoe Chen<yingjoe.chen@mediatek.com> > > Applied to my tree for 4.4. > > -- Daniel > Hi Daniel, I can't find this patch in https://git.linaro.org/people/daniel.lezcano/linux.git Is this tree public now? Where can I see it? Also, will you take patch[1] "clocksource: mediatek: Use GPT as sched clock source" in your tree? Joe.C [1]: http://lists.infradead.org/pipermail/linux-mediatek/2015-July/001547.html
On 09/04/2015 09:15 AM, Yingjoe Chen wrote: > On Wed, 2015-08-26 at 16:25 +0200, Daniel Lezcano wrote: >> On 08/25/2015 03:21 PM, Yingjoe Chen wrote: >>> Tested-by: Yingjoe Chen<yingjoe.chen@mediatek.com> >> >> Applied to my tree for 4.4. >> >> -- Daniel >> > > Hi Daniel, > > I can't find this patch in > https://git.linaro.org/people/daniel.lezcano/linux.git > Is this tree public now? Where can I see it? > > Also, will you take patch[1] "clocksource: mediatek: Use GPT as sched > clock source" in your tree? Yep. I did not push my branch. Done. Note it will be also available for linux-next. Thanks for the head up. -- Daniel
Hi Daniel, On 26/08/15 16:25, Daniel Lezcano wrote: > On 08/25/2015 03:21 PM, Yingjoe Chen wrote: >> Tested-by: Yingjoe Chen<yingjoe.chen@mediatek.com> > > Applied to my tree for 4.4. > > -- Daniel > Kevin found a regression in v4.3 which will need this patch to fix it [1]. Can you apply it to your clockevents/4.3-fixes branch please. Thanks, Matthias [1] https://lkml.org/lkml/2015/10/26/211
On 10/27/2015 12:11 PM, Matthias Brugger wrote: > Hi Daniel, > > On 26/08/15 16:25, Daniel Lezcano wrote: >> On 08/25/2015 03:21 PM, Yingjoe Chen wrote: >>> Tested-by: Yingjoe Chen<yingjoe.chen@mediatek.com> >> >> Applied to my tree for 4.4. >> >> -- Daniel >> > > Kevin found a regression in v4.3 which will need this patch to fix it > [1]. Can you apply it to your clockevents/4.3-fixes branch please. > > Thanks, > Matthias > > [1] https://lkml.org/lkml/2015/10/26/211 Hmm, I thought it wasn't impacting 4.3, so it went to 4.4. Let me look how to backport this fix without introducing a conflict when tip/timers/urgent will be merged to tip/timers/core.
On 10/27/2015 12:23 PM, Daniel Lezcano wrote: > On 10/27/2015 12:11 PM, Matthias Brugger wrote: >> Hi Daniel, >> >> On 26/08/15 16:25, Daniel Lezcano wrote: >>> On 08/25/2015 03:21 PM, Yingjoe Chen wrote: >>>> Tested-by: Yingjoe Chen<yingjoe.chen@mediatek.com> >>> >>> Applied to my tree for 4.4. >>> >>> -- Daniel >>> >> >> Kevin found a regression in v4.3 which will need this patch to fix it >> [1]. Can you apply it to your clockevents/4.3-fixes branch please. >> >> Thanks, >> Matthias >> >> [1] https://lkml.org/lkml/2015/10/26/211 > > Hmm, I thought it wasn't impacting 4.3, so it went to 4.4. > > Let me look how to backport this fix without introducing a conflict when > tip/timers/urgent will be merged to tip/timers/core. Thomas, do you think I can cherry-pick from tip/timers/core or clockevents/4.4 directly the fix to be pulled into clockevents/4.3-fixes ? That will certainly raise a conflict when tip/timers/urgent will be merged to tip/timers/core (a trivial conflict actually). -- Daniel
diff --git a/drivers/clocksource/mtk_timer.c b/drivers/clocksource/mtk_timer.c index 4cd16fb..505f53d 100644 --- a/drivers/clocksource/mtk_timer.c +++ b/drivers/clocksource/mtk_timer.c @@ -156,14 +156,6 @@ static irqreturn_t mtk_timer_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static void mtk_timer_global_reset(struct mtk_clock_event_device *evt) -{ - /* Disable all interrupts */ - writel(0x0, evt->gpt_base + GPT_IRQ_EN_REG); - /* Acknowledge all interrupts */ - writel(0x3f, evt->gpt_base + GPT_IRQ_ACK_REG); -} - static void mtk_timer_setup(struct mtk_clock_event_device *evt, u8 timer, u8 option) { @@ -183,6 +175,12 @@ static void mtk_timer_enable_irq(struct mtk_clock_event_device *evt, u8 timer) { u32 val; + /* Disable all interrupts */ + writel(0x0, evt->gpt_base + GPT_IRQ_EN_REG); + + /* Acknowledge all spurious pending interrupts */ + writel(0x3f, evt->gpt_base + GPT_IRQ_ACK_REG); + val = readl(evt->gpt_base + GPT_IRQ_EN_REG); writel(val | GPT_IRQ_ENABLE(timer), evt->gpt_base + GPT_IRQ_EN_REG); @@ -232,8 +230,6 @@ static void __init mtk_timer_init(struct device_node *node) } rate = clk_get_rate(clk); - mtk_timer_global_reset(evt); - if (request_irq(evt->dev.irq, mtk_timer_interrupt, IRQF_TIMER | IRQF_IRQPOLL, "mtk_timer", evt)) { pr_warn("failed to setup irq %d\n", evt->dev.irq);
After analysis done by Yingjoe Chen, the timer appears to have a pending interrupt when it is enabled. Fix this by acknowledging the pending interrupt when enabling the timer interrupt. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- drivers/clocksource/mtk_timer.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)