Branch data Line data Source code
1 : : /*
2 : : * linux/drivers/clocksource/dummy_timer.c
3 : : *
4 : : * Copyright (C) 2013 ARM Ltd.
5 : : * All Rights Reserved
6 : : *
7 : : * This program is free software; you can redistribute it and/or modify
8 : : * it under the terms of the GNU General Public License version 2 as
9 : : * published by the Free Software Foundation.
10 : : */
11 : : #include <linux/clockchips.h>
12 : : #include <linux/cpu.h>
13 : : #include <linux/init.h>
14 : : #include <linux/percpu.h>
15 : : #include <linux/cpumask.h>
16 : :
17 : : static DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt);
18 : :
19 : 0 : static void dummy_timer_set_mode(enum clock_event_mode mode,
20 : : struct clock_event_device *evt)
21 : : {
22 : : /*
23 : : * Core clockevents code will call this when exchanging timer devices.
24 : : * We don't need to do anything here.
25 : : */
26 : 0 : }
27 : :
28 : 0 : static void dummy_timer_setup(void)
29 : : {
30 : 0 : int cpu = smp_processor_id();
31 : 0 : struct clock_event_device *evt = __this_cpu_ptr(&dummy_timer_evt);
32 : :
33 : 0 : evt->name = "dummy_timer";
34 : 0 : evt->features = CLOCK_EVT_FEAT_PERIODIC |
35 : : CLOCK_EVT_FEAT_ONESHOT |
36 : : CLOCK_EVT_FEAT_DUMMY;
37 : 0 : evt->rating = 100;
38 : 0 : evt->set_mode = dummy_timer_set_mode;
39 : 0 : evt->cpumask = cpumask_of(cpu);
40 : :
41 : 0 : clockevents_register_device(evt);
42 : 0 : }
43 : :
44 : 0 : static int dummy_timer_cpu_notify(struct notifier_block *self,
45 : : unsigned long action, void *hcpu)
46 : : {
47 [ # # ]: 0 : if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING)
48 : 0 : dummy_timer_setup();
49 : :
50 : 0 : return NOTIFY_OK;
51 : : }
52 : :
53 : : static struct notifier_block dummy_timer_cpu_nb = {
54 : : .notifier_call = dummy_timer_cpu_notify,
55 : : };
56 : :
57 : 0 : static int __init dummy_timer_register(void)
58 : : {
59 : 0 : int err = register_cpu_notifier(&dummy_timer_cpu_nb);
60 [ # # ]: 0 : if (err)
61 : : return err;
62 : :
63 : : /* We won't get a call on the boot CPU, so register immediately */
64 [ # # ]: 0 : if (num_possible_cpus() > 1)
65 : 0 : dummy_timer_setup();
66 : :
67 : : return 0;
68 : : }
69 : : early_initcall(dummy_timer_register);
|