Commit 852db46d55e85b475a72e665ca08d3317769ceef
Committed by
Thomas Gleixner
1 parent
f12a15be63
Exists in
master
and in
7 other branches
clocksource: Add __clocksource_updatefreq_hz/khz methods
To properly handle clocksources that change frequencies at the clocksource->enable() point, this patch adds a method that will update the clocksource's mult/shift and max_idle_ns values. Signed-off-by: John Stultz <johnstul@us.ibm.com> LKML-Reference: <1279068988-21864-12-git-send-email-johnstul@us.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Showing 2 changed files with 35 additions and 5 deletions Side-by-side Diff
include/linux/clocksource.h
... | ... | @@ -292,6 +292,8 @@ |
292 | 292 | */ |
293 | 293 | extern int |
294 | 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 | 298 | static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) |
297 | 299 | { |
... | ... | @@ -303,6 +305,15 @@ |
303 | 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 | 318 | static inline void |
308 | 319 | clocksource_calc_mult_shift(struct clocksource *cs, u32 freq, u32 minsec) |
kernel/time/clocksource.c
... | ... | @@ -639,19 +639,18 @@ |
639 | 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 | 643 | * @t: clocksource to be registered |
644 | 644 | * @scale: Scale factor multiplied against freq to get clocksource hz |
645 | 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 | 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 | 655 | * Ideally we want to use some of the limits used in |
657 | 656 | * clocksource_max_deferment, to provide a more informed |
658 | 657 | |
... | ... | @@ -662,7 +661,27 @@ |
662 | 661 | NSEC_PER_SEC/scale, |
663 | 662 | MAX_UPDATE_LENGTH*scale); |
664 | 663 | cs->max_idle_ns = clocksource_max_deferment(cs); |
664 | +} | |
665 | +EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale); | |
665 | 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); | |
683 | + | |
684 | + /* Add clocksource to the clcoksource list */ | |
666 | 685 | mutex_lock(&clocksource_mutex); |
667 | 686 | clocksource_enqueue(cs); |
668 | 687 | clocksource_select(); |