aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2012-09-01 03:27:20 -0400
committerHenrik Rydberg <rydberg@euromail.se>2012-09-19 13:50:19 -0400
commit17a465a7f2d6ce31738a3a76591afeab165f185a (patch)
treeb10a27eb43a6eb0aee31aa851c00936ec3edcc17
parent7c1a87897c75139dec258eb03e1a24fb73385b73 (diff)
Input: MT - Get slot by key
Some devices use an internal key for tracking which cannot be directly mapped to slots. This patch provides a key-to-slot mapping, which can be used by drivers of such devices. Reviewed-and-tested-by: Benjamin Tissoires <benjamin.tissoires@enac.fr> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r--drivers/input/input-mt.c32
-rw-r--r--include/linux/input/mt.h4
2 files changed, 36 insertions, 0 deletions
diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c
index caff298832a4..44f5a67aaa69 100644
--- a/drivers/input/input-mt.c
+++ b/drivers/input/input-mt.c
@@ -383,3 +383,35 @@ int input_mt_assign_slots(struct input_dev *dev, int *slots,
383 return 0; 383 return 0;
384} 384}
385EXPORT_SYMBOL(input_mt_assign_slots); 385EXPORT_SYMBOL(input_mt_assign_slots);
386
387/**
388 * input_mt_get_slot_by_key() - return slot matching key
389 * @dev: input device with allocated MT slots
390 * @key: the key of the sought slot
391 *
392 * Returns the slot of the given key, if it exists, otherwise
393 * set the key on the first unused slot and return.
394 *
395 * If no available slot can be found, -1 is returned.
396 */
397int input_mt_get_slot_by_key(struct input_dev *dev, int key)
398{
399 struct input_mt *mt = dev->mt;
400 struct input_mt_slot *s;
401
402 if (!mt)
403 return -1;
404
405 for (s = mt->slots; s != mt->slots + mt->num_slots; s++)
406 if (input_mt_is_active(s) && s->key == key)
407 return s - mt->slots;
408
409 for (s = mt->slots; s != mt->slots + mt->num_slots; s++)
410 if (!input_mt_is_active(s)) {
411 s->key = key;
412 return s - mt->slots;
413 }
414
415 return -1;
416}
417EXPORT_SYMBOL(input_mt_get_slot_by_key);
diff --git a/include/linux/input/mt.h b/include/linux/input/mt.h
index 6b6f7c8e95bf..cc5cca774bab 100644
--- a/include/linux/input/mt.h
+++ b/include/linux/input/mt.h
@@ -24,10 +24,12 @@
24 * struct input_mt_slot - represents the state of an input MT slot 24 * struct input_mt_slot - represents the state of an input MT slot
25 * @abs: holds current values of ABS_MT axes for this slot 25 * @abs: holds current values of ABS_MT axes for this slot
26 * @frame: last frame at which input_mt_report_slot_state() was called 26 * @frame: last frame at which input_mt_report_slot_state() was called
27 * @key: optional driver designation of this slot
27 */ 28 */
28struct input_mt_slot { 29struct input_mt_slot {
29 int abs[ABS_MT_LAST - ABS_MT_FIRST + 1]; 30 int abs[ABS_MT_LAST - ABS_MT_FIRST + 1];
30 unsigned int frame; 31 unsigned int frame;
32 unsigned int key;
31}; 33};
32 34
33/** 35/**
@@ -111,4 +113,6 @@ struct input_mt_pos {
111int input_mt_assign_slots(struct input_dev *dev, int *slots, 113int input_mt_assign_slots(struct input_dev *dev, int *slots,
112 const struct input_mt_pos *pos, int num_pos); 114 const struct input_mt_pos *pos, int num_pos);
113 115
116int input_mt_get_slot_by_key(struct input_dev *dev, int key);
117
114#endif 118#endif