diff options
author | John Stultz <john.stultz@linaro.org> | 2011-02-14 21:43:08 -0500 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2011-02-21 15:53:07 -0500 |
commit | 314ac37150011ebb398f522db528d2dbcc611189 (patch) | |
tree | 0731fced7713d3889bd783577673068a6bc93796 | |
parent | abb3a4ea2e0ea7114a4475745da2f32bd9ad5b73 (diff) |
time: Extend get_xtime_and_monotonic_offset() to also return sleep
Extend get_xtime_and_monotonic_offset to
get_xtime_and_monotonic_and_sleep_offset().
CC: Jamie Lokier <jamie@shareable.org>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Alexander Shishkin <virtuoso@slind.org>
CC: Arve Hjønnevåg <arve@android.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
-rw-r--r-- | include/linux/time.h | 3 | ||||
-rw-r--r-- | kernel/hrtimer.c | 9 | ||||
-rw-r--r-- | kernel/time/timekeeping.c | 8 |
3 files changed, 13 insertions, 7 deletions
diff --git a/include/linux/time.h b/include/linux/time.h index fa39150cb816..02d48fb30b41 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -124,7 +124,8 @@ unsigned long get_seconds(void); | |||
124 | struct timespec current_kernel_time(void); | 124 | struct timespec current_kernel_time(void); |
125 | struct timespec __current_kernel_time(void); /* does not take xtime_lock */ | 125 | struct timespec __current_kernel_time(void); /* does not take xtime_lock */ |
126 | struct timespec get_monotonic_coarse(void); | 126 | struct timespec get_monotonic_coarse(void); |
127 | void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom); | 127 | void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, |
128 | struct timespec *wtom, struct timespec *sleep); | ||
128 | 129 | ||
129 | #define CURRENT_TIME (current_kernel_time()) | 130 | #define CURRENT_TIME (current_kernel_time()) |
130 | #define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 }) | 131 | #define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 }) |
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index ca99e2454600..e8bf3ad99063 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -91,9 +91,9 @@ static inline int hrtimer_clockid_to_base(clockid_t clock_id) | |||
91 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | 91 | static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) |
92 | { | 92 | { |
93 | ktime_t xtim, tomono; | 93 | ktime_t xtim, tomono; |
94 | struct timespec xts, tom; | 94 | struct timespec xts, tom, slp; |
95 | 95 | ||
96 | get_xtime_and_monotonic_offset(&xts, &tom); | 96 | get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &slp); |
97 | 97 | ||
98 | xtim = timespec_to_ktime(xts); | 98 | xtim = timespec_to_ktime(xts); |
99 | tomono = timespec_to_ktime(tom); | 99 | tomono = timespec_to_ktime(tom); |
@@ -614,12 +614,13 @@ static int hrtimer_reprogram(struct hrtimer *timer, | |||
614 | static void retrigger_next_event(void *arg) | 614 | static void retrigger_next_event(void *arg) |
615 | { | 615 | { |
616 | struct hrtimer_cpu_base *base; | 616 | struct hrtimer_cpu_base *base; |
617 | struct timespec realtime_offset, wtm; | 617 | struct timespec realtime_offset, wtm, sleep; |
618 | 618 | ||
619 | if (!hrtimer_hres_active()) | 619 | if (!hrtimer_hres_active()) |
620 | return; | 620 | return; |
621 | 621 | ||
622 | get_xtime_and_monotonic_offset(&realtime_offset, &wtm); | 622 | get_xtime_and_monotonic_and_sleep_offset(&realtime_offset, &wtm, |
623 | &sleep); | ||
623 | set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); | 624 | set_normalized_timespec(&realtime_offset, -wtm.tv_sec, -wtm.tv_nsec); |
624 | 625 | ||
625 | base = &__get_cpu_var(hrtimer_bases); | 626 | base = &__get_cpu_var(hrtimer_bases); |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5fbd9aa7df95..3bd7e3d5c632 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -1040,11 +1040,14 @@ void do_timer(unsigned long ticks) | |||
1040 | } | 1040 | } |
1041 | 1041 | ||
1042 | /** | 1042 | /** |
1043 | * get_xtime_and_monotonic_offset() - get xtime and wall_to_monotonic | 1043 | * get_xtime_and_monotonic_and_sleep_offset() - get xtime, wall_to_monotonic, |
1044 | * and sleep offsets. | ||
1044 | * @xtim: pointer to timespec to be set with xtime | 1045 | * @xtim: pointer to timespec to be set with xtime |
1045 | * @wtom: pointer to timespec to be set with wall_to_monotonic | 1046 | * @wtom: pointer to timespec to be set with wall_to_monotonic |
1047 | * @sleep: pointer to timespec to be set with time in suspend | ||
1046 | */ | 1048 | */ |
1047 | void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom) | 1049 | void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, |
1050 | struct timespec *wtom, struct timespec *sleep) | ||
1048 | { | 1051 | { |
1049 | unsigned long seq; | 1052 | unsigned long seq; |
1050 | 1053 | ||
@@ -1052,6 +1055,7 @@ void get_xtime_and_monotonic_offset(struct timespec *xtim, struct timespec *wtom | |||
1052 | seq = read_seqbegin(&xtime_lock); | 1055 | seq = read_seqbegin(&xtime_lock); |
1053 | *xtim = xtime; | 1056 | *xtim = xtime; |
1054 | *wtom = wall_to_monotonic; | 1057 | *wtom = wall_to_monotonic; |
1058 | *sleep = total_sleep_time; | ||
1055 | } while (read_seqretry(&xtime_lock, seq)); | 1059 | } while (read_seqretry(&xtime_lock, seq)); |
1056 | } | 1060 | } |
1057 | 1061 | ||