Commit 82fde1a9 authored by Abhilash Jindal's avatar Abhilash Jindal Committed by Mauro Carvalho Chehab

[media] bt8xxx: Use monotonic time

Wall time obtained from do_gettimeofday is susceptible to sudden jumps due to
user setting the time or due to NTP.

Monotonic time is constantly increasing time better suited for comparing two
timestamps.
Signed-off-by: default avatarAbhilash Jindal <klock.android@gmail.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent e4d45dd8
...@@ -194,21 +194,18 @@ static u32 bttv_rc5_decode(unsigned int code) ...@@ -194,21 +194,18 @@ static u32 bttv_rc5_decode(unsigned int code)
static void bttv_rc5_timer_end(unsigned long data) static void bttv_rc5_timer_end(unsigned long data)
{ {
struct bttv_ir *ir = (struct bttv_ir *)data; struct bttv_ir *ir = (struct bttv_ir *)data;
struct timeval tv; ktime_t tv;
u32 gap, rc5, scancode; u32 gap, rc5, scancode;
u8 toggle, command, system; u8 toggle, command, system;
/* get time */ /* get time */
do_gettimeofday(&tv); tv = ktime_get();
gap = ktime_to_us(ktime_sub(tv, ir->base_time));
/* avoid overflow with gap >1s */ /* avoid overflow with gap >1s */
if (tv.tv_sec - ir->base_time.tv_sec > 1) { if (gap > USEC_PER_SEC) {
gap = 200000; gap = 200000;
} else {
gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
tv.tv_usec - ir->base_time.tv_usec;
} }
/* signal we're ready to start a new code */ /* signal we're ready to start a new code */
ir->active = false; ir->active = false;
...@@ -249,7 +246,7 @@ static void bttv_rc5_timer_end(unsigned long data) ...@@ -249,7 +246,7 @@ static void bttv_rc5_timer_end(unsigned long data)
static int bttv_rc5_irq(struct bttv *btv) static int bttv_rc5_irq(struct bttv *btv)
{ {
struct bttv_ir *ir = btv->remote; struct bttv_ir *ir = btv->remote;
struct timeval tv; ktime_t tv;
u32 gpio; u32 gpio;
u32 gap; u32 gap;
unsigned long current_jiffies; unsigned long current_jiffies;
...@@ -259,14 +256,12 @@ static int bttv_rc5_irq(struct bttv *btv) ...@@ -259,14 +256,12 @@ static int bttv_rc5_irq(struct bttv *btv)
/* get time of bit */ /* get time of bit */
current_jiffies = jiffies; current_jiffies = jiffies;
do_gettimeofday(&tv); tv = ktime_get();
gap = ktime_to_us(ktime_sub(tv, ir->base_time));
/* avoid overflow with gap >1s */ /* avoid overflow with gap >1s */
if (tv.tv_sec - ir->base_time.tv_sec > 1) { if (gap > USEC_PER_SEC) {
gap = 200000; gap = 200000;
} else {
gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
tv.tv_usec - ir->base_time.tv_usec;
} }
dprintk("RC5 IRQ: gap %d us for %s\n", dprintk("RC5 IRQ: gap %d us for %s\n",
......
...@@ -140,7 +140,7 @@ struct bttv_ir { ...@@ -140,7 +140,7 @@ struct bttv_ir {
bool rc5_gpio; /* Is RC5 legacy GPIO enabled? */ bool rc5_gpio; /* Is RC5 legacy GPIO enabled? */
u32 last_bit; /* last raw bit seen */ u32 last_bit; /* last raw bit seen */
u32 code; /* raw code under construction */ u32 code; /* raw code under construction */
struct timeval base_time; /* time of last seen code */ ktime_t base_time; /* time of last seen code */
bool active; /* building raw code */ bool active; /* building raw code */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment