|
@@ -623,6 +623,7 @@ EXPORT_SYMBOL_GPL(rc_repeat);
|
|
/**
|
|
/**
|
|
* ir_do_keydown() - internal function to process a keypress
|
|
* ir_do_keydown() - internal function to process a keypress
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
|
|
+ * @protocol: the protocol of the keypress
|
|
* @scancode: the scancode of the keypress
|
|
* @scancode: the scancode of the keypress
|
|
* @keycode: the keycode of the keypress
|
|
* @keycode: the keycode of the keypress
|
|
* @toggle: the toggle value of the keypress
|
|
* @toggle: the toggle value of the keypress
|
|
@@ -630,12 +631,13 @@ EXPORT_SYMBOL_GPL(rc_repeat);
|
|
* This function is used internally to register a keypress, it must be
|
|
* This function is used internally to register a keypress, it must be
|
|
* called with keylock held.
|
|
* called with keylock held.
|
|
*/
|
|
*/
|
|
-static void ir_do_keydown(struct rc_dev *dev, int scancode,
|
|
|
|
- u32 keycode, u8 toggle)
|
|
|
|
|
|
+static void ir_do_keydown(struct rc_dev *dev, enum rc_type protocol,
|
|
|
|
+ u32 scancode, u32 keycode, u8 toggle)
|
|
{
|
|
{
|
|
bool new_event = (!dev->keypressed ||
|
|
bool new_event = (!dev->keypressed ||
|
|
|
|
+ dev->last_protocol != protocol ||
|
|
dev->last_scancode != scancode ||
|
|
dev->last_scancode != scancode ||
|
|
- dev->last_toggle != toggle);
|
|
|
|
|
|
+ dev->last_toggle != toggle);
|
|
|
|
|
|
if (new_event && dev->keypressed)
|
|
if (new_event && dev->keypressed)
|
|
ir_do_keyup(dev, false);
|
|
ir_do_keyup(dev, false);
|
|
@@ -645,13 +647,14 @@ static void ir_do_keydown(struct rc_dev *dev, int scancode,
|
|
if (new_event && keycode != KEY_RESERVED) {
|
|
if (new_event && keycode != KEY_RESERVED) {
|
|
/* Register a keypress */
|
|
/* Register a keypress */
|
|
dev->keypressed = true;
|
|
dev->keypressed = true;
|
|
|
|
+ dev->last_protocol = protocol;
|
|
dev->last_scancode = scancode;
|
|
dev->last_scancode = scancode;
|
|
dev->last_toggle = toggle;
|
|
dev->last_toggle = toggle;
|
|
dev->last_keycode = keycode;
|
|
dev->last_keycode = keycode;
|
|
|
|
|
|
IR_dprintk(1, "%s: key down event, "
|
|
IR_dprintk(1, "%s: key down event, "
|
|
- "key 0x%04x, scancode 0x%04x\n",
|
|
|
|
- dev->input_name, keycode, scancode);
|
|
|
|
|
|
+ "key 0x%04x, protocol 0x%04x, scancode 0x%08x\n",
|
|
|
|
+ dev->input_name, keycode, protocol, scancode);
|
|
input_report_key(dev->input_dev, keycode, 1);
|
|
input_report_key(dev->input_dev, keycode, 1);
|
|
|
|
|
|
led_trigger_event(led_feedback, LED_FULL);
|
|
led_trigger_event(led_feedback, LED_FULL);
|
|
@@ -663,20 +666,21 @@ static void ir_do_keydown(struct rc_dev *dev, int scancode,
|
|
/**
|
|
/**
|
|
* rc_keydown() - generates input event for a key press
|
|
* rc_keydown() - generates input event for a key press
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
- * @scancode: the scancode that we're seeking
|
|
|
|
|
|
+ * @protocol: the protocol for the keypress
|
|
|
|
+ * @scancode: the scancode for the keypress
|
|
* @toggle: the toggle value (protocol dependent, if the protocol doesn't
|
|
* @toggle: the toggle value (protocol dependent, if the protocol doesn't
|
|
* support toggle values, this should be set to zero)
|
|
* support toggle values, this should be set to zero)
|
|
*
|
|
*
|
|
* This routine is used to signal that a key has been pressed on the
|
|
* This routine is used to signal that a key has been pressed on the
|
|
* remote control.
|
|
* remote control.
|
|
*/
|
|
*/
|
|
-void rc_keydown(struct rc_dev *dev, int scancode, u8 toggle)
|
|
|
|
|
|
+void rc_keydown(struct rc_dev *dev, enum rc_type protocol, u32 scancode, u8 toggle)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
u32 keycode = rc_g_keycode_from_table(dev, scancode);
|
|
u32 keycode = rc_g_keycode_from_table(dev, scancode);
|
|
|
|
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
- ir_do_keydown(dev, scancode, keycode, toggle);
|
|
|
|
|
|
+ ir_do_keydown(dev, protocol, scancode, keycode, toggle);
|
|
|
|
|
|
if (dev->keypressed) {
|
|
if (dev->keypressed) {
|
|
dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT);
|
|
dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT);
|
|
@@ -690,20 +694,22 @@ EXPORT_SYMBOL_GPL(rc_keydown);
|
|
* rc_keydown_notimeout() - generates input event for a key press without
|
|
* rc_keydown_notimeout() - generates input event for a key press without
|
|
* an automatic keyup event at a later time
|
|
* an automatic keyup event at a later time
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
* @dev: the struct rc_dev descriptor of the device
|
|
- * @scancode: the scancode that we're seeking
|
|
|
|
|
|
+ * @protocol: the protocol for the keypress
|
|
|
|
+ * @scancode: the scancode for the keypress
|
|
* @toggle: the toggle value (protocol dependent, if the protocol doesn't
|
|
* @toggle: the toggle value (protocol dependent, if the protocol doesn't
|
|
* support toggle values, this should be set to zero)
|
|
* support toggle values, this should be set to zero)
|
|
*
|
|
*
|
|
* This routine is used to signal that a key has been pressed on the
|
|
* This routine is used to signal that a key has been pressed on the
|
|
* remote control. The driver must manually call rc_keyup() at a later stage.
|
|
* remote control. The driver must manually call rc_keyup() at a later stage.
|
|
*/
|
|
*/
|
|
-void rc_keydown_notimeout(struct rc_dev *dev, int scancode, u8 toggle)
|
|
|
|
|
|
+void rc_keydown_notimeout(struct rc_dev *dev, enum rc_type protocol,
|
|
|
|
+ u32 scancode, u8 toggle)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
u32 keycode = rc_g_keycode_from_table(dev, scancode);
|
|
u32 keycode = rc_g_keycode_from_table(dev, scancode);
|
|
|
|
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
- ir_do_keydown(dev, scancode, keycode, toggle);
|
|
|
|
|
|
+ ir_do_keydown(dev, protocol, scancode, keycode, toggle);
|
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
|
|
EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
|
|
@@ -1315,7 +1321,7 @@ int rc_register_device(struct rc_dev *dev)
|
|
dev->dev.groups = dev->sysfs_groups;
|
|
dev->dev.groups = dev->sysfs_groups;
|
|
dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp;
|
|
dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp;
|
|
if (dev->s_filter)
|
|
if (dev->s_filter)
|
|
- dev->sysfs_groups[attr++] = &rc_dev_filter_attr_grp;
|
|
|
|
|
|
+ dev->sysfs_groups[attr++] = &rc_dev_filter_attr_grp;
|
|
if (dev->s_wakeup_filter)
|
|
if (dev->s_wakeup_filter)
|
|
dev->sysfs_groups[attr++] = &rc_dev_wakeup_filter_attr_grp;
|
|
dev->sysfs_groups[attr++] = &rc_dev_wakeup_filter_attr_grp;
|
|
if (dev->change_wakeup_protocol)
|
|
if (dev->change_wakeup_protocol)
|