media: mceusb: MCE_CMD_SETIRTIMEOUT cause strange behaviour on device
authorSean Young <sean@mess.org>
Wed, 9 May 2018 10:11:28 +0000 (06:11 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 14 May 2018 11:11:37 +0000 (07:11 -0400)
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>
drivers/media/rc/mceusb.c

index 5c0bf61fae268a8131b332f687ce2756677ead78..1619b748469b8c1e967a5f33c89b61433a3e1ab0 100644 (file)
@@ -181,6 +181,7 @@ enum mceusb_model_type {
        MCE_GEN2 = 0,           /* Most boards */
        MCE_GEN1,
        MCE_GEN3,
+       MCE_GEN3_BROKEN_IRTIMEOUT,
        MCE_GEN2_TX_INV,
        MCE_GEN2_TX_INV_RX_GOOD,
        POLARIS_EVK,
@@ -199,6 +200,7 @@ struct mceusb_model {
        u32 mce_gen3:1;
        u32 tx_mask_normal:1;
        u32 no_tx:1;
+       u32 broken_irtimeout:1;
        /*
         * 2nd IR receiver (short-range, wideband) for learning mode:
         *     0, absent 2nd receiver (rx2)
@@ -242,6 +244,12 @@ static const struct mceusb_model mceusb_model[] = {
                .tx_mask_normal = 1,
                .rx2 = 2,
        },
+       [MCE_GEN3_BROKEN_IRTIMEOUT] = {
+               .mce_gen3 = 1,
+               .tx_mask_normal = 1,
+               .rx2 = 2,
+               .broken_irtimeout = 1
+       },
        [POLARIS_EVK] = {
                /*
                 * 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 },
        /* Topseed eHome Infrared Transceiver */
        { USB_DEVICE(VENDOR_TOPSEED, 0x0011),
-         .driver_info = MCE_GEN3 },
+         .driver_info = MCE_GEN3_BROKEN_IRTIMEOUT },
        /* Ricavision internal Infrared Transceiver */
        { USB_DEVICE(VENDOR_RICAVISION, 0x0010) },
        /* 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->min_timeout = US_TO_NS(MCE_TIME_UNIT);
        rc->timeout = MS_TO_NS(100);
-       rc->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
-       rc->s_timeout = mceusb_set_timeout;
+       if (!mceusb_model[ir->model].broken_irtimeout) {
+               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) {
                rc->s_tx_mask = mceusb_set_tx_mask;
                rc->s_tx_carrier = mceusb_set_tx_carrier;