firmware/br-ext-chip-allwinner/board/v83x/kernel/patches/00000-drivers_media_rc_rc-m...

119 lines
3.4 KiB
Diff

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);
}