Lines Matching +full:abs +full:- +full:fuzz

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (c) 2008-2010 Henrik Rydberg
11 #include "input-core-private.h"
17 if (dev->absinfo && test_bit(src, dev->absbit)) { in copy_abs()
18 dev->absinfo[dst] = dev->absinfo[src]; in copy_abs()
19 dev->absinfo[dst].fuzz = 0; in copy_abs()
20 __set_bit(dst, dev->absbit); in copy_abs()
25 * input_mt_init_slots() - initialize MT input slots
36 * May be called repeatedly. Returns -EINVAL if attempting to
42 struct input_mt *mt = dev->mt; in input_mt_init_slots()
48 return mt->num_slots != num_slots ? -EINVAL : 0; in input_mt_init_slots()
54 mt->num_slots = num_slots; in input_mt_init_slots()
55 mt->flags = flags; in input_mt_init_slots()
56 input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0); in input_mt_init_slots()
60 __set_bit(EV_KEY, dev->evbit); in input_mt_init_slots()
61 __set_bit(BTN_TOUCH, dev->keybit); in input_mt_init_slots()
68 __set_bit(BTN_TOOL_FINGER, dev->keybit); in input_mt_init_slots()
69 __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); in input_mt_init_slots()
71 __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit); in input_mt_init_slots()
73 __set_bit(BTN_TOOL_QUADTAP, dev->keybit); in input_mt_init_slots()
75 __set_bit(BTN_TOOL_QUINTTAP, dev->keybit); in input_mt_init_slots()
76 __set_bit(INPUT_PROP_POINTER, dev->propbit); in input_mt_init_slots()
79 __set_bit(INPUT_PROP_DIRECT, dev->propbit); in input_mt_init_slots()
81 __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); in input_mt_init_slots()
84 mt->red = kcalloc(n2, sizeof(*mt->red), GFP_KERNEL); in input_mt_init_slots()
85 if (!mt->red) in input_mt_init_slots()
91 input_mt_set_value(&mt->slots[i], ABS_MT_TRACKING_ID, -1); in input_mt_init_slots()
94 mt->frame = 1; in input_mt_init_slots()
96 dev->mt = mt; in input_mt_init_slots()
100 return -ENOMEM; in input_mt_init_slots()
105 * input_mt_destroy_slots() - frees the MT slots of the input device
113 if (dev->mt) { in input_mt_destroy_slots()
114 kfree(dev->mt->red); in input_mt_destroy_slots()
115 kfree(dev->mt); in input_mt_destroy_slots()
117 dev->mt = NULL; in input_mt_destroy_slots()
122 * input_mt_report_slot_state() - report contact state
138 struct input_mt *mt = dev->mt; in input_mt_report_slot_state()
145 slot = &mt->slots[mt->slot]; in input_mt_report_slot_state()
146 slot->frame = mt->frame; in input_mt_report_slot_state()
149 input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1); in input_mt_report_slot_state()
165 * input_mt_report_finger_count() - report contact count
186 * input_mt_report_pointer_emulation() - common pointer emulation
193 * The input core ensures only the KEY and ABS axes already setup for
198 struct input_mt *mt = dev->mt; in input_mt_report_pointer_emulation()
206 oldid = mt->trkid; in input_mt_report_pointer_emulation()
209 for (i = 0; i < mt->num_slots; ++i) { in input_mt_report_pointer_emulation()
210 struct input_mt_slot *ps = &mt->slots[i]; in input_mt_report_pointer_emulation()
215 if ((id - oldid) & TRKID_SGN) { in input_mt_report_pointer_emulation()
226 !test_bit(ABS_MT_DISTANCE, dev->absbit) && in input_mt_report_pointer_emulation()
227 test_bit(ABS_DISTANCE, dev->absbit) && in input_mt_report_pointer_emulation()
231 * only report general hover (and not per-contact in input_mt_report_pointer_emulation()
248 if (test_bit(ABS_MT_PRESSURE, dev->absbit)) { in input_mt_report_pointer_emulation()
253 if (test_bit(ABS_MT_PRESSURE, dev->absbit)) in input_mt_report_pointer_emulation()
263 lockdep_assert_held(&dev->event_lock); in __input_mt_drop_unused()
265 for (i = 0; i < mt->num_slots; i++) { in __input_mt_drop_unused()
266 if (input_mt_is_active(&mt->slots[i]) && in __input_mt_drop_unused()
267 !input_mt_is_used(mt, &mt->slots[i])) { in __input_mt_drop_unused()
269 input_handle_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1); in __input_mt_drop_unused()
275 * input_mt_drop_unused() - Inactivate slots not seen in this frame
282 struct input_mt *mt = dev->mt; in input_mt_drop_unused()
287 spin_lock_irqsave(&dev->event_lock, flags); in input_mt_drop_unused()
290 mt->frame++; in input_mt_drop_unused()
292 spin_unlock_irqrestore(&dev->event_lock, flags); in input_mt_drop_unused()
298 * input_mt_release_slots() - Deactivate all slots
305 struct input_mt *mt = dev->mt; in input_mt_release_slots()
307 lockdep_assert_held(&dev->event_lock); in input_mt_release_slots()
311 mt->frame++; in input_mt_release_slots()
315 if (test_bit(ABS_PRESSURE, dev->absbit)) in input_mt_release_slots()
318 mt->frame++; in input_mt_release_slots()
323 * input_mt_sync_frame() - synchronize mt frame
332 struct input_mt *mt = dev->mt; in input_mt_sync_frame()
338 if (mt->flags & INPUT_MT_DROP_UNUSED) { in input_mt_sync_frame()
341 spin_lock_irqsave(&dev->event_lock, flags); in input_mt_sync_frame()
343 spin_unlock_irqrestore(&dev->event_lock, flags); in input_mt_sync_frame()
346 if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) in input_mt_sync_frame()
351 mt->frame++; in input_mt_sync_frame()
383 *p -= c; in adjust_dual()
409 int *w = mt->red; in input_mt_set_matrix()
412 for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { in input_mt_set_matrix()
418 int dx = x - p->x, dy = y - p->y; in input_mt_set_matrix()
419 *w++ = dx * dx + dy * dy - mu; in input_mt_set_matrix()
423 return w - mt->red; in input_mt_set_matrix()
430 int *w = mt->red, j; in input_mt_set_slots()
433 slots[j] = -1; in input_mt_set_slots()
435 for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { in input_mt_set_slots()
441 slots[j] = s - mt->slots; in input_mt_set_slots()
449 for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { in input_mt_set_slots()
455 slots[j] = s - mt->slots; in input_mt_set_slots()
463 * input_mt_assign_slots() - perform a best-match assignment
484 struct input_mt *mt = dev->mt; in input_mt_assign_slots()
488 if (!mt || !mt->red) in input_mt_assign_slots()
489 return -ENXIO; in input_mt_assign_slots()
490 if (num_pos > mt->num_slots) in input_mt_assign_slots()
491 return -EINVAL; in input_mt_assign_slots()
496 find_reduced_matrix(mt->red, num_pos, nrc / num_pos, nrc, mu); in input_mt_assign_slots()
504 * input_mt_get_slot_by_key() - return slot matching key
511 * If no available slot can be found, -1 is returned.
517 struct input_mt *mt = dev->mt; in input_mt_get_slot_by_key()
521 return -1; in input_mt_get_slot_by_key()
523 for (s = mt->slots; s != mt->slots + mt->num_slots; s++) in input_mt_get_slot_by_key()
524 if (input_mt_is_active(s) && s->key == key) in input_mt_get_slot_by_key()
525 return s - mt->slots; in input_mt_get_slot_by_key()
527 for (s = mt->slots; s != mt->slots + mt->num_slots; s++) in input_mt_get_slot_by_key()
529 s->key = key; in input_mt_get_slot_by_key()
530 return s - mt->slots; in input_mt_get_slot_by_key()
533 return -1; in input_mt_get_slot_by_key()