When receiving an nec repeat, rc_repeat() is called and then rc_keydown()
with the last decoded scancode. That last call is redundant.

Signed-off-by: Sean Young <s...@mess.org>
---
 drivers/media/rc/ir-nec-decoder.c | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/drivers/media/rc/ir-nec-decoder.c 
b/drivers/media/rc/ir-nec-decoder.c
index 5380a9b23c07..4ace5648866d 100644
--- a/drivers/media/rc/ir-nec-decoder.c
+++ b/drivers/media/rc/ir-nec-decoder.c
@@ -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;
        }
-- 
2.13.6

Reply via email to