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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Nov 2017 08:40:57 +0000 (08:40 +0000)
commit 829bbf268894d0866bb9dd2b1e430cfa5c5f0779 upstream.

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()")

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/rc/ir-nec-decoder.c

index 817c18f..a95d09a 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;
        }