diff options
Diffstat (limited to 'include/linux/clocksource.h')
| -rw-r--r-- | include/linux/clocksource.h | 45 | 
1 files changed, 19 insertions, 26 deletions
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 6013021a3b39..a307bf62974f 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -118,6 +118,23 @@ struct clocksource {  /* simplify initialization of mask field */  #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) +static inline u32 clocksource_freq2mult(u32 freq, u32 shift_constant, u64 from) +{ +	/*  freq = cyc/from +	 *  mult/2^shift  = ns/cyc +	 *  mult = ns/cyc * 2^shift +	 *  mult = from/freq * 2^shift +	 *  mult = from * 2^shift / freq +	 *  mult = (from<<shift) / freq +	 */ +	u64 tmp = ((u64)from) << shift_constant; + +	tmp += freq/2; /* round for do_div */ +	do_div(tmp, freq); + +	return (u32)tmp; +} +  /**   * clocksource_khz2mult - calculates mult from khz and shift   * @khz:		Clocksource frequency in KHz @@ -128,19 +145,7 @@ struct clocksource {   */  static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)  { -	/*  khz = cyc/(Million ns) -	 *  mult/2^shift  = ns/cyc -	 *  mult = ns/cyc * 2^shift -	 *  mult = 1Million/khz * 2^shift -	 *  mult = 1000000 * 2^shift / khz -	 *  mult = (1000000<<shift) / khz -	 */ -	u64 tmp = ((u64)1000000) << shift_constant; - -	tmp += khz/2; /* round for do_div */ -	do_div(tmp, khz); - -	return (u32)tmp; +	return clocksource_freq2mult(khz, shift_constant, NSEC_PER_MSEC);  }  /** @@ -154,19 +159,7 @@ static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)   */  static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)  { -	/*  hz = cyc/(Billion ns) -	 *  mult/2^shift  = ns/cyc -	 *  mult = ns/cyc * 2^shift -	 *  mult = 1Billion/hz * 2^shift -	 *  mult = 1000000000 * 2^shift / hz -	 *  mult = (1000000000<<shift) / hz -	 */ -	u64 tmp = ((u64)1000000000) << shift_constant; - -	tmp += hz/2; /* round for do_div */ -	do_div(tmp, hz); - -	return (u32)tmp; +	return clocksource_freq2mult(hz, shift_constant, NSEC_PER_SEC);  }  /**  | 
