diff options
-rw-r--r-- | include/linux/clocksource.h | 11 | ||||
-rw-r--r-- | kernel/time/clocksource.c | 29 |
2 files changed, 35 insertions, 5 deletions
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 21677d99a161..c37b21ad5a3b 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
@@ -292,6 +292,8 @@ clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec); | |||
292 | */ | 292 | */ |
293 | extern int | 293 | extern int |
294 | __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq); | 294 | __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq); |
295 | extern void | ||
296 | __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq); | ||
295 | 297 | ||
296 | static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) | 298 | static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) |
297 | { | 299 | { |
@@ -303,6 +305,15 @@ static inline int clocksource_register_khz(struct clocksource *cs, u32 khz) | |||
303 | return __clocksource_register_scale(cs, 1000, khz); | 305 | return __clocksource_register_scale(cs, 1000, khz); |
304 | } | 306 | } |
305 | 307 | ||
308 | static inline void __clocksource_updatefreq_hz(struct clocksource *cs, u32 hz) | ||
309 | { | ||
310 | __clocksource_updatefreq_scale(cs, 1, hz); | ||
311 | } | ||
312 | |||
313 | static inline void __clocksource_updatefreq_khz(struct clocksource *cs, u32 khz) | ||
314 | { | ||
315 | __clocksource_updatefreq_scale(cs, 1000, khz); | ||
316 | } | ||
306 | 317 | ||
307 | static inline void | 318 | static inline void |
308 | clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec) | 319 | clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec) |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index c543d21b4e54..c18d7efa1b4b 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
@@ -639,19 +639,18 @@ static void clocksource_enqueue(struct clocksource *cs) | |||
639 | #define MAX_UPDATE_LENGTH 5 /* Seconds */ | 639 | #define MAX_UPDATE_LENGTH 5 /* Seconds */ |
640 | 640 | ||
641 | /** | 641 | /** |
642 | * __clocksource_register_scale - Used to install new clocksources | 642 | * __clocksource_updatefreq_scale - Used update clocksource with new freq |
643 | * @t: clocksource to be registered | 643 | * @t: clocksource to be registered |
644 | * @scale: Scale factor multiplied against freq to get clocksource hz | 644 | * @scale: Scale factor multiplied against freq to get clocksource hz |
645 | * @freq: clocksource frequency (cycles per second) divided by scale | 645 | * @freq: clocksource frequency (cycles per second) divided by scale |
646 | * | 646 | * |
647 | * Returns -EBUSY if registration fails, zero otherwise. | 647 | * This should only be called from the clocksource->enable() method. |
648 | * | 648 | * |
649 | * This *SHOULD NOT* be called directly! Please use the | 649 | * This *SHOULD NOT* be called directly! Please use the |
650 | * clocksource_register_hz() or clocksource_register_khz helper functions. | 650 | * clocksource_updatefreq_hz() or clocksource_updatefreq_khz helper functions. |
651 | */ | 651 | */ |
652 | int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) | 652 | void __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq) |
653 | { | 653 | { |
654 | |||
655 | /* | 654 | /* |
656 | * Ideally we want to use some of the limits used in | 655 | * Ideally we want to use some of the limits used in |
657 | * clocksource_max_deferment, to provide a more informed | 656 | * clocksource_max_deferment, to provide a more informed |
@@ -662,7 +661,27 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) | |||
662 | NSEC_PER_SEC/scale, | 661 | NSEC_PER_SEC/scale, |
663 | MAX_UPDATE_LENGTH*scale); | 662 | MAX_UPDATE_LENGTH*scale); |
664 | cs->max_idle_ns = clocksource_max_deferment(cs); | 663 | cs->max_idle_ns = clocksource_max_deferment(cs); |
664 | } | ||
665 | EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale); | ||
666 | |||
667 | /** | ||
668 | * __clocksource_register_scale - Used to install new clocksources | ||
669 | * @t: clocksource to be registered | ||
670 | * @scale: Scale factor multiplied against freq to get clocksource hz | ||
671 | * @freq: clocksource frequency (cycles per second) divided by scale | ||
672 | * | ||
673 | * Returns -EBUSY if registration fails, zero otherwise. | ||
674 | * | ||
675 | * This *SHOULD NOT* be called directly! Please use the | ||
676 | * clocksource_register_hz() or clocksource_register_khz helper functions. | ||
677 | */ | ||
678 | int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) | ||
679 | { | ||
680 | |||
681 | /* Intialize mult/shift and max_idle_ns */ | ||
682 | __clocksource_updatefreq_scale(cs, scale, freq); | ||
665 | 683 | ||
684 | /* Add clocksource to the clcoksource list */ | ||
666 | mutex_lock(&clocksource_mutex); | 685 | mutex_lock(&clocksource_mutex); |
667 | clocksource_enqueue(cs); | 686 | clocksource_enqueue(cs); |
668 | clocksource_select(); | 687 | clocksource_select(); |