--- /dev/null
+From 6bd58f09e1d8cc6c50a824c00bf0d617919986a1 Mon Sep 17 00:00:00 2001
+From: "Christopher S. Hall" <christopher.s.hall@intel.com>
+Date: Mon, 22 Feb 2016 03:15:19 -0800
+Subject: time: Add cycles to nanoseconds translation
+
+From: Christopher S. Hall <christopher.s.hall@intel.com>
+
+commit 6bd58f09e1d8cc6c50a824c00bf0d617919986a1 upstream.
+
+The timekeeping code does not currently provide a way to translate
+externally provided clocksource cycles to system time. The cycle count
+is always provided by the result clocksource read() method internal to
+the timekeeping code. The added function timekeeping_cycles_to_ns()
+calculated a nanosecond value from a cycle count that can be added to
+tk_read_base.base value yielding the current system time. This allows
+clocksource cycle values external to the timekeeping code to provide a
+cycle count that can be transformed to system time.
+
+Cc: Prarit Bhargava <prarit@redhat.com>
+Cc: Richard Cochran <richardcochran@gmail.com>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Andy Lutomirski <luto@amacapital.net>
+Cc: kevin.b.stanton@intel.com
+Cc: kevin.j.clarke@intel.com
+Cc: hpa@zytor.com
+Cc: jeffrey.t.kirsher@intel.com
+Cc: netdev@vger.kernel.org
+Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Christopher S. Hall <christopher.s.hall@intel.com>
+Signed-off-by: John Stultz <john.stultz@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/time/timekeeping.c | 25 +++++++++++++++++++++----
+ 1 file changed, 21 insertions(+), 4 deletions(-)
+
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -298,17 +298,34 @@ u32 (*arch_gettimeoffset)(void) = defaul
+ static inline u32 arch_gettimeoffset(void) { return 0; }
+ #endif
+
++static inline s64 timekeeping_delta_to_ns(struct tk_read_base *tkr,
++ cycle_t delta)
++{
++ s64 nsec;
++
++ nsec = delta * tkr->mult + tkr->xtime_nsec;
++ nsec >>= tkr->shift;
++
++ /* If arch requires, add in get_arch_timeoffset() */
++ return nsec + arch_gettimeoffset();
++}
++
+ static inline s64 timekeeping_get_ns(struct tk_read_base *tkr)
+ {
+ cycle_t delta;
+- s64 nsec;
+
+ delta = timekeeping_get_delta(tkr);
++ return timekeeping_delta_to_ns(tkr, delta);
++}
+
+- nsec = (delta * tkr->mult + tkr->xtime_nsec) >> tkr->shift;
++static inline s64 timekeeping_cycles_to_ns(struct tk_read_base *tkr,
++ cycle_t cycles)
++{
++ cycle_t delta;
+
+- /* If arch requires, add in get_arch_timeoffset() */
+- return nsec + arch_gettimeoffset();
++ /* calculate the delta since the last update_wall_time */
++ delta = clocksource_delta(cycles, tkr->cycle_last, tkr->mask);
++ return timekeeping_delta_to_ns(tkr, delta);
+ }
+
+ /**