2727 */
2828int input_mt_init_slots (struct input_dev * dev , unsigned int num_slots )
2929{
30+ struct input_mt * mt = dev -> mt ;
3031 int i ;
3132
3233 if (!num_slots )
3334 return 0 ;
34- if (dev -> mt )
35- return dev -> mtsize != num_slots ? - EINVAL : 0 ;
35+ if (mt )
36+ return mt -> num_slots != num_slots ? - EINVAL : 0 ;
3637
37- dev -> mt = kcalloc ( num_slots , sizeof (struct input_mt_slot ), GFP_KERNEL );
38- if (!dev -> mt )
38+ mt = kzalloc ( sizeof ( * mt ) + num_slots * sizeof (* mt -> slots ), GFP_KERNEL );
39+ if (!mt )
3940 return - ENOMEM ;
4041
41- dev -> mtsize = num_slots ;
42+ mt -> num_slots = num_slots ;
4243 input_set_abs_params (dev , ABS_MT_SLOT , 0 , num_slots - 1 , 0 , 0 );
4344 input_set_abs_params (dev , ABS_MT_TRACKING_ID , 0 , TRKID_MAX , 0 , 0 );
4445 input_set_events_per_packet (dev , 6 * num_slots );
4546
4647 /* Mark slots as 'unused' */
4748 for (i = 0 ; i < num_slots ; i ++ )
48- input_mt_set_value (& dev -> mt [i ], ABS_MT_TRACKING_ID , -1 );
49+ input_mt_set_value (& mt -> slots [i ], ABS_MT_TRACKING_ID , -1 );
4950
51+ dev -> mt = mt ;
5052 return 0 ;
5153}
5254EXPORT_SYMBOL (input_mt_init_slots );
@@ -62,9 +64,6 @@ void input_mt_destroy_slots(struct input_dev *dev)
6264{
6365 kfree (dev -> mt );
6466 dev -> mt = NULL ;
65- dev -> mtsize = 0 ;
66- dev -> slot = 0 ;
67- dev -> trkid = 0 ;
6867}
6968EXPORT_SYMBOL (input_mt_destroy_slots );
7069
@@ -83,18 +82,19 @@ EXPORT_SYMBOL(input_mt_destroy_slots);
8382void input_mt_report_slot_state (struct input_dev * dev ,
8483 unsigned int tool_type , bool active )
8584{
86- struct input_mt_slot * mt ;
85+ struct input_mt * mt = dev -> mt ;
86+ struct input_mt_slot * slot ;
8787 int id ;
8888
89- if (!dev -> mt || !active ) {
89+ if (!mt || !active ) {
9090 input_event (dev , EV_ABS , ABS_MT_TRACKING_ID , -1 );
9191 return ;
9292 }
9393
94- mt = & dev -> mt [ dev -> slot ];
95- id = input_mt_get_value (mt , ABS_MT_TRACKING_ID );
96- if (id < 0 || input_mt_get_value (mt , ABS_MT_TOOL_TYPE ) != tool_type )
97- id = input_mt_new_trkid (dev );
94+ slot = & mt -> slots [ mt -> slot ];
95+ id = input_mt_get_value (slot , ABS_MT_TRACKING_ID );
96+ if (id < 0 || input_mt_get_value (slot , ABS_MT_TOOL_TYPE ) != tool_type )
97+ id = input_mt_new_trkid (mt );
9898
9999 input_event (dev , EV_ABS , ABS_MT_TRACKING_ID , id );
100100 input_event (dev , EV_ABS , ABS_MT_TOOL_TYPE , tool_type );
@@ -135,13 +135,19 @@ EXPORT_SYMBOL(input_mt_report_finger_count);
135135 */
136136void input_mt_report_pointer_emulation (struct input_dev * dev , bool use_count )
137137{
138- struct input_mt_slot * oldest = NULL ;
139- int oldid = dev -> trkid ;
140- int count = 0 ;
141- int i ;
138+ struct input_mt * mt = dev -> mt ;
139+ struct input_mt_slot * oldest ;
140+ int oldid , count , i ;
141+
142+ if (!mt )
143+ return ;
144+
145+ oldest = 0 ;
146+ oldid = mt -> trkid ;
147+ count = 0 ;
142148
143- for (i = 0 ; i < dev -> mtsize ; ++ i ) {
144- struct input_mt_slot * ps = & dev -> mt [i ];
149+ for (i = 0 ; i < mt -> num_slots ; ++ i ) {
150+ struct input_mt_slot * ps = & mt -> slots [i ];
145151 int id = input_mt_get_value (ps , ABS_MT_TRACKING_ID );
146152
147153 if (id < 0 )
0 commit comments