diff options
Diffstat (limited to 'kernel/time/clockevents.c')
-rw-r--r-- | kernel/time/clockevents.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 620b58abdc32..3d5fc0fd1cca 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/sysdev.h> | 20 | #include <linux/sysdev.h> |
21 | #include <linux/tick.h> | 21 | #include <linux/tick.h> |
22 | 22 | ||
23 | #include "tick-internal.h" | ||
24 | |||
23 | /* The registered clock event devices */ | 25 | /* The registered clock event devices */ |
24 | static LIST_HEAD(clockevent_devices); | 26 | static LIST_HEAD(clockevent_devices); |
25 | static LIST_HEAD(clockevents_released); | 27 | static LIST_HEAD(clockevents_released); |
@@ -28,7 +30,7 @@ static LIST_HEAD(clockevents_released); | |||
28 | static RAW_NOTIFIER_HEAD(clockevents_chain); | 30 | static RAW_NOTIFIER_HEAD(clockevents_chain); |
29 | 31 | ||
30 | /* Protection for the above */ | 32 | /* Protection for the above */ |
31 | static DEFINE_SPINLOCK(clockevents_lock); | 33 | static DEFINE_RAW_SPINLOCK(clockevents_lock); |
32 | 34 | ||
33 | /** | 35 | /** |
34 | * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds | 36 | * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds |
@@ -37,10 +39,9 @@ static DEFINE_SPINLOCK(clockevents_lock); | |||
37 | * | 39 | * |
38 | * Math helper, returns latch value converted to nanoseconds (bound checked) | 40 | * Math helper, returns latch value converted to nanoseconds (bound checked) |
39 | */ | 41 | */ |
40 | unsigned long clockevent_delta2ns(unsigned long latch, | 42 | u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt) |
41 | struct clock_event_device *evt) | ||
42 | { | 43 | { |
43 | u64 clc = ((u64) latch << evt->shift); | 44 | u64 clc = (u64) latch << evt->shift; |
44 | 45 | ||
45 | if (unlikely(!evt->mult)) { | 46 | if (unlikely(!evt->mult)) { |
46 | evt->mult = 1; | 47 | evt->mult = 1; |
@@ -50,10 +51,10 @@ unsigned long clockevent_delta2ns(unsigned long latch, | |||
50 | do_div(clc, evt->mult); | 51 | do_div(clc, evt->mult); |
51 | if (clc < 1000) | 52 | if (clc < 1000) |
52 | clc = 1000; | 53 | clc = 1000; |
53 | if (clc > LONG_MAX) | 54 | if (clc > KTIME_MAX) |
54 | clc = LONG_MAX; | 55 | clc = KTIME_MAX; |
55 | 56 | ||
56 | return (unsigned long) clc; | 57 | return clc; |
57 | } | 58 | } |
58 | EXPORT_SYMBOL_GPL(clockevent_delta2ns); | 59 | EXPORT_SYMBOL_GPL(clockevent_delta2ns); |
59 | 60 | ||
@@ -140,9 +141,9 @@ int clockevents_register_notifier(struct notifier_block *nb) | |||
140 | unsigned long flags; | 141 | unsigned long flags; |
141 | int ret; | 142 | int ret; |
142 | 143 | ||
143 | spin_lock_irqsave(&clockevents_lock, flags); | 144 | raw_spin_lock_irqsave(&clockevents_lock, flags); |
144 | ret = raw_notifier_chain_register(&clockevents_chain, nb); | 145 | ret = raw_notifier_chain_register(&clockevents_chain, nb); |
145 | spin_unlock_irqrestore(&clockevents_lock, flags); | 146 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); |
146 | 147 | ||
147 | return ret; | 148 | return ret; |
148 | } | 149 | } |
@@ -184,13 +185,13 @@ void clockevents_register_device(struct clock_event_device *dev) | |||
184 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); | 185 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); |
185 | BUG_ON(!dev->cpumask); | 186 | BUG_ON(!dev->cpumask); |
186 | 187 | ||
187 | spin_lock_irqsave(&clockevents_lock, flags); | 188 | raw_spin_lock_irqsave(&clockevents_lock, flags); |
188 | 189 | ||
189 | list_add(&dev->list, &clockevent_devices); | 190 | list_add(&dev->list, &clockevent_devices); |
190 | clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev); | 191 | clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev); |
191 | clockevents_notify_released(); | 192 | clockevents_notify_released(); |
192 | 193 | ||
193 | spin_unlock_irqrestore(&clockevents_lock, flags); | 194 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); |
194 | } | 195 | } |
195 | EXPORT_SYMBOL_GPL(clockevents_register_device); | 196 | EXPORT_SYMBOL_GPL(clockevents_register_device); |
196 | 197 | ||
@@ -240,7 +241,7 @@ void clockevents_notify(unsigned long reason, void *arg) | |||
240 | struct list_head *node, *tmp; | 241 | struct list_head *node, *tmp; |
241 | unsigned long flags; | 242 | unsigned long flags; |
242 | 243 | ||
243 | spin_lock_irqsave(&clockevents_lock, flags); | 244 | raw_spin_lock_irqsave(&clockevents_lock, flags); |
244 | clockevents_do_notify(reason, arg); | 245 | clockevents_do_notify(reason, arg); |
245 | 246 | ||
246 | switch (reason) { | 247 | switch (reason) { |
@@ -255,7 +256,7 @@ void clockevents_notify(unsigned long reason, void *arg) | |||
255 | default: | 256 | default: |
256 | break; | 257 | break; |
257 | } | 258 | } |
258 | spin_unlock_irqrestore(&clockevents_lock, flags); | 259 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); |
259 | } | 260 | } |
260 | EXPORT_SYMBOL_GPL(clockevents_notify); | 261 | EXPORT_SYMBOL_GPL(clockevents_notify); |
261 | #endif | 262 | #endif |