diff -drupN a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c --- a/drivers/media/rc/rc-main.c 2018-08-06 17:23:04.000000000 +0300 +++ b/drivers/media/rc/rc-main.c 2022-06-12 05:28:14.000000000 +0300 @@ -30,12 +30,13 @@ #define RC_DEV_MAX 256 /* FIXME: IR_KEYPRESS_TIMEOUT should be protocol specific */ -#define IR_KEYPRESS_TIMEOUT 250 +#define IR_KEYPRESS_TIMEOUT 160 /* Used to keep track of known keymaps */ static LIST_HEAD(rc_map_list); static DEFINE_SPINLOCK(rc_map_lock); static struct led_trigger *led_feedback; +static int key_repeat; /* Used to keep track of rc devices */ static DEFINE_IDA(rc_ida); @@ -199,7 +200,7 @@ static int ir_resize_table(struct rc_map newscan = kmalloc(newalloc, gfp_flags); if (!newscan) { - IR_dprintk(1, "Failed to kmalloc %u bytes\n", newalloc); + IR_dprintk(0, "Failed to kmalloc %u bytes\n", newalloc); return -ENOMEM; } @@ -547,12 +548,20 @@ static void ir_do_keyup(struct rc_dev *d if (!dev->keypressed) return; - IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode); + IR_dprintk(2, "keyup key 0x%04x, dev->last_scancode is 0x%04x\n",\ + dev->last_keycode, dev->last_scancode); +/*sunxi_multi ir only care scancode, not really keycode*/ +#ifdef CONFIG_SUNXI_MULTI_IR_SUPPORT + input_event(dev->input_dev, EV_MSC, MSC_SCAN, (dev->last_scancode & (~(0x1 << 24)))); +#else input_report_key(dev->input_dev, dev->last_keycode, 0); +#endif led_trigger_event(led_feedback, LED_OFF); if (sync) input_sync(dev->input_dev); + dev->keypressed = false; + key_repeat = 0; } /** @@ -610,18 +619,22 @@ static void ir_timer_keyup(unsigned long */ void rc_repeat(struct rc_dev *dev) { - unsigned long flags; + unsigned long flags __attribute__((unused)); spin_lock_irqsave(&dev->keylock, flags); - +#ifdef CONFIG_SUNXI_MULTI_IR_SUPPORT + if (!dev->keypressed) + goto out; + key_repeat = 1; +#else input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode); input_sync(dev->input_dev); - if (!dev->keypressed) goto out; dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT); mod_timer(&dev->timer_keyup, dev->keyup_jiffies); +#endif out: spin_unlock_irqrestore(&dev->keylock, flags); @@ -644,11 +657,32 @@ static void ir_do_keydown(struct rc_dev { bool new_event = (!dev->keypressed || dev->last_protocol != protocol || - dev->last_scancode != scancode || + ((dev->last_scancode & 0xffffffUL) != (scancode & 0xffffffUL)) || + !key_repeat || dev->last_toggle != toggle); if (new_event && dev->keypressed) ir_do_keyup(dev, false); +#ifdef CONFIG_SUNXI_MULTI_IR_SUPPORT + if (new_event) { + /* Register a keypress */ + dev->keypressed = true; + key_repeat = 0; + dev->last_protocol = protocol; + dev->last_scancode = scancode; + dev->last_toggle = toggle; + dev->last_keycode = keycode; + input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode | (0x01 << 24)); + + IR_dprintk(1, "%s: key down event, " + "key 0x%04x, protocol 0x%04x, scancode 0x%08x\n", + dev->input_name, keycode, protocol, scancode); + + led_trigger_event(led_feedback, LED_FULL); + } else { + IR_dprintk(1, "scode :0x%4x , repeat :0x%4x\n", dev->last_scancode, key_repeat); + } +#else input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode); @@ -667,7 +701,7 @@ static void ir_do_keydown(struct rc_dev led_trigger_event(led_feedback, LED_FULL); } - +#endif input_sync(dev->input_dev); }