diff options
Diffstat (limited to 'drivers/clocksource/sun4i_timer.c')
-rw-r--r-- | drivers/clocksource/sun4i_timer.c | 9 |
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 | ||
126 | static void sun4i_timer_clear_interrupt(void) | ||
127 | { | ||
128 | writel(TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_ST_REG); | ||
129 | } | ||
126 | 130 | ||
127 | static irqreturn_t sun4i_timer_interrupt(int irq, void *dev_id) | 131 | static 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 | ||