|
@@ -1271,6 +1271,40 @@ void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
|
|
|
} while (read_seqretry(&timekeeper.lock, seq));
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HIGH_RES_TIMERS
|
|
|
+/**
|
|
|
+ * ktime_get_update_offsets - hrtimer helper
|
|
|
+ * @offs_real: pointer to storage for monotonic -> realtime offset
|
|
|
+ * @offs_boot: pointer to storage for monotonic -> boottime offset
|
|
|
+ *
|
|
|
+ * Returns current monotonic time and updates the offsets
|
|
|
+ * Called from hrtimer_interupt() or retrigger_next_event()
|
|
|
+ */
|
|
|
+ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot)
|
|
|
+{
|
|
|
+ ktime_t now;
|
|
|
+ unsigned int seq;
|
|
|
+ u64 secs, nsecs;
|
|
|
+
|
|
|
+ do {
|
|
|
+ seq = read_seqbegin(&timekeeper.lock);
|
|
|
+
|
|
|
+ secs = timekeeper.xtime.tv_sec;
|
|
|
+ nsecs = timekeeper.xtime.tv_nsec;
|
|
|
+ nsecs += timekeeping_get_ns();
|
|
|
+ /* If arch requires, add in gettimeoffset() */
|
|
|
+ nsecs += arch_gettimeoffset();
|
|
|
+
|
|
|
+ *offs_real = timekeeper.offs_real;
|
|
|
+ *offs_boot = timekeeper.offs_boot;
|
|
|
+ } while (read_seqretry(&timekeeper.lock, seq));
|
|
|
+
|
|
|
+ now = ktime_add_ns(ktime_set(secs, 0), nsecs);
|
|
|
+ now = ktime_sub(now, *offs_real);
|
|
|
+ return now;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* ktime_get_monotonic_offset() - get wall_to_monotonic in ktime_t format
|
|
|
*/
|