aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource/arm_arch_timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clocksource/arm_arch_timer.c')
-rw-r--r--drivers/clocksource/arm_arch_timer.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index a2b254189782..ffadd836e0b5 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -123,7 +123,7 @@ static int arch_timer_set_next_event_phys(unsigned long evt,
123 return 0; 123 return 0;
124} 124}
125 125
126static int __cpuinit arch_timer_setup(struct clock_event_device *clk) 126static int arch_timer_setup(struct clock_event_device *clk)
127{ 127{
128 clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP; 128 clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP;
129 clk->name = "arch_sys_timer"; 129 clk->name = "arch_sys_timer";
@@ -186,27 +186,19 @@ u32 arch_timer_get_rate(void)
186 return arch_timer_rate; 186 return arch_timer_rate;
187} 187}
188 188
189/* 189u64 arch_timer_read_counter(void)
190 * Some external users of arch_timer_read_counter (e.g. sched_clock) may try to
191 * call it before it has been initialised. Rather than incur a performance
192 * penalty checking for initialisation, provide a default implementation that
193 * won't lead to time appearing to jump backwards.
194 */
195static u64 arch_timer_read_zero(void)
196{ 190{
197 return 0; 191 return arch_counter_get_cntvct();
198} 192}
199 193
200u64 (*arch_timer_read_counter)(void) = arch_timer_read_zero;
201
202static cycle_t arch_counter_read(struct clocksource *cs) 194static cycle_t arch_counter_read(struct clocksource *cs)
203{ 195{
204 return arch_timer_read_counter(); 196 return arch_counter_get_cntvct();
205} 197}
206 198
207static cycle_t arch_counter_read_cc(const struct cyclecounter *cc) 199static cycle_t arch_counter_read_cc(const struct cyclecounter *cc)
208{ 200{
209 return arch_timer_read_counter(); 201 return arch_counter_get_cntvct();
210} 202}
211 203
212static struct clocksource clocksource_counter = { 204static struct clocksource clocksource_counter = {
@@ -229,7 +221,7 @@ struct timecounter *arch_timer_get_timecounter(void)
229 return &timecounter; 221 return &timecounter;
230} 222}
231 223
232static void __cpuinit arch_timer_stop(struct clock_event_device *clk) 224static void arch_timer_stop(struct clock_event_device *clk)
233{ 225{
234 pr_debug("arch_timer_teardown disable IRQ%d cpu #%d\n", 226 pr_debug("arch_timer_teardown disable IRQ%d cpu #%d\n",
235 clk->irq, smp_processor_id()); 227 clk->irq, smp_processor_id());
@@ -245,7 +237,7 @@ static void __cpuinit arch_timer_stop(struct clock_event_device *clk)
245 clk->set_mode(CLOCK_EVT_MODE_UNUSED, clk); 237 clk->set_mode(CLOCK_EVT_MODE_UNUSED, clk);
246} 238}
247 239
248static int __cpuinit arch_timer_cpu_notify(struct notifier_block *self, 240static int arch_timer_cpu_notify(struct notifier_block *self,
249 unsigned long action, void *hcpu) 241 unsigned long action, void *hcpu)
250{ 242{
251 /* 243 /*
@@ -264,7 +256,7 @@ static int __cpuinit arch_timer_cpu_notify(struct notifier_block *self,
264 return NOTIFY_OK; 256 return NOTIFY_OK;
265} 257}
266 258
267static struct notifier_block arch_timer_cpu_nb __cpuinitdata = { 259static struct notifier_block arch_timer_cpu_nb = {
268 .notifier_call = arch_timer_cpu_notify, 260 .notifier_call = arch_timer_cpu_notify,
269}; 261};
270 262
@@ -287,7 +279,7 @@ static int __init arch_timer_register(void)
287 cyclecounter.mult = clocksource_counter.mult; 279 cyclecounter.mult = clocksource_counter.mult;
288 cyclecounter.shift = clocksource_counter.shift; 280 cyclecounter.shift = clocksource_counter.shift;
289 timecounter_init(&timecounter, &cyclecounter, 281 timecounter_init(&timecounter, &cyclecounter,
290 arch_counter_get_cntpct()); 282 arch_counter_get_cntvct());
291 283
292 if (arch_timer_use_virtual) { 284 if (arch_timer_use_virtual) {
293 ppi = arch_timer_ppi[VIRT_PPI]; 285 ppi = arch_timer_ppi[VIRT_PPI];
@@ -376,11 +368,6 @@ static void __init arch_timer_init(struct device_node *np)
376 } 368 }
377 } 369 }
378 370
379 if (arch_timer_use_virtual)
380 arch_timer_read_counter = arch_counter_get_cntvct;
381 else
382 arch_timer_read_counter = arch_counter_get_cntpct;
383
384 arch_timer_register(); 371 arch_timer_register();
385 arch_timer_arch_init(); 372 arch_timer_arch_init();
386} 373}