1
2
3
4
5
6
7
8
9#ifndef _LINUX_CLOCKCHIPS_H
10#define _LINUX_CLOCKCHIPS_H
11
12#ifdef CONFIG_GENERIC_CLOCKEVENTS
13
14# include <linux/clocksource.h>
15# include <linux/cpumask.h>
16# include <linux/ktime.h>
17# include <linux/notifier.h>
18
19struct clock_event_device;
20struct module;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35enum clock_event_state {
36 CLOCK_EVT_STATE_DETACHED,
37 CLOCK_EVT_STATE_SHUTDOWN,
38 CLOCK_EVT_STATE_PERIODIC,
39 CLOCK_EVT_STATE_ONESHOT,
40 CLOCK_EVT_STATE_ONESHOT_STOPPED,
41};
42
43
44
45
46# define CLOCK_EVT_FEAT_PERIODIC 0x000001
47# define CLOCK_EVT_FEAT_ONESHOT 0x000002
48# define CLOCK_EVT_FEAT_KTIME 0x000004
49
50
51
52
53
54
55
56# define CLOCK_EVT_FEAT_C3STOP 0x000008
57# define CLOCK_EVT_FEAT_DUMMY 0x000010
58
59
60
61
62# define CLOCK_EVT_FEAT_DYNIRQ 0x000020
63# define CLOCK_EVT_FEAT_PERCPU 0x000040
64
65
66
67
68# define CLOCK_EVT_FEAT_HRTIMER 0x000080
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100struct clock_event_device {
101 void (*event_handler)(struct clock_event_device *);
102 int (*set_next_event)(unsigned long evt, struct clock_event_device *);
103 int (*set_next_ktime)(ktime_t expires, struct clock_event_device *);
104 ktime_t next_event;
105 u64 max_delta_ns;
106 u64 min_delta_ns;
107 u32 mult;
108 u32 shift;
109 enum clock_event_state state_use_accessors;
110 unsigned int features;
111 unsigned long retries;
112
113 int (*set_state_periodic)(struct clock_event_device *);
114 int (*set_state_oneshot)(struct clock_event_device *);
115 int (*set_state_oneshot_stopped)(struct clock_event_device *);
116 int (*set_state_shutdown)(struct clock_event_device *);
117 int (*tick_resume)(struct clock_event_device *);
118
119 void (*broadcast)(const struct cpumask *mask);
120 void (*suspend)(struct clock_event_device *);
121 void (*resume)(struct clock_event_device *);
122 unsigned long min_delta_ticks;
123 unsigned long max_delta_ticks;
124
125 const char *name;
126 int rating;
127 int irq;
128 int bound_on;
129 const struct cpumask *cpumask;
130 struct list_head list;
131 struct module *owner;
132} ____cacheline_aligned;
133
134
135static inline bool clockevent_state_detached(struct clock_event_device *dev)
136{
137 return dev->state_use_accessors == CLOCK_EVT_STATE_DETACHED;
138}
139
140static inline bool clockevent_state_shutdown(struct clock_event_device *dev)
141{
142 return dev->state_use_accessors == CLOCK_EVT_STATE_SHUTDOWN;
143}
144
145static inline bool clockevent_state_periodic(struct clock_event_device *dev)
146{
147 return dev->state_use_accessors == CLOCK_EVT_STATE_PERIODIC;
148}
149
150static inline bool clockevent_state_oneshot(struct clock_event_device *dev)
151{
152 return dev->state_use_accessors == CLOCK_EVT_STATE_ONESHOT;
153}
154
155static inline bool clockevent_state_oneshot_stopped(struct clock_event_device *dev)
156{
157 return dev->state_use_accessors == CLOCK_EVT_STATE_ONESHOT_STOPPED;
158}
159
160
161
162
163
164
165
166
167
168
169
170
171static inline unsigned long
172div_sc(unsigned long ticks, unsigned long nsec, int shift)
173{
174 u64 tmp = ((u64)ticks) << shift;
175
176 do_div(tmp, nsec);
177
178 return (unsigned long) tmp;
179}
180
181
182extern u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt);
183extern void clockevents_register_device(struct clock_event_device *dev);
184extern int clockevents_unbind_device(struct clock_event_device *ced, int cpu);
185
186extern void clockevents_config_and_register(struct clock_event_device *dev,
187 u32 freq, unsigned long min_delta,
188 unsigned long max_delta);
189
190extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
191
192static inline void
193clockevents_calc_mult_shift(struct clock_event_device *ce, u32 freq, u32 maxsec)
194{
195 return clocks_calc_mult_shift(&ce->mult, &ce->shift, NSEC_PER_SEC, freq, maxsec);
196}
197
198extern void clockevents_suspend(void);
199extern void clockevents_resume(void);
200
201# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
202# ifdef CONFIG_ARCH_HAS_TICK_BROADCAST
203extern void tick_broadcast(const struct cpumask *mask);
204# else
205# define tick_broadcast NULL
206# endif
207extern int tick_receive_broadcast(void);
208# endif
209
210# if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT)
211extern void tick_setup_hrtimer_broadcast(void);
212extern int tick_check_broadcast_expired(void);
213# else
214static inline int tick_check_broadcast_expired(void) { return 0; }
215static inline void tick_setup_hrtimer_broadcast(void) { }
216# endif
217
218#else
219
220static inline void clockevents_suspend(void) { }
221static inline void clockevents_resume(void) { }
222static inline int tick_check_broadcast_expired(void) { return 0; }
223static inline void tick_setup_hrtimer_broadcast(void) { }
224
225#endif
226
227#endif
228