aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/input-mt.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-11-27 04:50:54 -0500
committerHenrik Rydberg <rydberg@euromail.se>2010-12-16 04:41:12 -0500
commit8cde81001626c4c60b26ef2eb5fc522885ed9fd0 (patch)
tree9e9092cae44615376c5e3de98b8b259d137eb987 /drivers/input/input-mt.c
parent47c78e891323513e9909729b44033e2c6649e2b7 (diff)
input: mt: Collect slots initialization code
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>
Diffstat (limited to 'drivers/input/input-mt.c')
-rw-r--r--drivers/input/input-mt.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c
index 463a4d7d54f2..f400e47092c4 100644
--- a/drivers/input/input-mt.c
+++ b/drivers/input/input-mt.c
@@ -12,20 +12,25 @@
12#include <linux/slab.h> 12#include <linux/slab.h>
13 13
14/** 14/**
15 * input_mt_create_slots() - create MT input slots 15 * input_mt_init_slots() - initialize MT input slots
16 * @dev: input device supporting MT events and finger tracking 16 * @dev: input device supporting MT events and finger tracking
17 * @num_slots: number of slots used by the device 17 * @num_slots: number of slots used by the device
18 * 18 *
19 * This function allocates all necessary memory for MT slot handling in the 19 * This function allocates all necessary memory for MT slot handling
20 * input device, and adds ABS_MT_SLOT to the device capabilities. All slots 20 * in the input device, adds ABS_MT_SLOT to the device capabilities
21 * are initially marked as unused by setting ABS_MT_TRACKING_ID to -1. 21 * and sets up appropriate event buffers. All slots are initially
22 * marked as unused by setting ABS_MT_TRACKING_ID to -1. May be called
23 * repeatedly. Returns -EINVAL if attempting to reinitialize with a
24 * different number of slots.
22 */ 25 */
23int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots) 26int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots)
24{ 27{
25 int i; 28 int i;
26 29
27 if (!num_slots) 30 if (!num_slots)
28 return 0; 31 return 0;
32 if (dev->mt)
33 return dev->mtsize != num_slots ? -EINVAL : 0;
29 34
30 dev->mt = kcalloc(num_slots, sizeof(struct input_mt_slot), GFP_KERNEL); 35 dev->mt = kcalloc(num_slots, sizeof(struct input_mt_slot), GFP_KERNEL);
31 if (!dev->mt) 36 if (!dev->mt)
@@ -33,6 +38,7 @@ int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots)
33 38
34 dev->mtsize = num_slots; 39 dev->mtsize = num_slots;
35 input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0); 40 input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0);
41 input_set_events_per_packet(dev, 6 * num_slots);
36 42
37 /* Mark slots as 'unused' */ 43 /* Mark slots as 'unused' */
38 for (i = 0; i < num_slots; i++) 44 for (i = 0; i < num_slots; i++)
@@ -40,7 +46,7 @@ int input_mt_create_slots(struct input_dev *dev, unsigned int num_slots)
40 46
41 return 0; 47 return 0;
42} 48}
43EXPORT_SYMBOL(input_mt_create_slots); 49EXPORT_SYMBOL(input_mt_init_slots);
44 50
45/** 51/**
46 * input_mt_destroy_slots() - frees the MT slots of the input device 52 * 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)
54 kfree(dev->mt); 60 kfree(dev->mt);
55 dev->mt = NULL; 61 dev->mt = NULL;
56 dev->mtsize = 0; 62 dev->mtsize = 0;
63 dev->slot = 0;
57} 64}
58EXPORT_SYMBOL(input_mt_destroy_slots); 65EXPORT_SYMBOL(input_mt_destroy_slots);