Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
clockchips.h
Go to the documentation of this file.
1 /* linux/include/linux/clockchips.h
2  *
3  * This file contains the structure definitions for clockchips.
4  *
5  * If you are not a clockchip, or the time of day code, you should
6  * not be including this file!
7  */
8 #ifndef _LINUX_CLOCKCHIPS_H
9 #define _LINUX_CLOCKCHIPS_H
10 
11 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
12 
13 #include <linux/clocksource.h>
14 #include <linux/cpumask.h>
15 #include <linux/ktime.h>
16 #include <linux/notifier.h>
17 
18 struct clock_event_device;
19 
20 /* Clock event mode commands */
21 enum clock_event_mode {
22  CLOCK_EVT_MODE_UNUSED = 0,
23  CLOCK_EVT_MODE_SHUTDOWN,
24  CLOCK_EVT_MODE_PERIODIC,
25  CLOCK_EVT_MODE_ONESHOT,
26  CLOCK_EVT_MODE_RESUME,
27 };
28 
29 /* Clock event notification values */
30 enum clock_event_nofitiers {
31  CLOCK_EVT_NOTIFY_ADD,
32  CLOCK_EVT_NOTIFY_BROADCAST_ON,
33  CLOCK_EVT_NOTIFY_BROADCAST_OFF,
34  CLOCK_EVT_NOTIFY_BROADCAST_FORCE,
35  CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
36  CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
37  CLOCK_EVT_NOTIFY_SUSPEND,
38  CLOCK_EVT_NOTIFY_RESUME,
39  CLOCK_EVT_NOTIFY_CPU_DYING,
40  CLOCK_EVT_NOTIFY_CPU_DEAD,
41 };
42 
43 /*
44  * Clock event features
45  */
46 #define CLOCK_EVT_FEAT_PERIODIC 0x000001
47 #define CLOCK_EVT_FEAT_ONESHOT 0x000002
48 #define CLOCK_EVT_FEAT_KTIME 0x000004
49 /*
50  * x86(64) specific misfeatures:
51  *
52  * - Clockevent source stops in C3 State and needs broadcast support.
53  * - Local APIC timer is used as a dummy device.
54  */
55 #define CLOCK_EVT_FEAT_C3STOP 0x000008
56 #define CLOCK_EVT_FEAT_DUMMY 0x000010
57 
82 struct clock_event_device {
83  void (*event_handler)(struct clock_event_device *);
84  int (*set_next_event)(unsigned long evt,
85  struct clock_event_device *);
86  int (*set_next_ktime)(ktime_t expires,
87  struct clock_event_device *);
88  ktime_t next_event;
89  u64 max_delta_ns;
90  u64 min_delta_ns;
91  u32 mult;
92  u32 shift;
93  enum clock_event_mode mode;
94  unsigned int features;
95  unsigned long retries;
96 
97  void (*broadcast)(const struct cpumask *mask);
98  void (*set_mode)(enum clock_event_mode mode,
99  struct clock_event_device *);
100  void (*suspend)(struct clock_event_device *);
101  void (*resume)(struct clock_event_device *);
102  unsigned long min_delta_ticks;
103  unsigned long max_delta_ticks;
104 
105  const char *name;
106  int rating;
107  int irq;
108  const struct cpumask *cpumask;
109  struct list_head list;
111 
112 /*
113  * Calculate a multiplication factor for scaled math, which is used to convert
114  * nanoseconds based values to clock ticks:
115  *
116  * clock_ticks = (nanoseconds * factor) >> shift.
117  *
118  * div_sc is the rearranged equation to calculate a factor from a given clock
119  * ticks / nanoseconds ratio:
120  *
121  * factor = (clock_ticks << shift) / nanoseconds
122  */
123 static inline unsigned long div_sc(unsigned long ticks, unsigned long nsec,
124  int shift)
125 {
126  uint64_t tmp = ((uint64_t)ticks) << shift;
127 
128  do_div(tmp, nsec);
129  return (unsigned long) tmp;
130 }
131 
132 /* Clock event layer functions */
133 extern u64 clockevent_delta2ns(unsigned long latch,
134  struct clock_event_device *evt);
135 extern void clockevents_register_device(struct clock_event_device *dev);
136 
137 extern void clockevents_config(struct clock_event_device *dev, u32 freq);
138 extern void clockevents_config_and_register(struct clock_event_device *dev,
139  u32 freq, unsigned long min_delta,
140  unsigned long max_delta);
141 
142 extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
143 
144 extern void clockevents_exchange_device(struct clock_event_device *old,
145  struct clock_event_device *new);
146 extern void clockevents_set_mode(struct clock_event_device *dev,
147  enum clock_event_mode mode);
148 extern int clockevents_register_notifier(struct notifier_block *nb);
149 extern int clockevents_program_event(struct clock_event_device *dev,
150  ktime_t expires, bool force);
151 
152 extern void clockevents_handle_noop(struct clock_event_device *dev);
153 
154 static inline void
155 clockevents_calc_mult_shift(struct clock_event_device *ce, u32 freq, u32 minsec)
156 {
157  return clocks_calc_mult_shift(&ce->mult, &ce->shift, NSEC_PER_SEC,
158  freq, minsec);
159 }
160 
161 extern void clockevents_suspend(void);
162 extern void clockevents_resume(void);
163 
164 #ifdef CONFIG_GENERIC_CLOCKEVENTS
165 extern void clockevents_notify(unsigned long reason, void *arg);
166 #else
167 # define clockevents_notify(reason, arg) do { } while (0)
168 #endif
169 
170 #else /* CONFIG_GENERIC_CLOCKEVENTS_BUILD */
171 
172 static inline void clockevents_suspend(void) {}
173 static inline void clockevents_resume(void) {}
174 
175 #define clockevents_notify(reason, arg) do { } while (0)
176 
177 #endif
178 
179 #endif