timekeeping: Simplify getboottime()
[pandora-kernel.git] / kernel / time / timekeeping.c
index d5be142..3edc0c1 100644 (file)
@@ -423,6 +423,53 @@ ktime_t ktime_get(void)
 }
 EXPORT_SYMBOL_GPL(ktime_get);
 
+static ktime_t *offsets[TK_OFFS_MAX] = {
+       [TK_OFFS_REAL]  = &tk_core.timekeeper.offs_real,
+       [TK_OFFS_BOOT]  = &tk_core.timekeeper.offs_boot,
+       [TK_OFFS_TAI]   = &tk_core.timekeeper.offs_tai,
+};
+
+ktime_t ktime_get_with_offset(enum tk_offsets offs)
+{
+       struct timekeeper *tk = &tk_core.timekeeper;
+       unsigned int seq;
+       ktime_t base, *offset = offsets[offs];
+       s64 nsecs;
+
+       WARN_ON(timekeeping_suspended);
+
+       do {
+               seq = read_seqcount_begin(&tk_core.seq);
+               base = ktime_add(tk->base_mono, *offset);
+               nsecs = timekeeping_get_ns(tk);
+
+       } while (read_seqcount_retry(&tk_core.seq, seq));
+
+       return ktime_add_ns(base, nsecs);
+
+}
+EXPORT_SYMBOL_GPL(ktime_get_with_offset);
+
+/**
+ * ktime_mono_to_any() - convert mononotic time to any other time
+ * @tmono:     time to convert.
+ * @offs:      which offset to use
+ */
+ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs)
+{
+       ktime_t *offset = offsets[offs];
+       unsigned long seq;
+       ktime_t tconv;
+
+       do {
+               seq = read_seqcount_begin(&tk_core.seq);
+               tconv = ktime_add(tmono, *offset);
+       } while (read_seqcount_retry(&tk_core.seq, seq));
+
+       return tconv;
+}
+EXPORT_SYMBOL_GPL(ktime_mono_to_any);
+
 /**
  * ktime_get_ts64 - get the monotonic clock in timespec64 format
  * @ts:                pointer to timespec variable
@@ -485,21 +532,6 @@ void timekeeping_clocktai(struct timespec *ts)
 }
 EXPORT_SYMBOL(timekeeping_clocktai);
 
-
-/**
- * ktime_get_clocktai - Returns the TAI time of day in a ktime
- *
- * Returns the time of day in a ktime.
- */
-ktime_t ktime_get_clocktai(void)
-{
-       struct timespec ts;
-
-       timekeeping_clocktai(&ts);
-       return timespec_to_ktime(ts);
-}
-EXPORT_SYMBOL(ktime_get_clocktai);
-
 #ifdef CONFIG_NTP_PPS
 
 /**
@@ -746,21 +778,6 @@ int timekeeping_notify(struct clocksource *clock)
        return tk->clock == clock ? 0 : -1;
 }
 
-/**
- * ktime_get_real - get the real (wall-) time in ktime_t format
- *
- * returns the time in ktime_t format
- */
-ktime_t ktime_get_real(void)
-{
-       struct timespec64 now;
-
-       getnstimeofday64(&now);
-
-       return timespec64_to_ktime(now);
-}
-EXPORT_SYMBOL_GPL(ktime_get_real);
-
 /**
  * getrawmonotonic - Returns the raw monotonic time in a timespec
  * @ts:                pointer to the timespec to be set
@@ -1508,82 +1525,11 @@ out:
 void getboottime(struct timespec *ts)
 {
        struct timekeeper *tk = &tk_core.timekeeper;
-       struct timespec boottime = {
-               .tv_sec = tk->wall_to_monotonic.tv_sec +
-                               tk->total_sleep_time.tv_sec,
-               .tv_nsec = tk->wall_to_monotonic.tv_nsec +
-                               tk->total_sleep_time.tv_nsec
-       };
-
-       set_normalized_timespec(ts, -boottime.tv_sec, -boottime.tv_nsec);
-}
-EXPORT_SYMBOL_GPL(getboottime);
-
-/**
- * get_monotonic_boottime - Returns monotonic time since boot
- * @ts:                pointer to the timespec to be set
- *
- * Returns the monotonic time since boot in a timespec.
- *
- * This is similar to CLOCK_MONTONIC/ktime_get_ts, but also
- * includes the time spent in suspend.
- */
-void get_monotonic_boottime(struct timespec *ts)
-{
-       struct timekeeper *tk = &tk_core.timekeeper;
-       struct timespec64 tomono, sleep, ret;
-       s64 nsec;
-       unsigned int seq;
-
-       WARN_ON(timekeeping_suspended);
-
-       do {
-               seq = read_seqcount_begin(&tk_core.seq);
-               ret.tv_sec = tk->xtime_sec;
-               nsec = timekeeping_get_ns(tk);
-               tomono = tk->wall_to_monotonic;
-               sleep = tk->total_sleep_time;
-
-       } while (read_seqcount_retry(&tk_core.seq, seq));
-
-       ret.tv_sec += tomono.tv_sec + sleep.tv_sec;
-       ret.tv_nsec = 0;
-       timespec64_add_ns(&ret, nsec + tomono.tv_nsec + sleep.tv_nsec);
-       *ts = timespec64_to_timespec(ret);
-}
-EXPORT_SYMBOL_GPL(get_monotonic_boottime);
-
-/**
- * ktime_get_boottime - Returns monotonic time since boot in a ktime
- *
- * Returns the monotonic time since boot in a ktime
- *
- * This is similar to CLOCK_MONTONIC/ktime_get, but also
- * includes the time spent in suspend.
- */
-ktime_t ktime_get_boottime(void)
-{
-       struct timespec ts;
-
-       get_monotonic_boottime(&ts);
-       return timespec_to_ktime(ts);
-}
-EXPORT_SYMBOL_GPL(ktime_get_boottime);
-
-/**
- * monotonic_to_bootbased - Convert the monotonic time to boot based.
- * @ts:                pointer to the timespec to be converted
- */
-void monotonic_to_bootbased(struct timespec *ts)
-{
-       struct timekeeper *tk = &tk_core.timekeeper;
-       struct timespec64 ts64;
+       ktime_t t = ktime_sub(tk->offs_real, tk->offs_boot);
 
-       ts64 = timespec_to_timespec64(*ts);
-       ts64 = timespec64_add(ts64, tk->total_sleep_time);
-       *ts = timespec64_to_timespec(ts64);
+       *ts = ktime_to_timespec(t);
 }
-EXPORT_SYMBOL_GPL(monotonic_to_bootbased);
+EXPORT_SYMBOL_GPL(getboottime);
 
 unsigned long get_seconds(void)
 {
@@ -1656,22 +1602,22 @@ ktime_t ktime_get_update_offsets_tick(ktime_t *offs_real, ktime_t *offs_boot,
                                                        ktime_t *offs_tai)
 {
        struct timekeeper *tk = &tk_core.timekeeper;
-       struct timespec64 ts;
-       ktime_t now;
        unsigned int seq;
+       ktime_t base;
+       u64 nsecs;
 
        do {
                seq = read_seqcount_begin(&tk_core.seq);
 
-               ts = tk_xtime(tk);
+               base = tk->base_mono;
+               nsecs = tk->xtime_nsec >> tk->shift;
+
                *offs_real = tk->offs_real;
                *offs_boot = tk->offs_boot;
                *offs_tai = tk->offs_tai;
        } while (read_seqcount_retry(&tk_core.seq, seq));
 
-       now = ktime_set(ts.tv_sec, ts.tv_nsec);
-       now = ktime_sub(now, *offs_real);
-       return now;
+       return ktime_add_ns(base, nsecs);
 }
 
 #ifdef CONFIG_HIGH_RES_TIMERS
@@ -1688,14 +1634,14 @@ ktime_t ktime_get_update_offsets_now(ktime_t *offs_real, ktime_t *offs_boot,
                                                        ktime_t *offs_tai)
 {
        struct timekeeper *tk = &tk_core.timekeeper;
-       ktime_t now;
        unsigned int seq;
-       u64 secs, nsecs;
+       ktime_t base;
+       u64 nsecs;
 
        do {
                seq = read_seqcount_begin(&tk_core.seq);
 
-               secs = tk->xtime_sec;
+               base = tk->base_mono;
                nsecs = timekeeping_get_ns(tk);
 
                *offs_real = tk->offs_real;
@@ -1703,30 +1649,10 @@ ktime_t ktime_get_update_offsets_now(ktime_t *offs_real, ktime_t *offs_boot,
                *offs_tai = tk->offs_tai;
        } while (read_seqcount_retry(&tk_core.seq, seq));
 
-       now = ktime_add_ns(ktime_set(secs, 0), nsecs);
-       now = ktime_sub(now, *offs_real);
-       return now;
+       return ktime_add_ns(base, nsecs);
 }
 #endif
 
-/**
- * ktime_get_monotonic_offset() - get wall_to_monotonic in ktime_t format
- */
-ktime_t ktime_get_monotonic_offset(void)
-{
-       struct timekeeper *tk = &tk_core.timekeeper;
-       unsigned long seq;
-       struct timespec64 wtom;
-
-       do {
-               seq = read_seqcount_begin(&tk_core.seq);
-               wtom = tk->wall_to_monotonic;
-       } while (read_seqcount_retry(&tk_core.seq, seq));
-
-       return timespec64_to_ktime(wtom);
-}
-EXPORT_SYMBOL_GPL(ktime_get_monotonic_offset);
-
 /**
  * do_adjtimex() - Accessor function to NTP __do_adjtimex function
  */