On 12/04/2021 05:22, Evan Benn wrote: > Interrupts are disabled during suspend before this driver disables its > timers. ARM trusted firmware will abort suspend if the timer irq is > pending, so ack and disable the timer interrupt during suspend. > > Signed-off-by: Evan Benn <evanb...@chromium.org> > --- > > Changes in v3: > Move the ACK from the shutdown to the suspend function. > > Changes in v2: > Remove the patch that splits the drivers into 2 files. > > drivers/clocksource/timer-mediatek.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/drivers/clocksource/timer-mediatek.c > b/drivers/clocksource/timer-mediatek.c > index 9318edcd8963..1ae8fee639bf 100644 > --- a/drivers/clocksource/timer-mediatek.c > +++ b/drivers/clocksource/timer-mediatek.c > @@ -241,6 +241,27 @@ static void mtk_gpt_enable_irq(struct timer_of *to, u8 > timer) > timer_of_base(to) + GPT_IRQ_EN_REG); > } > > +static void mtk_gpt_resume(struct clock_event_device *clk) > +{ > + struct timer_of *to = to_timer_of(clk); > + > + mtk_gpt_enable_irq(to, TIMER_CLK_EVT); > +} > + > +static void mtk_gpt_suspend(struct clock_event_device *clk) > +{ > + struct timer_of *to = to_timer_of(clk); > + > + /* Disable all interrupts */ > + writel(0x0, timer_of_base(to) + GPT_IRQ_EN_REG); > + > + /* This is called with interrupts disabled,
Please fix the comment style: /* * This is called with interrupts disabled * so ... * ... */ Other than than that I'll be happy to pick it. > + * so we need to ack any interrupt that is pending > + * Or for example ATF will prevent a suspend from completing. > + */ > + writel(0x3f, timer_of_base(to) + GPT_IRQ_ACK_REG); > +} > + > static struct timer_of to = { > .flags = TIMER_OF_IRQ | TIMER_OF_BASE | TIMER_OF_CLOCK, > > @@ -286,6 +307,8 @@ static int __init mtk_gpt_init(struct device_node *node) > to.clkevt.set_state_oneshot = mtk_gpt_clkevt_shutdown; > to.clkevt.tick_resume = mtk_gpt_clkevt_shutdown; > to.clkevt.set_next_event = mtk_gpt_clkevt_next_event; > + to.clkevt.suspend = mtk_gpt_suspend; > + to.clkevt.resume = mtk_gpt_resume; > to.of_irq.handler = mtk_gpt_interrupt; > > ret = timer_of_init(node, &to); > -- <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