Commit a86d6df8 authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab

media: rc: set timeout to smallest value required by enabled protocols

The longer the IR timeout, the longer the rc device waits until delivering
the trailing space. So, by reducing this timeout, we reduce the delay for
the last scancode to be delivered.

Note that the lirc daemon disables all protocols, in which case we revert
back to the default value.
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent ed8c34d7
...@@ -170,6 +170,7 @@ static struct ir_raw_handler imon_handler = { ...@@ -170,6 +170,7 @@ static struct ir_raw_handler imon_handler = {
.decode = ir_imon_decode, .decode = ir_imon_decode,
.encode = ir_imon_encode, .encode = ir_imon_encode,
.carrier = 38000, .carrier = 38000,
.min_timeout = IMON_UNIT * IMON_BITS * 2,
}; };
static int __init ir_imon_decode_init(void) static int __init ir_imon_decode_init(void)
......
...@@ -213,6 +213,7 @@ static struct ir_raw_handler jvc_handler = { ...@@ -213,6 +213,7 @@ static struct ir_raw_handler jvc_handler = {
.decode = ir_jvc_decode, .decode = ir_jvc_decode,
.encode = ir_jvc_encode, .encode = ir_jvc_encode,
.carrier = 38000, .carrier = 38000,
.min_timeout = JVC_TRAILER_SPACE,
}; };
static int __init ir_jvc_decode_init(void) static int __init ir_jvc_decode_init(void)
......
...@@ -475,6 +475,7 @@ static struct ir_raw_handler mce_kbd_handler = { ...@@ -475,6 +475,7 @@ static struct ir_raw_handler mce_kbd_handler = {
.raw_register = ir_mce_kbd_register, .raw_register = ir_mce_kbd_register,
.raw_unregister = ir_mce_kbd_unregister, .raw_unregister = ir_mce_kbd_unregister,
.carrier = 36000, .carrier = 36000,
.min_timeout = MCIR2_MAX_LEN + MCIR2_UNIT / 2,
}; };
static int __init ir_mce_kbd_decode_init(void) static int __init ir_mce_kbd_decode_init(void)
......
...@@ -253,6 +253,7 @@ static struct ir_raw_handler nec_handler = { ...@@ -253,6 +253,7 @@ static struct ir_raw_handler nec_handler = {
.decode = ir_nec_decode, .decode = ir_nec_decode,
.encode = ir_nec_encode, .encode = ir_nec_encode,
.carrier = 38000, .carrier = 38000,
.min_timeout = NEC_TRAILER_SPACE,
}; };
static int __init ir_nec_decode_init(void) static int __init ir_nec_decode_init(void)
......
...@@ -274,6 +274,7 @@ static struct ir_raw_handler rc5_handler = { ...@@ -274,6 +274,7 @@ static struct ir_raw_handler rc5_handler = {
.decode = ir_rc5_decode, .decode = ir_rc5_decode,
.encode = ir_rc5_encode, .encode = ir_rc5_encode,
.carrier = 36000, .carrier = 36000,
.min_timeout = RC5_TRAILER,
}; };
static int __init ir_rc5_decode_init(void) static int __init ir_rc5_decode_init(void)
......
...@@ -394,6 +394,7 @@ static struct ir_raw_handler rc6_handler = { ...@@ -394,6 +394,7 @@ static struct ir_raw_handler rc6_handler = {
.decode = ir_rc6_decode, .decode = ir_rc6_decode,
.encode = ir_rc6_encode, .encode = ir_rc6_encode,
.carrier = 36000, .carrier = 36000,
.min_timeout = RC6_SUFFIX_SPACE,
}; };
static int __init ir_rc6_decode_init(void) static int __init ir_rc6_decode_init(void)
......
...@@ -210,6 +210,7 @@ static struct ir_raw_handler sanyo_handler = { ...@@ -210,6 +210,7 @@ static struct ir_raw_handler sanyo_handler = {
.decode = ir_sanyo_decode, .decode = ir_sanyo_decode,
.encode = ir_sanyo_encode, .encode = ir_sanyo_encode,
.carrier = 38000, .carrier = 38000,
.min_timeout = SANYO_TRAILER_SPACE,
}; };
static int __init ir_sanyo_decode_init(void) static int __init ir_sanyo_decode_init(void)
......
...@@ -226,6 +226,7 @@ static struct ir_raw_handler sharp_handler = { ...@@ -226,6 +226,7 @@ static struct ir_raw_handler sharp_handler = {
.decode = ir_sharp_decode, .decode = ir_sharp_decode,
.encode = ir_sharp_encode, .encode = ir_sharp_encode,
.carrier = 38000, .carrier = 38000,
.min_timeout = SHARP_ECHO_SPACE + SHARP_ECHO_SPACE / 4,
}; };
static int __init ir_sharp_decode_init(void) static int __init ir_sharp_decode_init(void)
......
...@@ -224,6 +224,7 @@ static struct ir_raw_handler sony_handler = { ...@@ -224,6 +224,7 @@ static struct ir_raw_handler sony_handler = {
.decode = ir_sony_decode, .decode = ir_sony_decode,
.encode = ir_sony_encode, .encode = ir_sony_encode,
.carrier = 40000, .carrier = 40000,
.min_timeout = SONY_TRAILER_SPACE,
}; };
static int __init ir_sony_decode_init(void) static int __init ir_sony_decode_init(void)
......
...@@ -199,6 +199,7 @@ static int ir_xmp_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -199,6 +199,7 @@ static int ir_xmp_decode(struct rc_dev *dev, struct ir_raw_event ev)
static struct ir_raw_handler xmp_handler = { static struct ir_raw_handler xmp_handler = {
.protocols = RC_PROTO_BIT_XMP, .protocols = RC_PROTO_BIT_XMP,
.decode = ir_xmp_decode, .decode = ir_xmp_decode,
.min_timeout = XMP_TRAILER_SPACE,
}; };
static int __init ir_xmp_decode_init(void) static int __init ir_xmp_decode_init(void)
......
...@@ -37,6 +37,7 @@ struct ir_raw_handler { ...@@ -37,6 +37,7 @@ struct ir_raw_handler {
int (*encode)(enum rc_proto protocol, u32 scancode, int (*encode)(enum rc_proto protocol, u32 scancode,
struct ir_raw_event *events, unsigned int max); struct ir_raw_event *events, unsigned int max);
u32 carrier; u32 carrier;
u32 min_timeout;
/* These two should only be used by the mce kbd decoder */ /* These two should only be used by the mce kbd decoder */
int (*raw_register)(struct rc_dev *dev); int (*raw_register)(struct rc_dev *dev);
......
...@@ -233,7 +233,36 @@ ir_raw_get_allowed_protocols(void) ...@@ -233,7 +233,36 @@ ir_raw_get_allowed_protocols(void)
static int change_protocol(struct rc_dev *dev, u64 *rc_proto) static int change_protocol(struct rc_dev *dev, u64 *rc_proto)
{ {
/* the caller will update dev->enabled_protocols */ struct ir_raw_handler *handler;
u32 timeout = 0;
if (!dev->max_timeout)
return 0;
mutex_lock(&ir_raw_handler_lock);
list_for_each_entry(handler, &ir_raw_handler_list, list) {
if (handler->protocols & *rc_proto) {
if (timeout < handler->min_timeout)
timeout = handler->min_timeout;
}
}
mutex_unlock(&ir_raw_handler_lock);
if (timeout == 0)
timeout = IR_DEFAULT_TIMEOUT;
else
timeout += MS_TO_NS(10);
if (timeout < dev->min_timeout)
timeout = dev->min_timeout;
else if (timeout > dev->max_timeout)
timeout = dev->max_timeout;
if (dev->s_timeout)
dev->s_timeout(dev, timeout);
else
dev->timeout = timeout;
return 0; return 0;
} }
......
...@@ -1241,6 +1241,9 @@ static ssize_t store_protocols(struct device *device, ...@@ -1241,6 +1241,9 @@ static ssize_t store_protocols(struct device *device,
if (rc < 0) if (rc < 0)
goto out; goto out;
if (dev->driver_type == RC_DRIVER_IR_RAW)
ir_raw_load_modules(&new_protocols);
rc = dev->change_protocol(dev, &new_protocols); rc = dev->change_protocol(dev, &new_protocols);
if (rc < 0) { if (rc < 0) {
dev_dbg(&dev->dev, "Error setting protocols to 0x%llx\n", dev_dbg(&dev->dev, "Error setting protocols to 0x%llx\n",
...@@ -1248,9 +1251,6 @@ static ssize_t store_protocols(struct device *device, ...@@ -1248,9 +1251,6 @@ static ssize_t store_protocols(struct device *device,
goto out; goto out;
} }
if (dev->driver_type == RC_DRIVER_IR_RAW)
ir_raw_load_modules(&new_protocols);
if (new_protocols != old_protocols) { if (new_protocols != old_protocols) {
*current_protocols = new_protocols; *current_protocols = new_protocols;
dev_dbg(&dev->dev, "Protocols changed to 0x%llx\n", dev_dbg(&dev->dev, "Protocols changed to 0x%llx\n",
...@@ -1735,6 +1735,9 @@ static int rc_prepare_rx_device(struct rc_dev *dev) ...@@ -1735,6 +1735,9 @@ static int rc_prepare_rx_device(struct rc_dev *dev)
if (dev->driver_type == RC_DRIVER_SCANCODE && !dev->change_protocol) if (dev->driver_type == RC_DRIVER_SCANCODE && !dev->change_protocol)
dev->enabled_protocols = dev->allowed_protocols; dev->enabled_protocols = dev->allowed_protocols;
if (dev->driver_type == RC_DRIVER_IR_RAW)
ir_raw_load_modules(&rc_proto);
if (dev->change_protocol) { if (dev->change_protocol) {
rc = dev->change_protocol(dev, &rc_proto); rc = dev->change_protocol(dev, &rc_proto);
if (rc < 0) if (rc < 0)
...@@ -1742,9 +1745,6 @@ static int rc_prepare_rx_device(struct rc_dev *dev) ...@@ -1742,9 +1745,6 @@ static int rc_prepare_rx_device(struct rc_dev *dev)
dev->enabled_protocols = rc_proto; dev->enabled_protocols = rc_proto;
} }
if (dev->driver_type == RC_DRIVER_IR_RAW)
ir_raw_load_modules(&rc_proto);
set_bit(EV_KEY, dev->input_dev->evbit); set_bit(EV_KEY, dev->input_dev->evbit);
set_bit(EV_REP, dev->input_dev->evbit); set_bit(EV_REP, dev->input_dev->evbit);
set_bit(EV_MSC, dev->input_dev->evbit); set_bit(EV_MSC, dev->input_dev->evbit);
......
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