diff options
Diffstat (limited to 'drivers/media/rc/rc-main.c')
| -rw-r--r-- | drivers/media/rc/rc-main.c | 52 | 
1 files changed, 28 insertions, 24 deletions
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index f57cd5677ac2..51a23f48bc7d 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -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); +	bool new_event = !dev->keypressed || +			 dev->last_scancode != scancode || +			 dev->last_toggle != toggle; -	/* Repeat event? */ -	if (dev->keypressed && -	    dev->last_scancode == scancode && -	    dev->last_toggle == toggle) -		return; - -	/* 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);  } @@ -733,6 +735,7 @@ static struct {  	{ RC_TYPE_JVC,		"jvc"		},  	{ RC_TYPE_SONY,		"sony"		},  	{ RC_TYPE_RC5_SZ,	"rc-5-sz"	}, +	{ RC_TYPE_MCE_KBD,	"mce_kbd"	},  	{ RC_TYPE_LIRC,		"lirc"		},  	{ RC_TYPE_OTHER,	"other"		},  }; @@ -1097,7 +1100,6 @@ int rc_register_device(struct rc_dev *dev)  		if (rc < 0)  			goto out_input;  	} -	mutex_unlock(&dev->lock);  	if (dev->change_protocol) {  		rc = dev->change_protocol(dev, rc_map->rc_type); @@ -1105,6 +1107,8 @@ int rc_register_device(struct rc_dev *dev)  			goto out_raw;  	} +	mutex_unlock(&dev->lock); +  	IR_dprintk(1, "Registered rc%ld (driver: %s, remote: %s, mode %s)\n",  		   dev->devno,  		   dev->driver_name ? dev->driver_name : "unknown",  |