diff options
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/input.c | 13 | ||||
| -rw-r--r-- | drivers/input/joydev.c | 32 | 
2 files changed, 21 insertions, 24 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index 7080a9d4b84..dae49eba6cc 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -723,12 +723,13 @@ EXPORT_SYMBOL(input_set_keycode);  		if (i != BITS_TO_LONGS(max)) \  			continue; -static const struct input_device_id *input_match_device(const struct input_device_id *id, +static const struct input_device_id *input_match_device(struct input_handler *handler,  							struct input_dev *dev)  { +	const struct input_device_id *id;  	int i; -	for (; id->flags || id->driver_info; id++) { +	for (id = handler->id_table; id->flags || id->driver_info; id++) {  		if (id->flags & INPUT_DEVICE_ID_MATCH_BUS)  			if (id->bustype != dev->id.bustype) @@ -756,7 +757,8 @@ static const struct input_device_id *input_match_device(const struct input_devic  		MATCH_BIT(ffbit,  FF_MAX);  		MATCH_BIT(swbit,  SW_MAX); -		return id; +		if (!handler->match || handler->match(handler, dev)) +			return id;  	}  	return NULL; @@ -767,10 +769,7 @@ static int input_attach_handler(struct input_dev *dev, struct input_handler *han  	const struct input_device_id *id;  	int error; -	if (handler->blacklist && input_match_device(handler->blacklist, dev)) -		return -ENODEV; - -	id = input_match_device(handler->id_table, dev); +	id = input_match_device(handler, dev);  	if (!id)  		return -ENODEV; diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c index b1bd6dd3228..63e71f2a7ac 100644 --- a/drivers/input/joydev.c +++ b/drivers/input/joydev.c @@ -775,6 +775,20 @@ static void joydev_cleanup(struct joydev *joydev)  		input_close_device(handle);  } + +static bool joydev_match(struct input_handler *handler, struct input_dev *dev) +{ +	/* Avoid touchpads and touchscreens */ +	if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit)) +		return false; + +	/* Avoid tablets, digitisers and similar devices */ +	if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_DIGI, dev->keybit)) +		return false; + +	return true; +} +  static int joydev_connect(struct input_handler *handler, struct input_dev *dev,  			  const struct input_device_id *id)  { @@ -894,22 +908,6 @@ static void joydev_disconnect(struct input_handle *handle)  	put_device(&joydev->dev);  } -static const struct input_device_id joydev_blacklist[] = { -	{ -		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | -				INPUT_DEVICE_ID_MATCH_KEYBIT, -		.evbit = { BIT_MASK(EV_KEY) }, -		.keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, -	},	/* Avoid itouchpads and touchscreens */ -	{ -		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | -				INPUT_DEVICE_ID_MATCH_KEYBIT, -		.evbit = { BIT_MASK(EV_KEY) }, -		.keybit = { [BIT_WORD(BTN_DIGI)] = BIT_MASK(BTN_DIGI) }, -	},	/* Avoid tablets, digitisers and similar devices */ -	{ }	/* Terminating entry */ -}; -  static const struct input_device_id joydev_ids[] = {  	{  		.flags = INPUT_DEVICE_ID_MATCH_EVBIT | @@ -936,13 +934,13 @@ MODULE_DEVICE_TABLE(input, joydev_ids);  static struct input_handler joydev_handler = {  	.event		= joydev_event, +	.match		= joydev_match,  	.connect	= joydev_connect,  	.disconnect	= joydev_disconnect,  	.fops		= &joydev_fops,  	.minor		= JOYDEV_MINOR_BASE,  	.name		= "joydev",  	.id_table	= joydev_ids, -	.blacklist	= joydev_blacklist,  };  static int __init joydev_init(void)  |