diff options
author | Jarod Wilson <jarod@redhat.com> | 2010-04-30 16:06:12 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-19 12:58:27 -0300 |
commit | db190fc13af8e2e5e9d717c16b07342ea8bf9174 (patch) | |
tree | b74b37ffc6d8dad216674e4a8a13d900e90c4462 /drivers/media/IR | |
parent | 666a9ed8971657ea7dcf0bd9df17195db4dddf29 (diff) |
V4L/DVB: IR/imon: add proper auto-repeat support
Simplified from version 1, in that hacks heisted from ati_remote2.c
aren't actually necessary, the real fix for too many repeats was
from setting too long a timer release value (200ms) on repeats in
mce mode -- this patch drops the release timeout to 33ms, matching
the input subsystem default input_dev->rep[REP_PERIOD].
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/IR')
-rw-r--r-- | drivers/media/IR/imon.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/media/IR/imon.c b/drivers/media/IR/imon.c index f5fb08fba63..27743eb0916 100644 --- a/drivers/media/IR/imon.c +++ b/drivers/media/IR/imon.c @@ -146,7 +146,6 @@ struct imon_context { }; #define TOUCH_TIMEOUT (HZ/30) -#define MCE_TIMEOUT_MS 200 /* vfd character device file operations */ static const struct file_operations vfd_fops = { @@ -1392,6 +1391,8 @@ static int imon_parse_press_type(struct imon_context *ictx, unsigned char *buf, u8 ktype) { int press_type = 0; + int rep_delay = ictx->idev->rep[REP_DELAY]; + int rep_period = ictx->idev->rep[REP_PERIOD]; /* key release of 0x02XXXXXX key */ if (ictx->kc == KEY_RESERVED && buf[0] == 0x02 && buf[3] == 0x00) @@ -1416,12 +1417,12 @@ static int imon_parse_press_type(struct imon_context *ictx, ictx->mce_toggle_bit = buf[2]; press_type = 1; mod_timer(&ictx->itimer, - jiffies + msecs_to_jiffies(MCE_TIMEOUT_MS)); + jiffies + msecs_to_jiffies(rep_delay)); /* repeat */ } else { press_type = 2; mod_timer(&ictx->itimer, - jiffies + msecs_to_jiffies(MCE_TIMEOUT_MS)); + jiffies + msecs_to_jiffies(rep_period)); } /* incoherent or irrelevant data */ @@ -1539,7 +1540,7 @@ static void imon_incoming_packet(struct imon_context *ictx, do_gettimeofday(&t); msec = tv2int(&t, &prev_time); prev_time = t; - if (msec < 200) + if (msec < idev->rep[REP_DELAY]) return; } @@ -1684,7 +1685,7 @@ static struct input_dev *imon_init_idev(struct imon_context *ictx) strlcat(ictx->phys_idev, "/input0", sizeof(ictx->phys_idev)); idev->phys = ictx->phys_idev; - idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | BIT_MASK(EV_REL); idev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); |