diff options
Diffstat (limited to 'drivers/clocksource/arm_global_timer.c')
-rw-r--r-- | drivers/clocksource/arm_global_timer.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c index a2cb6fae9295..d189d8cb69f7 100644 --- a/drivers/clocksource/arm_global_timer.c +++ b/drivers/clocksource/arm_global_timer.c | |||
@@ -99,17 +99,17 @@ static void gt_compare_set(unsigned long delta, int periodic) | |||
99 | 99 | ||
100 | counter += delta; | 100 | counter += delta; |
101 | ctrl = GT_CONTROL_TIMER_ENABLE; | 101 | ctrl = GT_CONTROL_TIMER_ENABLE; |
102 | writel(ctrl, gt_base + GT_CONTROL); | 102 | writel_relaxed(ctrl, gt_base + GT_CONTROL); |
103 | writel(lower_32_bits(counter), gt_base + GT_COMP0); | 103 | writel_relaxed(lower_32_bits(counter), gt_base + GT_COMP0); |
104 | writel(upper_32_bits(counter), gt_base + GT_COMP1); | 104 | writel_relaxed(upper_32_bits(counter), gt_base + GT_COMP1); |
105 | 105 | ||
106 | if (periodic) { | 106 | if (periodic) { |
107 | writel(delta, gt_base + GT_AUTO_INC); | 107 | writel_relaxed(delta, gt_base + GT_AUTO_INC); |
108 | ctrl |= GT_CONTROL_AUTO_INC; | 108 | ctrl |= GT_CONTROL_AUTO_INC; |
109 | } | 109 | } |
110 | 110 | ||
111 | ctrl |= GT_CONTROL_COMP_ENABLE | GT_CONTROL_IRQ_ENABLE; | 111 | ctrl |= GT_CONTROL_COMP_ENABLE | GT_CONTROL_IRQ_ENABLE; |
112 | writel(ctrl, gt_base + GT_CONTROL); | 112 | writel_relaxed(ctrl, gt_base + GT_CONTROL); |
113 | } | 113 | } |
114 | 114 | ||
115 | static int gt_clockevent_shutdown(struct clock_event_device *evt) | 115 | static int gt_clockevent_shutdown(struct clock_event_device *evt) |
@@ -195,12 +195,23 @@ static cycle_t gt_clocksource_read(struct clocksource *cs) | |||
195 | return gt_counter_read(); | 195 | return gt_counter_read(); |
196 | } | 196 | } |
197 | 197 | ||
198 | static void gt_resume(struct clocksource *cs) | ||
199 | { | ||
200 | unsigned long ctrl; | ||
201 | |||
202 | ctrl = readl(gt_base + GT_CONTROL); | ||
203 | if (!(ctrl & GT_CONTROL_TIMER_ENABLE)) | ||
204 | /* re-enable timer on resume */ | ||
205 | writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL); | ||
206 | } | ||
207 | |||
198 | static struct clocksource gt_clocksource = { | 208 | static struct clocksource gt_clocksource = { |
199 | .name = "arm_global_timer", | 209 | .name = "arm_global_timer", |
200 | .rating = 300, | 210 | .rating = 300, |
201 | .read = gt_clocksource_read, | 211 | .read = gt_clocksource_read, |
202 | .mask = CLOCKSOURCE_MASK(64), | 212 | .mask = CLOCKSOURCE_MASK(64), |
203 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 213 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
214 | .resume = gt_resume, | ||
204 | }; | 215 | }; |
205 | 216 | ||
206 | #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK | 217 | #ifdef CONFIG_CLKSRC_ARM_GLOBAL_TIMER_SCHED_CLOCK |