diff options
author | Ksenija Stanojevic <ksenija.stanojevic@gmail.com> | 2015-10-07 22:06:55 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-10-08 10:50:27 +0100 |
commit | 367e8560e8d7a62d96e9b1d644028a3816e04206 (patch) | |
tree | dfa5ef5fb8e96a8001b2ae263a9da0152da7f3ce | |
parent | f60c265159e832ae389f3ab1acf9343d9e86a19a (diff) | |
download | linux-367e8560e8d7a62d96e9b1d644028a3816e04206.tar.bz2 |
Staging: fbtbt: Replace timespec with ktime_t
struct timespec will overflow in year 2038, so replace it with
ktime_t. And replace functions that use struct timespec,
timespec_sub with ktime_sub. Also use monotonic time instead of real
time, by replacing getnstimeofday with ktime_get, to be more robust
against leap seconds and settimeofday() calls.
Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/fbtft/fbtft-core.c | 32 | ||||
-rw-r--r-- | drivers/staging/fbtft/fbtft.h | 2 |
2 files changed, 12 insertions, 22 deletions
diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c index bfbf15c31d0f..deccb1d99251 100644 --- a/drivers/staging/fbtft/fbtft-core.c +++ b/drivers/staging/fbtft/fbtft-core.c @@ -346,8 +346,7 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned start_line, unsigned end_line) { size_t offset, len; - struct timespec ts_start, ts_end, ts_fps, ts_duration; - long fps_ms, fps_us, duration_ms, duration_us; + ktime_t ts_start, ts_end; long fps, throughput; bool timeit = false; int ret = 0; @@ -355,7 +354,7 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned start_line, if (unlikely(par->debug & (DEBUG_TIME_FIRST_UPDATE | DEBUG_TIME_EACH_UPDATE))) { if ((par->debug & DEBUG_TIME_EACH_UPDATE) || ((par->debug & DEBUG_TIME_FIRST_UPDATE) && !par->first_update_done)) { - getnstimeofday(&ts_start); + ts_start = ktime_get(); timeit = true; } } @@ -392,30 +391,21 @@ static void fbtft_update_display(struct fbtft_par *par, unsigned start_line, __func__); if (unlikely(timeit)) { - getnstimeofday(&ts_end); - if (par->update_time.tv_nsec == 0 && par->update_time.tv_sec == 0) { - par->update_time.tv_sec = ts_start.tv_sec; - par->update_time.tv_nsec = ts_start.tv_nsec; - } - ts_fps = timespec_sub(ts_start, par->update_time); - par->update_time.tv_sec = ts_start.tv_sec; - par->update_time.tv_nsec = ts_start.tv_nsec; - fps_ms = (ts_fps.tv_sec * 1000) + ((ts_fps.tv_nsec / 1000000) % 1000); - fps_us = (ts_fps.tv_nsec / 1000) % 1000; - fps = fps_ms * 1000 + fps_us; + ts_end = ktime_get(); + if (ktime_to_ns(par->update_time)) + par->update_time = ts_start; + + par->update_time = ts_start; + fps = ktime_us_delta(ts_start, par->update_time); fps = fps ? 1000000 / fps : 0; - ts_duration = timespec_sub(ts_end, ts_start); - duration_ms = (ts_duration.tv_sec * 1000) + ((ts_duration.tv_nsec / 1000000) % 1000); - duration_us = (ts_duration.tv_nsec / 1000) % 1000; - throughput = duration_ms * 1000 + duration_us; + throughput = ktime_us_delta(ts_end, ts_start); throughput = throughput ? (len * 1000) / throughput : 0; throughput = throughput * 1000 / 1024; dev_info(par->info->device, - "Display update: %ld kB/s (%ld.%.3ld ms), fps=%ld (%ld.%.3ld ms)\n", - throughput, duration_ms, duration_us, - fps, fps_ms, fps_us); + "Display update: %ld kB/s, fps=%ld\n", + throughput, fps); par->first_update_done = true; } } diff --git a/drivers/staging/fbtft/fbtft.h b/drivers/staging/fbtft/fbtft.h index 6dd42b28d594..20e69f0b5cb0 100644 --- a/drivers/staging/fbtft/fbtft.h +++ b/drivers/staging/fbtft/fbtft.h @@ -246,7 +246,7 @@ struct fbtft_par { } gamma; unsigned long debug; bool first_update_done; - struct timespec update_time; + ktime_t update_time; bool bgr; void *extra; }; |