mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 08:46:46 +00:00
media: rc: per-protocol repeat period and minimum keyup timer
Each IR protocol has its own repeat period. We can minimise the keyup
timer to be the protocol period + IR timeout. This makes keys less
"sticky" and makes IR more reactive and nicer to use.
This feature was previously attempted in commit d57ea877af
("media: rc:
per-protocol repeat period"), but that did not take the IR timeout into
account, and had to be reverted.
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
95d1544eb6
commit
284922562b
3 changed files with 31 additions and 29 deletions
|
@ -322,7 +322,7 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
|
||||||
adap->rc->allowed_protocols = RC_PROTO_BIT_CEC;
|
adap->rc->allowed_protocols = RC_PROTO_BIT_CEC;
|
||||||
adap->rc->priv = adap;
|
adap->rc->priv = adap;
|
||||||
adap->rc->map_name = RC_MAP_CEC;
|
adap->rc->map_name = RC_MAP_CEC;
|
||||||
adap->rc->timeout = MS_TO_NS(100);
|
adap->rc->timeout = MS_TO_NS(550);
|
||||||
#endif
|
#endif
|
||||||
return adap;
|
return adap;
|
||||||
}
|
}
|
||||||
|
|
|
@ -583,7 +583,7 @@ static long ir_lirc_ioctl(struct file *file, unsigned int cmd,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LIRC_SET_REC_TIMEOUT_REPORTS:
|
case LIRC_SET_REC_TIMEOUT_REPORTS:
|
||||||
if (!dev->timeout)
|
if (dev->driver_type != RC_DRIVER_IR_RAW)
|
||||||
ret = -ENOTTY;
|
ret = -ENOTTY;
|
||||||
else
|
else
|
||||||
fh->send_timeout_reports = !!val;
|
fh->send_timeout_reports = !!val;
|
||||||
|
|
|
@ -26,50 +26,50 @@ static const struct {
|
||||||
unsigned int repeat_period;
|
unsigned int repeat_period;
|
||||||
unsigned int scancode_bits;
|
unsigned int scancode_bits;
|
||||||
} protocols[] = {
|
} protocols[] = {
|
||||||
[RC_PROTO_UNKNOWN] = { .name = "unknown", .repeat_period = 250 },
|
[RC_PROTO_UNKNOWN] = { .name = "unknown", .repeat_period = 125 },
|
||||||
[RC_PROTO_OTHER] = { .name = "other", .repeat_period = 250 },
|
[RC_PROTO_OTHER] = { .name = "other", .repeat_period = 125 },
|
||||||
[RC_PROTO_RC5] = { .name = "rc-5",
|
[RC_PROTO_RC5] = { .name = "rc-5",
|
||||||
.scancode_bits = 0x1f7f, .repeat_period = 250 },
|
.scancode_bits = 0x1f7f, .repeat_period = 114 },
|
||||||
[RC_PROTO_RC5X_20] = { .name = "rc-5x-20",
|
[RC_PROTO_RC5X_20] = { .name = "rc-5x-20",
|
||||||
.scancode_bits = 0x1f7f3f, .repeat_period = 250 },
|
.scancode_bits = 0x1f7f3f, .repeat_period = 114 },
|
||||||
[RC_PROTO_RC5_SZ] = { .name = "rc-5-sz",
|
[RC_PROTO_RC5_SZ] = { .name = "rc-5-sz",
|
||||||
.scancode_bits = 0x2fff, .repeat_period = 250 },
|
.scancode_bits = 0x2fff, .repeat_period = 114 },
|
||||||
[RC_PROTO_JVC] = { .name = "jvc",
|
[RC_PROTO_JVC] = { .name = "jvc",
|
||||||
.scancode_bits = 0xffff, .repeat_period = 250 },
|
.scancode_bits = 0xffff, .repeat_period = 125 },
|
||||||
[RC_PROTO_SONY12] = { .name = "sony-12",
|
[RC_PROTO_SONY12] = { .name = "sony-12",
|
||||||
.scancode_bits = 0x1f007f, .repeat_period = 250 },
|
.scancode_bits = 0x1f007f, .repeat_period = 100 },
|
||||||
[RC_PROTO_SONY15] = { .name = "sony-15",
|
[RC_PROTO_SONY15] = { .name = "sony-15",
|
||||||
.scancode_bits = 0xff007f, .repeat_period = 250 },
|
.scancode_bits = 0xff007f, .repeat_period = 100 },
|
||||||
[RC_PROTO_SONY20] = { .name = "sony-20",
|
[RC_PROTO_SONY20] = { .name = "sony-20",
|
||||||
.scancode_bits = 0x1fff7f, .repeat_period = 250 },
|
.scancode_bits = 0x1fff7f, .repeat_period = 100 },
|
||||||
[RC_PROTO_NEC] = { .name = "nec",
|
[RC_PROTO_NEC] = { .name = "nec",
|
||||||
.scancode_bits = 0xffff, .repeat_period = 250 },
|
.scancode_bits = 0xffff, .repeat_period = 110 },
|
||||||
[RC_PROTO_NECX] = { .name = "nec-x",
|
[RC_PROTO_NECX] = { .name = "nec-x",
|
||||||
.scancode_bits = 0xffffff, .repeat_period = 250 },
|
.scancode_bits = 0xffffff, .repeat_period = 110 },
|
||||||
[RC_PROTO_NEC32] = { .name = "nec-32",
|
[RC_PROTO_NEC32] = { .name = "nec-32",
|
||||||
.scancode_bits = 0xffffffff, .repeat_period = 250 },
|
.scancode_bits = 0xffffffff, .repeat_period = 110 },
|
||||||
[RC_PROTO_SANYO] = { .name = "sanyo",
|
[RC_PROTO_SANYO] = { .name = "sanyo",
|
||||||
.scancode_bits = 0x1fffff, .repeat_period = 250 },
|
.scancode_bits = 0x1fffff, .repeat_period = 125 },
|
||||||
[RC_PROTO_MCIR2_KBD] = { .name = "mcir2-kbd",
|
[RC_PROTO_MCIR2_KBD] = { .name = "mcir2-kbd",
|
||||||
.scancode_bits = 0xffff, .repeat_period = 250 },
|
.scancode_bits = 0xffff, .repeat_period = 100 },
|
||||||
[RC_PROTO_MCIR2_MSE] = { .name = "mcir2-mse",
|
[RC_PROTO_MCIR2_MSE] = { .name = "mcir2-mse",
|
||||||
.scancode_bits = 0x1fffff, .repeat_period = 250 },
|
.scancode_bits = 0x1fffff, .repeat_period = 100 },
|
||||||
[RC_PROTO_RC6_0] = { .name = "rc-6-0",
|
[RC_PROTO_RC6_0] = { .name = "rc-6-0",
|
||||||
.scancode_bits = 0xffff, .repeat_period = 250 },
|
.scancode_bits = 0xffff, .repeat_period = 114 },
|
||||||
[RC_PROTO_RC6_6A_20] = { .name = "rc-6-6a-20",
|
[RC_PROTO_RC6_6A_20] = { .name = "rc-6-6a-20",
|
||||||
.scancode_bits = 0xfffff, .repeat_period = 250 },
|
.scancode_bits = 0xfffff, .repeat_period = 114 },
|
||||||
[RC_PROTO_RC6_6A_24] = { .name = "rc-6-6a-24",
|
[RC_PROTO_RC6_6A_24] = { .name = "rc-6-6a-24",
|
||||||
.scancode_bits = 0xffffff, .repeat_period = 250 },
|
.scancode_bits = 0xffffff, .repeat_period = 114 },
|
||||||
[RC_PROTO_RC6_6A_32] = { .name = "rc-6-6a-32",
|
[RC_PROTO_RC6_6A_32] = { .name = "rc-6-6a-32",
|
||||||
.scancode_bits = 0xffffffff, .repeat_period = 250 },
|
.scancode_bits = 0xffffffff, .repeat_period = 114 },
|
||||||
[RC_PROTO_RC6_MCE] = { .name = "rc-6-mce",
|
[RC_PROTO_RC6_MCE] = { .name = "rc-6-mce",
|
||||||
.scancode_bits = 0xffff7fff, .repeat_period = 250 },
|
.scancode_bits = 0xffff7fff, .repeat_period = 114 },
|
||||||
[RC_PROTO_SHARP] = { .name = "sharp",
|
[RC_PROTO_SHARP] = { .name = "sharp",
|
||||||
.scancode_bits = 0x1fff, .repeat_period = 250 },
|
.scancode_bits = 0x1fff, .repeat_period = 125 },
|
||||||
[RC_PROTO_XMP] = { .name = "xmp", .repeat_period = 250 },
|
[RC_PROTO_XMP] = { .name = "xmp", .repeat_period = 125 },
|
||||||
[RC_PROTO_CEC] = { .name = "cec", .repeat_period = 550 },
|
[RC_PROTO_CEC] = { .name = "cec", .repeat_period = 0 },
|
||||||
[RC_PROTO_IMON] = { .name = "imon",
|
[RC_PROTO_IMON] = { .name = "imon",
|
||||||
.scancode_bits = 0x7fffffff, .repeat_period = 250 },
|
.scancode_bits = 0x7fffffff, .repeat_period = 114 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Used to keep track of known keymaps */
|
/* Used to keep track of known keymaps */
|
||||||
|
@ -690,7 +690,8 @@ static void ir_timer_repeat(struct timer_list *t)
|
||||||
void rc_repeat(struct rc_dev *dev)
|
void rc_repeat(struct rc_dev *dev)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int timeout = protocols[dev->last_protocol].repeat_period;
|
unsigned int timeout = nsecs_to_jiffies(dev->timeout) +
|
||||||
|
msecs_to_jiffies(protocols[dev->last_protocol].repeat_period);
|
||||||
struct lirc_scancode sc = {
|
struct lirc_scancode sc = {
|
||||||
.scancode = dev->last_scancode, .rc_proto = dev->last_protocol,
|
.scancode = dev->last_scancode, .rc_proto = dev->last_protocol,
|
||||||
.keycode = dev->keypressed ? dev->last_keycode : KEY_RESERVED,
|
.keycode = dev->keypressed ? dev->last_keycode : KEY_RESERVED,
|
||||||
|
@ -706,7 +707,7 @@ void rc_repeat(struct rc_dev *dev)
|
||||||
input_sync(dev->input_dev);
|
input_sync(dev->input_dev);
|
||||||
|
|
||||||
if (dev->keypressed) {
|
if (dev->keypressed) {
|
||||||
dev->keyup_jiffies = jiffies + msecs_to_jiffies(timeout);
|
dev->keyup_jiffies = jiffies + timeout;
|
||||||
mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
|
mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -801,7 +802,7 @@ void rc_keydown(struct rc_dev *dev, enum rc_proto protocol, u32 scancode,
|
||||||
ir_do_keydown(dev, protocol, scancode, keycode, toggle);
|
ir_do_keydown(dev, protocol, scancode, keycode, toggle);
|
||||||
|
|
||||||
if (dev->keypressed) {
|
if (dev->keypressed) {
|
||||||
dev->keyup_jiffies = jiffies +
|
dev->keyup_jiffies = jiffies + nsecs_to_jiffies(dev->timeout) +
|
||||||
msecs_to_jiffies(protocols[protocol].repeat_period);
|
msecs_to_jiffies(protocols[protocol].repeat_period);
|
||||||
mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
|
mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
|
||||||
}
|
}
|
||||||
|
@ -1647,6 +1648,7 @@ struct rc_dev *rc_allocate_device(enum rc_driver_type type)
|
||||||
dev->input_dev->setkeycode = ir_setkeycode;
|
dev->input_dev->setkeycode = ir_setkeycode;
|
||||||
input_set_drvdata(dev->input_dev, dev);
|
input_set_drvdata(dev->input_dev, dev);
|
||||||
|
|
||||||
|
dev->timeout = IR_DEFAULT_TIMEOUT;
|
||||||
timer_setup(&dev->timer_keyup, ir_timer_keyup, 0);
|
timer_setup(&dev->timer_keyup, ir_timer_keyup, 0);
|
||||||
timer_setup(&dev->timer_repeat, ir_timer_repeat, 0);
|
timer_setup(&dev->timer_repeat, ir_timer_repeat, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue