Skip to content

Commit

Permalink
Input: MT - Get slot by key
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Henrik Rydberg committed Sep 19, 2012
1 parent 7c1a878 commit 17a465a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
32 changes: 32 additions & 0 deletions drivers/input/input-mt.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,3 +383,35 @@ int input_mt_assign_slots(struct input_dev *dev, int *slots,
return 0;
}
EXPORT_SYMBOL(input_mt_assign_slots);

/**
* input_mt_get_slot_by_key() - return slot matching key
* @dev: input device with allocated MT slots
* @key: the key of the sought slot
*
* Returns the slot of the given key, if it exists, otherwise
* set the key on the first unused slot and return.
*
* If no available slot can be found, -1 is returned.
*/
int input_mt_get_slot_by_key(struct input_dev *dev, int key)
{
struct input_mt *mt = dev->mt;
struct input_mt_slot *s;

if (!mt)
return -1;

for (s = mt->slots; s != mt->slots + mt->num_slots; s++)
if (input_mt_is_active(s) && s->key == key)
return s - mt->slots;

for (s = mt->slots; s != mt->slots + mt->num_slots; s++)
if (!input_mt_is_active(s)) {
s->key = key;
return s - mt->slots;
}

return -1;
}
EXPORT_SYMBOL(input_mt_get_slot_by_key);
4 changes: 4 additions & 0 deletions include/linux/input/mt.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@
* struct input_mt_slot - represents the state of an input MT slot
* @abs: holds current values of ABS_MT axes for this slot
* @frame: last frame at which input_mt_report_slot_state() was called
* @key: optional driver designation of this slot
*/
struct input_mt_slot {
int abs[ABS_MT_LAST - ABS_MT_FIRST + 1];
unsigned int frame;
unsigned int key;
};

/**
Expand Down Expand Up @@ -111,4 +113,6 @@ struct input_mt_pos {
int input_mt_assign_slots(struct input_dev *dev, int *slots,
const struct input_mt_pos *pos, int num_pos);

int input_mt_get_slot_by_key(struct input_dev *dev, int key);

#endif

0 comments on commit 17a465a

Please sign in to comment.