]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: rc: nec decoder should not send both repeat and keycode
authorSean Young <sean@mess.org>
Sun, 1 Oct 2017 20:38:29 +0000 (16:38 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 11 Oct 2017 16:37:53 +0000 (12:37 -0400)
When receiving an nec repeat, rc_repeat() is called and then rc_keydown()
with the last decoded scancode. That last call is redundant.

Fixes: 265a2988d202 ("media: rc-core: consistent use of rc_repeat()")
Cc: <stable@vger.kernel.org> # v4.14
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/rc/ir-nec-decoder.c

index 817c18f2ddd1588a95640d2ebc39d87ef7c7aada..a95d09acc22a56a81f63260a8fecb7ecb216fe6c 100644 (file)
@@ -87,8 +87,6 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
                        data->state = STATE_BIT_PULSE;
                        return 0;
                } else if (eq_margin(ev.duration, NEC_REPEAT_SPACE, NEC_UNIT / 2)) {
-                       rc_repeat(dev);
-                       IR_dprintk(1, "Repeat last key\n");
                        data->state = STATE_TRAILER_PULSE;
                        return 0;
                }
@@ -151,19 +149,26 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
                if (!geq_margin(ev.duration, NEC_TRAILER_SPACE, NEC_UNIT / 2))
                        break;
 
-               address     = bitrev8((data->bits >> 24) & 0xff);
-               not_address = bitrev8((data->bits >> 16) & 0xff);
-               command     = bitrev8((data->bits >>  8) & 0xff);
-               not_command = bitrev8((data->bits >>  0) & 0xff);
+               if (data->count == NEC_NBITS) {
+                       address     = bitrev8((data->bits >> 24) & 0xff);
+                       not_address = bitrev8((data->bits >> 16) & 0xff);
+                       command     = bitrev8((data->bits >>  8) & 0xff);
+                       not_command = bitrev8((data->bits >>  0) & 0xff);
+
+                       scancode = ir_nec_bytes_to_scancode(address,
+                                                           not_address,
+                                                           command,
+                                                           not_command,
+                                                           &rc_proto);
 
-               scancode = ir_nec_bytes_to_scancode(address, not_address,
-                                                   command, not_command,
-                                                   &rc_proto);
+                       if (data->is_nec_x)
+                               data->necx_repeat = true;
 
-               if (data->is_nec_x)
-                       data->necx_repeat = true;
+                       rc_keydown(dev, rc_proto, scancode, 0);
+               } else {
+                       rc_repeat(dev);
+               }
 
-               rc_keydown(dev, rc_proto, scancode, 0);
                data->state = STATE_INACTIVE;
                return 0;
        }