|
@@ -522,18 +522,20 @@ EXPORT_SYMBOL_GPL(rc_g_keycode_from_table);
|
|
|
/**
|
|
|
* ir_do_keyup() - internal function to signal the release of a keypress
|
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
|
+ * @sync: whether or not to call input_sync
|
|
|
*
|
|
|
* This function is used internally to release a keypress, it must be
|
|
|
* called with keylock held.
|
|
|
*/
|
|
|
-static void ir_do_keyup(struct rc_dev *dev)
|
|
|
+static void ir_do_keyup(struct rc_dev *dev, bool sync)
|
|
|
{
|
|
|
if (!dev->keypressed)
|
|
|
return;
|
|
|
|
|
|
IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode);
|
|
|
input_report_key(dev->input_dev, dev->last_keycode, 0);
|
|
|
- input_sync(dev->input_dev);
|
|
|
+ if (sync)
|
|
|
+ input_sync(dev->input_dev);
|
|
|
dev->keypressed = false;
|
|
|
}
|
|
|
|
|
@@ -549,7 +551,7 @@ void rc_keyup(struct rc_dev *dev)
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
|
- ir_do_keyup(dev);
|
|
|
+ ir_do_keyup(dev, true);
|
|
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rc_keyup);
|
|
@@ -578,7 +580,7 @@ static void ir_timer_keyup(unsigned long cookie)
|
|
|
*/
|
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
|
if (time_is_before_eq_jiffies(dev->keyup_jiffies))
|
|
|
- ir_do_keyup(dev);
|
|
|
+ ir_do_keyup(dev, true);
|
|
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
|
|
}
|
|
|
|
|
@@ -597,6 +599,7 @@ void rc_repeat(struct rc_dev *dev)
|
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
|
|
|
|
input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode);
|
|
|
+ input_sync(dev->input_dev);
|
|
|
|
|
|
if (!dev->keypressed)
|
|
|
goto out;
|
|
@@ -622,29 +625,28 @@ EXPORT_SYMBOL_GPL(rc_repeat);
|
|
|
static void ir_do_keydown(struct rc_dev *dev, int scancode,
|
|
|
u32 keycode, u8 toggle)
|
|
|
{
|
|
|
- input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
|
|
|
-
|
|
|
- /* Repeat event? */
|
|
|
- if (dev->keypressed &&
|
|
|
- dev->last_scancode == scancode &&
|
|
|
- dev->last_toggle == toggle)
|
|
|
- return;
|
|
|
+ bool new_event = !dev->keypressed ||
|
|
|
+ dev->last_scancode != scancode ||
|
|
|
+ dev->last_toggle != toggle;
|
|
|
|
|
|
- /* Release old keypress */
|
|
|
- ir_do_keyup(dev);
|
|
|
+ if (new_event && dev->keypressed)
|
|
|
+ ir_do_keyup(dev, false);
|
|
|
|
|
|
- dev->last_scancode = scancode;
|
|
|
- dev->last_toggle = toggle;
|
|
|
- dev->last_keycode = keycode;
|
|
|
+ input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
|
|
|
|
|
|
- if (keycode == KEY_RESERVED)
|
|
|
- return;
|
|
|
+ if (new_event && keycode != KEY_RESERVED) {
|
|
|
+ /* Register a keypress */
|
|
|
+ dev->keypressed = true;
|
|
|
+ dev->last_scancode = scancode;
|
|
|
+ dev->last_toggle = toggle;
|
|
|
+ dev->last_keycode = keycode;
|
|
|
+
|
|
|
+ IR_dprintk(1, "%s: key down event, "
|
|
|
+ "key 0x%04x, scancode 0x%04x\n",
|
|
|
+ dev->input_name, keycode, scancode);
|
|
|
+ input_report_key(dev->input_dev, keycode, 1);
|
|
|
+ }
|
|
|
|
|
|
- /* Register a keypress */
|
|
|
- dev->keypressed = true;
|
|
|
- IR_dprintk(1, "%s: key down event, key 0x%04x, scancode 0x%04x\n",
|
|
|
- dev->input_name, keycode, scancode);
|
|
|
- input_report_key(dev->input_dev, dev->last_keycode, 1);
|
|
|
input_sync(dev->input_dev);
|
|
|
}
|
|
|
|