diff options
Diffstat (limited to 'drivers/input/input-mt.c')
| -rw-r--r-- | drivers/input/input-mt.c | 48 | 
1 files changed, 27 insertions, 21 deletions
diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c index 70a16c7da8c..37ee1f925d2 100644 --- a/drivers/input/input-mt.c +++ b/drivers/input/input-mt.c @@ -27,26 +27,28 @@   */  int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots)  { +	struct input_mt *mt = dev->mt;  	int i;  	if (!num_slots)  		return 0; -	if (dev->mt) -		return dev->mtsize != num_slots ? -EINVAL : 0; +	if (mt) +		return mt->num_slots != num_slots ? -EINVAL : 0; -	dev->mt = kcalloc(num_slots, sizeof(struct input_mt_slot), GFP_KERNEL); -	if (!dev->mt) +	mt = kzalloc(sizeof(*mt) + num_slots * sizeof(*mt->slots), GFP_KERNEL); +	if (!mt)  		return -ENOMEM; -	dev->mtsize = num_slots; +	mt->num_slots = num_slots;  	input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0);  	input_set_abs_params(dev, ABS_MT_TRACKING_ID, 0, TRKID_MAX, 0, 0);  	input_set_events_per_packet(dev, 6 * num_slots);  	/* Mark slots as 'unused' */  	for (i = 0; i < num_slots; i++) -		input_mt_set_value(&dev->mt[i], ABS_MT_TRACKING_ID, -1); +		input_mt_set_value(&mt->slots[i], ABS_MT_TRACKING_ID, -1); +	dev->mt = mt;  	return 0;  }  EXPORT_SYMBOL(input_mt_init_slots); @@ -62,9 +64,6 @@ void input_mt_destroy_slots(struct input_dev *dev)  {  	kfree(dev->mt);  	dev->mt = NULL; -	dev->mtsize = 0; -	dev->slot = 0; -	dev->trkid = 0;  }  EXPORT_SYMBOL(input_mt_destroy_slots); @@ -83,18 +82,19 @@ EXPORT_SYMBOL(input_mt_destroy_slots);  void input_mt_report_slot_state(struct input_dev *dev,  				unsigned int tool_type, bool active)  { -	struct input_mt_slot *mt; +	struct input_mt *mt = dev->mt; +	struct input_mt_slot *slot;  	int id; -	if (!dev->mt || !active) { +	if (!mt || !active) {  		input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);  		return;  	} -	mt = &dev->mt[dev->slot]; -	id = input_mt_get_value(mt, ABS_MT_TRACKING_ID); -	if (id < 0 || input_mt_get_value(mt, ABS_MT_TOOL_TYPE) != tool_type) -		id = input_mt_new_trkid(dev); +	slot = &mt->slots[mt->slot]; +	id = input_mt_get_value(slot, ABS_MT_TRACKING_ID); +	if (id < 0 || input_mt_get_value(slot, ABS_MT_TOOL_TYPE) != tool_type) +		id = input_mt_new_trkid(mt);  	input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, id);  	input_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, tool_type); @@ -135,13 +135,19 @@ EXPORT_SYMBOL(input_mt_report_finger_count);   */  void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)  { -	struct input_mt_slot *oldest = NULL; -	int oldid = dev->trkid; -	int count = 0; -	int i; +	struct input_mt *mt = dev->mt; +	struct input_mt_slot *oldest; +	int oldid, count, i; + +	if (!mt) +		return; + +	oldest = 0; +	oldid = mt->trkid; +	count = 0; -	for (i = 0; i < dev->mtsize; ++i) { -		struct input_mt_slot *ps = &dev->mt[i]; +	for (i = 0; i < mt->num_slots; ++i) { +		struct input_mt_slot *ps = &mt->slots[i];  		int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);  		if (id < 0)  |