aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource/sun4i_timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clocksource/sun4i_timer.c')
-rw-r--r--drivers/clocksource/sun4i_timer.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/clocksource/sun4i_timer.c b/drivers/clocksource/sun4i_timer.c
index 97669ee4df2a..c83452cacb41 100644
--- a/drivers/clocksource/sun4i_timer.c
+++ b/drivers/clocksource/sun4i_timer.c
@@ -123,12 +123,16 @@ static struct clock_event_device sun4i_clockevent = {
123 .set_next_event = sun4i_clkevt_next_event, 123 .set_next_event = sun4i_clkevt_next_event,
124}; 124};
125 125
126static void sun4i_timer_clear_interrupt(void)
127{
128 writel(TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_ST_REG);
129}
126 130
127static irqreturn_t sun4i_timer_interrupt(int irq, void *dev_id) 131static irqreturn_t sun4i_timer_interrupt(int irq, void *dev_id)
128{ 132{
129 struct clock_event_device *evt = (struct clock_event_device *)dev_id; 133 struct clock_event_device *evt = (struct clock_event_device *)dev_id;
130 134
131 writel(0x1, timer_base + TIMER_IRQ_ST_REG); 135 sun4i_timer_clear_interrupt();
132 evt->event_handler(evt); 136 evt->event_handler(evt);
133 137
134 return IRQ_HANDLED; 138 return IRQ_HANDLED;
@@ -208,6 +212,9 @@ static int __init sun4i_timer_init(struct device_node *node)
208 /* Make sure timer is stopped before playing with interrupts */ 212 /* Make sure timer is stopped before playing with interrupts */
209 sun4i_clkevt_time_stop(0); 213 sun4i_clkevt_time_stop(0);
210 214
215 /* clear timer0 interrupt */
216 sun4i_timer_clear_interrupt();
217
211 sun4i_clockevent.cpumask = cpu_possible_mask; 218 sun4i_clockevent.cpumask = cpu_possible_mask;
212 sun4i_clockevent.irq = irq; 219 sun4i_clockevent.irq = irq;
213 220