Input: Break out MT data
[firefly-linux-kernel-4.4.55.git] / drivers / input / input-mt.c
index 70a16c7da8ccbefc542477e27623a8641c72ad25..37ee1f925d232a67d4a6053ea1025922c17ed14b 100644 (file)
  */
 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)