input: mt: Collect slots initialization code
authorHenrik Rydberg <rydberg@euromail.se>
Sat, 27 Nov 2010 09:50:54 +0000 (10:50 +0100)
committerHenrik Rydberg <rydberg@euromail.se>
Thu, 16 Dec 2010 09:41:12 +0000 (10:41 +0100)
The MT slots devices all follow the same initialization pattern
of creating slots and hinting about buffer size. Let drivers call
an initialization function instead, and make sure it can be called
repeatedly without side effects.

Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
drivers/hid/hid-3m-pct.c
drivers/input/input-mt.c
drivers/input/misc/uinput.c
drivers/input/tablet/wacom_wac.c
drivers/input/touchscreen/wacom_w8001.c
include/linux/input/mt.h

index 18575a4e0d630f030a86082f3c1cf533b1ebb442..ea475964d05a735632f2c5feb7c8fb7e5e58408b 100644 (file)
@@ -29,7 +29,6 @@ MODULE_LICENSE("GPL");
 
 #define MAX_SLOTS              60
 #define MAX_TRKID              USHRT_MAX
-#define MAX_EVENTS             360
 
 /* estimated signal-to-noise ratios */
 #define SN_MOVE                        2048
@@ -123,9 +122,7 @@ static int mmm_input_mapping(struct hid_device *hdev, struct hid_input *hi,
                                        EV_ABS, ABS_MT_TRACKING_ID);
                        input_set_abs_params(hi->input, ABS_MT_TRACKING_ID,
                                             0, MAX_TRKID, 0, 0);
-                       if (!hi->input->mt)
-                               input_mt_create_slots(hi->input, MAX_SLOTS);
-                       input_set_events_per_packet(hi->input, MAX_EVENTS);
+                       input_mt_init_slots(hi->input, MAX_SLOTS);
                        return 1;
                }
                /* let hid-input decide for the others */
index 463a4d7d54f287f4479537f06811a85cf52aaa51..f400e47092c4c5da35bdf0b3adbe30963b1bcbeb 100644 (file)
 #include <linux/slab.h>
 
 /**
- * input_mt_create_slots() - create MT input slots
+ * input_mt_init_slots() - initialize MT input slots
  * @dev: input device supporting MT events and finger tracking
  * @num_slots: number of slots used by the device
  *
- * This function allocates all necessary memory for MT slot handling in the
- * input device, and adds ABS_MT_SLOT to the device capabilities. All slots
- * are initially marked as unused by setting ABS_MT_TRACKING_ID to -1.
+ * This function allocates all necessary memory for MT slot handling
+ * in the input device, adds ABS_MT_SLOT to the device capabilities
+ * and sets up appropriate event buffers. All slots are initially
+ * marked as unused by setting ABS_MT_TRACKING_ID to -1. May be called
+ * repeatedly. Returns -EINVAL if attempting to reinitialize with a
+ * different number of slots.
  */
-int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots)
+int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots)
 {
        int i;
 
        if (!num_slots)
                return 0;
+       if (dev->mt)
+               return dev->mtsize != num_slots ? -EINVAL : 0;
 
        dev->mt = kcalloc(num_slots, sizeof(struct input_mt_slot), GFP_KERNEL);
        if (!dev->mt)
@@ -33,6 +38,7 @@ int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots)
 
        dev->mtsize = num_slots;
        input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0);
+       input_set_events_per_packet(dev, 6 * num_slots);
 
        /* Mark slots as 'unused' */
        for (i = 0; i < num_slots; i++)
@@ -40,7 +46,7 @@ int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots)
 
        return 0;
 }
-EXPORT_SYMBOL(input_mt_create_slots);
+EXPORT_SYMBOL(input_mt_init_slots);
 
 /**
  * input_mt_destroy_slots() - frees the MT slots of the input device
@@ -54,5 +60,6 @@ void input_mt_destroy_slots(struct input_dev *dev)
        kfree(dev->mt);
        dev->mt = NULL;
        dev->mtsize = 0;
+       dev->slot = 0;
 }
 EXPORT_SYMBOL(input_mt_destroy_slots);
index 8f374143190e161698169fbd0bf0ecf71fbd65c5..bea89722c4e92e4105d6d6d0df8585912459c469 100644 (file)
@@ -407,8 +407,7 @@ static int uinput_setup_device(struct uinput_device *udev, const char __user *bu
                        goto exit;
                if (test_bit(ABS_MT_SLOT, dev->absbit)) {
                        int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1;
-                       input_mt_create_slots(dev, nslot);
-                       input_set_events_per_packet(dev, 6 * nslot);
+                       input_mt_init_slots(dev, nslot);
                } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
                        input_set_events_per_packet(dev, 60);
                }
index bde612c6d36d54edec3ba131b2603c6917a4e579..f26e2238f6ca8e97c06abab8e79ad2af621494ef 100644 (file)
@@ -1273,7 +1273,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev,
                        __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
                        __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
 
-                       input_mt_create_slots(input_dev, 2);
+                       input_mt_init_slots(input_dev, 2);
                        input_set_abs_params(input_dev, ABS_MT_POSITION_X,
                                             0, features->x_max,
                                             features->x_fuzz, 0);
index 5d4f50e52a28e98a0a879429364bfad8e296ee1a..4a2e8cf4c8ef84951523a173cb8736a5fdf4c277 100644 (file)
@@ -318,7 +318,7 @@ static int w8001_setup(struct w8001 *w8001)
                case 5:
                        w8001->pktlen = W8001_PKTLEN_TOUCH2FG;
 
-                       input_mt_create_slots(dev, 2);
+                       input_mt_init_slots(dev, 2);
                        input_set_abs_params(dev, ABS_MT_TRACKING_ID,
                                                0, MAX_TRACKING_ID, 0, 0);
                        input_set_abs_params(dev, ABS_MT_POSITION_X,
index 4f5e9d0e2eae342b7c32b24bab59992880894864..d7f6518e32223b8dc6869b1235bf6f33533e173b 100644 (file)
@@ -33,7 +33,7 @@ static inline int input_mt_get_value(const struct input_mt_slot *slot,
        return slot->abs[code - ABS_MT_FIRST];
 }
 
-int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots);
+int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots);
 void input_mt_destroy_slots(struct input_dev *dev);
 
 static inline void input_mt_slot(struct input_dev *dev, int slot)