Commit 852db46d55e85b475a72e665ca08d3317769ceef

Authored by John Stultz
Committed by Thomas Gleixner
1 parent f12a15be63

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();