media: mceusb: MCE_CMD_SETIRTIMEOUT cause strange behaviour on device
If the IR timeout is set on vid 1784 pid 0011, the device starts behaving strangely. Reported-by: Matthias Reichl <hias@horus.com> Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
09c2cc98cd
commit
aec3eadfb6
|
@ -181,6 +181,7 @@ enum mceusb_model_type {
|
||||||
MCE_GEN2 = 0, /* Most boards */
|
MCE_GEN2 = 0, /* Most boards */
|
||||||
MCE_GEN1,
|
MCE_GEN1,
|
||||||
MCE_GEN3,
|
MCE_GEN3,
|
||||||
|
MCE_GEN3_BROKEN_IRTIMEOUT,
|
||||||
MCE_GEN2_TX_INV,
|
MCE_GEN2_TX_INV,
|
||||||
MCE_GEN2_TX_INV_RX_GOOD,
|
MCE_GEN2_TX_INV_RX_GOOD,
|
||||||
POLARIS_EVK,
|
POLARIS_EVK,
|
||||||
|
@ -199,6 +200,7 @@ struct mceusb_model {
|
||||||
u32 mce_gen3:1;
|
u32 mce_gen3:1;
|
||||||
u32 tx_mask_normal:1;
|
u32 tx_mask_normal:1;
|
||||||
u32 no_tx:1;
|
u32 no_tx:1;
|
||||||
|
u32 broken_irtimeout:1;
|
||||||
/*
|
/*
|
||||||
* 2nd IR receiver (short-range, wideband) for learning mode:
|
* 2nd IR receiver (short-range, wideband) for learning mode:
|
||||||
* 0, absent 2nd receiver (rx2)
|
* 0, absent 2nd receiver (rx2)
|
||||||
|
@ -242,6 +244,12 @@ static const struct mceusb_model mceusb_model[] = {
|
||||||
.tx_mask_normal = 1,
|
.tx_mask_normal = 1,
|
||||||
.rx2 = 2,
|
.rx2 = 2,
|
||||||
},
|
},
|
||||||
|
[MCE_GEN3_BROKEN_IRTIMEOUT] = {
|
||||||
|
.mce_gen3 = 1,
|
||||||
|
.tx_mask_normal = 1,
|
||||||
|
.rx2 = 2,
|
||||||
|
.broken_irtimeout = 1
|
||||||
|
},
|
||||||
[POLARIS_EVK] = {
|
[POLARIS_EVK] = {
|
||||||
/*
|
/*
|
||||||
* In fact, the EVK is shipped without
|
* In fact, the EVK is shipped without
|
||||||
|
@ -352,7 +360,7 @@ static const struct usb_device_id mceusb_dev_table[] = {
|
||||||
.driver_info = MCE_GEN2_TX_INV },
|
.driver_info = MCE_GEN2_TX_INV },
|
||||||
/* Topseed eHome Infrared Transceiver */
|
/* Topseed eHome Infrared Transceiver */
|
||||||
{ USB_DEVICE(VENDOR_TOPSEED, 0x0011),
|
{ USB_DEVICE(VENDOR_TOPSEED, 0x0011),
|
||||||
.driver_info = MCE_GEN3 },
|
.driver_info = MCE_GEN3_BROKEN_IRTIMEOUT },
|
||||||
/* Ricavision internal Infrared Transceiver */
|
/* Ricavision internal Infrared Transceiver */
|
||||||
{ USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
|
{ USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
|
||||||
/* Itron ione Libra Q-11 */
|
/* Itron ione Libra Q-11 */
|
||||||
|
@ -1441,8 +1449,16 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
|
||||||
rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
|
rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
|
||||||
rc->min_timeout = US_TO_NS(MCE_TIME_UNIT);
|
rc->min_timeout = US_TO_NS(MCE_TIME_UNIT);
|
||||||
rc->timeout = MS_TO_NS(100);
|
rc->timeout = MS_TO_NS(100);
|
||||||
rc->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
|
if (!mceusb_model[ir->model].broken_irtimeout) {
|
||||||
rc->s_timeout = mceusb_set_timeout;
|
rc->s_timeout = mceusb_set_timeout;
|
||||||
|
rc->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* If we can't set the timeout using CMD_SETIRTIMEOUT, we can
|
||||||
|
* rely on software timeouts for timeouts < 100ms.
|
||||||
|
*/
|
||||||
|
rc->max_timeout = rc->timeout;
|
||||||
|
}
|
||||||
if (!ir->flags.no_tx) {
|
if (!ir->flags.no_tx) {
|
||||||
rc->s_tx_mask = mceusb_set_tx_mask;
|
rc->s_tx_mask = mceusb_set_tx_mask;
|
||||||
rc->s_tx_carrier = mceusb_set_tx_carrier;
|
rc->s_tx_carrier = mceusb_set_tx_carrier;
|
||||||
|
|
Loading…
Reference in New Issue