Lines Matching refs:evdev
50 #define debugf(evdev, fmt, args...) printf("evdev: " fmt "\n", ##args) argument
52 #define debugf(evdev, fmt, args...) argument
56 FEATURE(evdev, "Input event devices support");
79 SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
98 struct evdev_dev *evdev; in evdev_alloc() local
100 evdev = malloc(sizeof(struct evdev_dev), M_EVDEV, M_WAITOK | M_ZERO); in evdev_alloc()
101 evdev->ev_cdev_uid = UID_ROOT; in evdev_alloc()
102 evdev->ev_cdev_gid = GID_WHEEL; in evdev_alloc()
103 evdev->ev_cdev_mode = S_IRUSR | S_IWUSR; in evdev_alloc()
105 return (evdev); in evdev_alloc()
109 evdev_free(struct evdev_dev *evdev) in evdev_free() argument
112 if (evdev != NULL && evdev->ev_cdev != NULL && in evdev_free()
113 evdev->ev_cdev->si_drv1 != NULL) in evdev_free()
114 evdev_unregister(evdev); in evdev_free()
116 free(evdev, M_EVDEV); in evdev_free()
135 evdev_set_report_size(struct evdev_dev *evdev, size_t report_size) in evdev_set_report_size() argument
141 evdev->ev_report_size = report_size; in evdev_set_report_size()
146 evdev_estimate_report_size(struct evdev_dev *evdev) in evdev_estimate_report_size() argument
155 bit_ffs_at(evdev->ev_key_flags, KEY_OK, KEY_CNT - KEY_OK, &res); in evdev_estimate_report_size()
157 bit_ffs(evdev->ev_key_flags, BTN_MISC, &res); in evdev_estimate_report_size()
159 bit_count(evdev->ev_key_flags, BTN_MISC, KEY_OK - BTN_MISC, &res); in evdev_estimate_report_size()
163 bit_count(evdev->ev_rel_flags, 0, REL_CNT, &res); in evdev_estimate_report_size()
170 if (evdev->ev_absinfo != NULL) { in evdev_estimate_report_size()
171 bit_count(evdev->ev_abs_flags, 0, ABS_CNT, &res); in evdev_estimate_report_size()
173 bit_count(evdev->ev_abs_flags, ABS_MT_FIRST, MT_CNT, &res); in evdev_estimate_report_size()
176 if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_estimate_report_size()
178 size += res * MAXIMAL_MT_SLOT(evdev); in evdev_estimate_report_size()
186 bit_count(evdev->ev_msc_flags, 0, MSC_CNT, &res); in evdev_estimate_report_size()
190 bit_count(evdev->ev_led_flags, 0, LED_CNT, &res); in evdev_estimate_report_size()
194 bit_ffs(evdev->ev_snd_flags, SND_CNT, &res); in evdev_estimate_report_size()
197 bit_ffs(evdev->ev_sw_flags, SW_CNT, &res); in evdev_estimate_report_size()
207 evdev_sysctl_create(struct evdev_dev *evdev) in evdev_sysctl_create() argument
212 snprintf(ev_unit_str, sizeof(ev_unit_str), "%d", evdev->ev_unit); in evdev_sysctl_create()
213 sysctl_ctx_init(&evdev->ev_sysctl_ctx); in evdev_sysctl_create()
215 ev_sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
220 SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
222 evdev->ev_name, 0, in evdev_sysctl_create()
225 SYSCTL_ADD_STRUCT(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
227 &evdev->ev_id, input_id, in evdev_sysctl_create()
231 SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
233 evdev->ev_shortname, 0, in evdev_sysctl_create()
237 SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
239 evdev->ev_serial, 0, in evdev_sysctl_create()
242 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
244 evdev->ev_prop_flags, sizeof(evdev->ev_prop_flags), "", in evdev_sysctl_create()
247 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
249 evdev->ev_type_flags, sizeof(evdev->ev_type_flags), "", in evdev_sysctl_create()
252 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
254 evdev->ev_key_flags, sizeof(evdev->ev_key_flags), in evdev_sysctl_create()
257 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
259 evdev->ev_rel_flags, sizeof(evdev->ev_rel_flags), "", in evdev_sysctl_create()
262 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
264 evdev->ev_abs_flags, sizeof(evdev->ev_abs_flags), "", in evdev_sysctl_create()
267 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
269 evdev->ev_msc_flags, sizeof(evdev->ev_msc_flags), "", in evdev_sysctl_create()
272 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
274 evdev->ev_led_flags, sizeof(evdev->ev_led_flags), "", in evdev_sysctl_create()
277 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
279 evdev->ev_snd_flags, sizeof(evdev->ev_snd_flags), "", in evdev_sysctl_create()
282 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
284 evdev->ev_sw_flags, sizeof(evdev->ev_sw_flags), "", in evdev_sysctl_create()
289 evdev_register_common(struct evdev_dev *evdev) in evdev_register_common() argument
293 debugf(evdev, "%s: registered evdev provider: %s <%s>\n", in evdev_register_common()
294 evdev->ev_shortname, evdev->ev_name, evdev->ev_serial); in evdev_register_common()
297 CK_SLIST_INIT(&evdev->ev_clients); in evdev_register_common()
298 sx_init(&evdev->ev_list_lock, "evsx"); in evdev_register_common()
300 if (evdev_event_supported(evdev, EV_REP) && in evdev_register_common()
301 bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) { in evdev_register_common()
303 callout_init_mtx(&evdev->ev_rep_callout, in evdev_register_common()
304 evdev->ev_state_lock, 0); in evdev_register_common()
306 if (evdev->ev_rep[REP_DELAY] == 0 && in evdev_register_common()
307 evdev->ev_rep[REP_PERIOD] == 0) { in evdev_register_common()
309 evdev->ev_rep[REP_DELAY] = 250; in evdev_register_common()
310 evdev->ev_rep[REP_PERIOD] = 33; in evdev_register_common()
315 if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT) || in evdev_register_common()
316 bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) in evdev_register_common()
317 evdev_mt_init(evdev); in evdev_register_common()
320 if (evdev->ev_report_size == 0) { in evdev_register_common()
321 ret = evdev_set_report_size(evdev, in evdev_register_common()
322 evdev_estimate_report_size(evdev)); in evdev_register_common()
328 ret = evdev_cdev_create(evdev); in evdev_register_common()
333 evdev_sysctl_create(evdev); in evdev_register_common()
337 sx_destroy(&evdev->ev_list_lock); in evdev_register_common()
342 evdev_register(struct evdev_dev *evdev) in evdev_register() argument
346 if (bit_test(evdev->ev_flags, EVDEV_FLAG_EXT_EPOCH)) in evdev_register()
347 evdev->ev_lock_type = EV_LOCK_EXT_EPOCH; in evdev_register()
349 evdev->ev_lock_type = EV_LOCK_INTERNAL; in evdev_register()
350 evdev->ev_state_lock = &evdev->ev_mtx; in evdev_register()
351 mtx_init(&evdev->ev_mtx, "evmtx", NULL, MTX_DEF); in evdev_register()
353 ret = evdev_register_common(evdev); in evdev_register()
355 mtx_destroy(&evdev->ev_mtx); in evdev_register()
361 evdev_register_mtx(struct evdev_dev *evdev, struct mtx *mtx) in evdev_register_mtx() argument
364 evdev->ev_lock_type = EV_LOCK_MTX; in evdev_register_mtx()
365 evdev->ev_state_lock = mtx; in evdev_register_mtx()
366 return (evdev_register_common(evdev)); in evdev_register_mtx()
370 evdev_unregister(struct evdev_dev *evdev) in evdev_unregister() argument
374 debugf(evdev, "%s: unregistered evdev provider: %s\n", in evdev_unregister()
375 evdev->ev_shortname, evdev->ev_name); in evdev_unregister()
377 sysctl_ctx_free(&evdev->ev_sysctl_ctx); in evdev_unregister()
379 EVDEV_LIST_LOCK(evdev); in evdev_unregister()
380 evdev->ev_cdev->si_drv1 = NULL; in evdev_unregister()
382 CK_SLIST_FOREACH_SAFE(client, &evdev->ev_clients, ec_link, tmp) { in evdev_unregister()
384 evdev_dispose_client(evdev, client); in evdev_unregister()
389 EVDEV_LIST_UNLOCK(evdev); in evdev_unregister()
392 ret = evdev_cdev_destroy(evdev); in evdev_unregister()
393 evdev->ev_cdev = NULL; in evdev_unregister()
394 sx_destroy(&evdev->ev_list_lock); in evdev_unregister()
395 if (ret == 0 && evdev->ev_lock_type != EV_LOCK_MTX) in evdev_unregister()
396 mtx_destroy(&evdev->ev_mtx); in evdev_unregister()
398 evdev_free_absinfo(evdev->ev_absinfo); in evdev_unregister()
399 evdev_mt_free(evdev); in evdev_unregister()
405 evdev_set_name(struct evdev_dev *evdev, const char *name) in evdev_set_name() argument
408 snprintf(evdev->ev_name, NAMELEN, "%s", name); in evdev_set_name()
412 evdev_set_id(struct evdev_dev *evdev, uint16_t bustype, uint16_t vendor, in evdev_set_id() argument
416 evdev->ev_id = (struct input_id) { in evdev_set_id()
425 evdev_set_phys(struct evdev_dev *evdev, const char *name) in evdev_set_phys() argument
428 snprintf(evdev->ev_shortname, NAMELEN, "%s", name); in evdev_set_phys()
432 evdev_set_serial(struct evdev_dev *evdev, const char *serial) in evdev_set_serial() argument
435 snprintf(evdev->ev_serial, NAMELEN, "%s", serial); in evdev_set_serial()
439 evdev_set_methods(struct evdev_dev *evdev, void *softc, in evdev_set_methods() argument
443 evdev->ev_methods = methods; in evdev_set_methods()
444 evdev->ev_softc = softc; in evdev_set_methods()
448 evdev_get_softc(struct evdev_dev *evdev) in evdev_get_softc() argument
451 return (evdev->ev_softc); in evdev_get_softc()
455 evdev_support_prop(struct evdev_dev *evdev, uint16_t prop) in evdev_support_prop() argument
459 bit_set(evdev->ev_prop_flags, prop); in evdev_support_prop()
463 evdev_support_event(struct evdev_dev *evdev, uint16_t type) in evdev_support_event() argument
467 bit_set(evdev->ev_type_flags, type); in evdev_support_event()
471 evdev_support_key(struct evdev_dev *evdev, uint16_t code) in evdev_support_key() argument
475 bit_set(evdev->ev_key_flags, code); in evdev_support_key()
479 evdev_support_rel(struct evdev_dev *evdev, uint16_t code) in evdev_support_rel() argument
483 bit_set(evdev->ev_rel_flags, code); in evdev_support_rel()
487 evdev_support_abs(struct evdev_dev *evdev, uint16_t code, int32_t minimum, in evdev_support_abs() argument
502 evdev_set_abs_bit(evdev, code); in evdev_support_abs()
503 evdev_set_absinfo(evdev, code, &absinfo); in evdev_support_abs()
507 evdev_set_abs_bit(struct evdev_dev *evdev, uint16_t code) in evdev_set_abs_bit() argument
511 if (evdev->ev_absinfo == NULL) in evdev_set_abs_bit()
512 evdev->ev_absinfo = evdev_alloc_absinfo(); in evdev_set_abs_bit()
513 bit_set(evdev->ev_abs_flags, code); in evdev_set_abs_bit()
517 evdev_support_msc(struct evdev_dev *evdev, uint16_t code) in evdev_support_msc() argument
521 bit_set(evdev->ev_msc_flags, code); in evdev_support_msc()
526 evdev_support_led(struct evdev_dev *evdev, uint16_t code) in evdev_support_led() argument
530 bit_set(evdev->ev_led_flags, code); in evdev_support_led()
534 evdev_support_snd(struct evdev_dev *evdev, uint16_t code) in evdev_support_snd() argument
538 bit_set(evdev->ev_snd_flags, code); in evdev_support_snd()
542 evdev_support_sw(struct evdev_dev *evdev, uint16_t code) in evdev_support_sw() argument
546 bit_set(evdev->ev_sw_flags, code); in evdev_support_sw()
550 evdev_event_supported(struct evdev_dev *evdev, uint16_t type) in evdev_event_supported() argument
554 return (bit_test(evdev->ev_type_flags, type)); in evdev_event_supported()
558 evdev_set_absinfo(struct evdev_dev *evdev, uint16_t axis, in evdev_set_absinfo() argument
568 if (evdev->ev_absinfo == NULL) in evdev_set_absinfo()
569 evdev->ev_absinfo = evdev_alloc_absinfo(); in evdev_set_absinfo()
572 evdev->ev_absinfo[ABS_MT_SLOT].maximum = absinfo->maximum; in evdev_set_absinfo()
574 memcpy(&evdev->ev_absinfo[axis], absinfo, in evdev_set_absinfo()
579 evdev_set_repeat_params(struct evdev_dev *evdev, uint16_t property, int value) in evdev_set_repeat_params() argument
583 evdev->ev_rep[property] = value; in evdev_set_repeat_params()
587 evdev_set_flag(struct evdev_dev *evdev, uint16_t flag) in evdev_set_flag() argument
591 bit_set(evdev->ev_flags, flag); in evdev_set_flag()
595 evdev_set_cdev_mode(struct evdev_dev *evdev, uid_t uid, gid_t gid, int mode) in evdev_set_cdev_mode() argument
597 evdev->ev_cdev_uid = uid; in evdev_set_cdev_mode()
598 evdev->ev_cdev_gid = gid; in evdev_set_cdev_mode()
599 evdev->ev_cdev_mode = mode; in evdev_set_cdev_mode()
603 evdev_check_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_check_event() argument
611 if (type != EV_SYN && !evdev_event_supported(evdev, type)) in evdev_check_event()
623 if (!bit_test(evdev->ev_key_flags, code)) in evdev_check_event()
630 if (!bit_test(evdev->ev_rel_flags, code)) in evdev_check_event()
637 if (!bit_test(evdev->ev_abs_flags, code)) in evdev_check_event()
640 (value < 0 || value > MAXIMAL_MT_SLOT(evdev))) in evdev_check_event()
642 if (ABS_IS_MT(code) && evdev->ev_mt == NULL && in evdev_check_event()
643 bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_check_event()
650 if (!bit_test(evdev->ev_msc_flags, code)) in evdev_check_event()
657 if (!bit_test(evdev->ev_led_flags, code)) in evdev_check_event()
664 if (!bit_test(evdev->ev_snd_flags, code)) in evdev_check_event()
671 if (!bit_test(evdev->ev_sw_flags, code)) in evdev_check_event()
688 evdev_modify_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_modify_event() argument
693 EVDEV_LOCK_ASSERT(evdev); in evdev_modify_event()
697 if (!evdev_event_supported(evdev, EV_REP)) in evdev_modify_event()
700 if (!bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) { in evdev_modify_event()
702 if (bit_test(evdev->ev_key_states, code) && in evdev_modify_event()
707 if (bit_test(evdev->ev_key_states, code) == !*value && in evdev_modify_event()
708 !CK_SLIST_EMPTY(&evdev->ev_clients)) { in evdev_modify_event()
710 evdev_start_repeat(evdev, code); in evdev_modify_event()
712 evdev_stop_repeat(evdev); in evdev_modify_event()
721 old_value = evdev->ev_absinfo[code].value; in evdev_modify_event()
722 else if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_modify_event()
726 *value = evdev_mt_reassign_id(evdev, in evdev_modify_event()
727 evdev_mt_get_last_slot(evdev), *value); in evdev_modify_event()
730 old_value = evdev_mt_get_value(evdev, in evdev_modify_event()
731 evdev_mt_get_last_slot(evdev), code); in evdev_modify_event()
733 fuzz = evdev->ev_absinfo[code].fuzz; in evdev_modify_event()
749 evdev_sparse_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_sparse_event() argument
754 EVDEV_LOCK_ASSERT(evdev); in evdev_sparse_event()
765 if (bit_test(evdev->ev_key_states, code) == value) in evdev_sparse_event()
767 bit_change(evdev->ev_key_states, code, value); in evdev_sparse_event()
771 if (bit_test(evdev->ev_key_states, code) == 0 || in evdev_sparse_event()
772 !evdev_event_supported(evdev, EV_REP)) in evdev_sparse_event()
782 if (bit_test(evdev->ev_led_states, code) == value) in evdev_sparse_event()
784 bit_change(evdev->ev_led_states, code, value); in evdev_sparse_event()
788 bit_change(evdev->ev_snd_states, code, value); in evdev_sparse_event()
792 if (bit_test(evdev->ev_sw_states, code) == value) in evdev_sparse_event()
794 bit_change(evdev->ev_sw_states, code, value); in evdev_sparse_event()
798 if (evdev->ev_rep[code] == value) in evdev_sparse_event()
800 evdev_set_repeat_params(evdev, code, value); in evdev_sparse_event()
813 evdev_mt_set_last_slot(evdev, value); in evdev_sparse_event()
818 if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_sparse_event()
821 last_mt_slot = evdev_mt_get_last_slot(evdev); in evdev_sparse_event()
822 if (evdev_mt_get_value(evdev, last_mt_slot, code) in evdev_sparse_event()
825 evdev_mt_set_value(evdev, last_mt_slot, code, value); in evdev_sparse_event()
826 if (last_mt_slot != CURRENT_MT_SLOT(evdev)) { in evdev_sparse_event()
827 CURRENT_MT_SLOT(evdev) = last_mt_slot; in evdev_sparse_event()
828 evdev->ev_report_opened = true; in evdev_sparse_event()
834 if (evdev->ev_absinfo[code].value == value) in evdev_sparse_event()
836 evdev->ev_absinfo[code].value = value; in evdev_sparse_event()
843 evdev->ev_report_count++; in evdev_sparse_event()
845 if (!evdev->ev_report_opened) in evdev_sparse_event()
847 evdev->ev_report_opened = false; in evdev_sparse_event()
853 evdev->ev_report_opened = true; in evdev_sparse_event()
858 evdev_propagate_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_propagate_event() argument
864 debugf(evdev, "%s pushed event %d/%d/%d", in evdev_propagate_event()
865 evdev->ev_shortname, type, code, value); in evdev_propagate_event()
867 EVDEV_LOCK_ASSERT(evdev); in evdev_propagate_event()
870 if (evdev->ev_lock_type == EV_LOCK_INTERNAL) in evdev_propagate_event()
874 evdev->ev_lock_type == EV_LOCK_MTX || in_epoch(INPUT_EPOCH) != 0, in evdev_propagate_event()
877 CK_SLIST_FOREACH(client, &evdev->ev_clients, ec_link) { in evdev_propagate_event()
878 if (evdev->ev_grabber != NULL && evdev->ev_grabber != client) in evdev_propagate_event()
887 if (evdev->ev_lock_type == EV_LOCK_INTERNAL) in evdev_propagate_event()
890 evdev->ev_event_count++; in evdev_propagate_event()
894 evdev_send_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_send_event() argument
899 EVDEV_LOCK_ASSERT(evdev); in evdev_send_event()
901 evdev_modify_event(evdev, type, code, &value); in evdev_send_event()
902 sparse = evdev_sparse_event(evdev, type, code, value); in evdev_send_event()
906 evdev_propagate_event(evdev, EV_ABS, ABS_MT_SLOT, in evdev_send_event()
907 CURRENT_MT_SLOT(evdev)); in evdev_send_event()
910 evdev_propagate_event(evdev, type, code, value); in evdev_send_event()
918 evdev_restore_after_kdb(struct evdev_dev *evdev) in evdev_restore_after_kdb() argument
922 EVDEV_LOCK_ASSERT(evdev); in evdev_restore_after_kdb()
925 bit_foreach(evdev->ev_kdb_led_states, LED_CNT, code) in evdev_restore_after_kdb()
926 evdev_send_event(evdev, EV_LED, code, in evdev_restore_after_kdb()
927 !bit_test(evdev->ev_led_states, code)); in evdev_restore_after_kdb()
928 bit_nclear(evdev->ev_kdb_led_states, 0, LED_MAX); in evdev_restore_after_kdb()
931 evdev_stop_repeat(evdev); in evdev_restore_after_kdb()
932 bit_foreach(evdev->ev_key_states, KEY_CNT, code) in evdev_restore_after_kdb()
933 evdev_send_event(evdev, EV_KEY, code, KEY_EVENT_UP); in evdev_restore_after_kdb()
934 evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1); in evdev_restore_after_kdb()
938 evdev_push_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_push_event() argument
942 if (evdev_check_event(evdev, type, code, value) != 0) in evdev_push_event()
950 evdev->ev_kdb_active = true; in evdev_push_event()
952 bit_set(evdev->ev_kdb_led_states, in evdev_push_event()
953 bit_test(evdev->ev_led_states, code) != value); in evdev_push_event()
957 EVDEV_ENTER(evdev); in evdev_push_event()
960 if (evdev->ev_kdb_active) { in evdev_push_event()
961 evdev->ev_kdb_active = false; in evdev_push_event()
962 evdev_restore_after_kdb(evdev); in evdev_push_event()
966 bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_push_event()
967 evdev_mt_sync_frame(evdev); in evdev_push_event()
969 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK) && in evdev_push_event()
970 evdev_mt_record_event(evdev, type, code, value)) in evdev_push_event()
973 evdev_send_event(evdev, type, code, value); in evdev_push_event()
975 EVDEV_EXIT(evdev); in evdev_push_event()
981 evdev_inject_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_inject_event() argument
990 if (bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) in evdev_inject_event()
997 if (evdev->ev_methods != NULL && in evdev_inject_event()
998 evdev->ev_methods->ev_event != NULL) in evdev_inject_event()
999 evdev->ev_methods->ev_event(evdev, type, code, value); in evdev_inject_event()
1015 if (evdev->ev_lock_type == EV_LOCK_MTX) in evdev_inject_event()
1016 EVDEV_LOCK(evdev); in evdev_inject_event()
1017 else if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_inject_event()
1019 ret = evdev_push_event(evdev, type, code, value); in evdev_inject_event()
1020 if (evdev->ev_lock_type == EV_LOCK_MTX) in evdev_inject_event()
1021 EVDEV_UNLOCK(evdev); in evdev_inject_event()
1022 else if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_inject_event()
1035 evdev_register_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_register_client() argument
1039 debugf(evdev, "adding new client for device %s", evdev->ev_shortname); in evdev_register_client()
1041 EVDEV_LIST_LOCK_ASSERT(evdev); in evdev_register_client()
1043 if (CK_SLIST_EMPTY(&evdev->ev_clients) && evdev->ev_methods != NULL && in evdev_register_client()
1044 evdev->ev_methods->ev_open != NULL) { in evdev_register_client()
1045 debugf(evdev, "calling ev_open() on device %s", in evdev_register_client()
1046 evdev->ev_shortname); in evdev_register_client()
1047 ret = evdev->ev_methods->ev_open(evdev); in evdev_register_client()
1050 CK_SLIST_INSERT_HEAD(&evdev->ev_clients, client, ec_link); in evdev_register_client()
1055 evdev_dispose_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_dispose_client() argument
1057 debugf(evdev, "removing client for device %s", evdev->ev_shortname); in evdev_dispose_client()
1059 EVDEV_LIST_LOCK_ASSERT(evdev); in evdev_dispose_client()
1061 CK_SLIST_REMOVE(&evdev->ev_clients, client, evdev_client, ec_link); in evdev_dispose_client()
1062 if (CK_SLIST_EMPTY(&evdev->ev_clients)) { in evdev_dispose_client()
1063 if (evdev->ev_methods != NULL && in evdev_dispose_client()
1064 evdev->ev_methods->ev_close != NULL) in evdev_dispose_client()
1065 (void)evdev->ev_methods->ev_close(evdev); in evdev_dispose_client()
1066 if (evdev_event_supported(evdev, EV_REP) && in evdev_dispose_client()
1067 bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) { in evdev_dispose_client()
1068 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1069 EVDEV_LOCK(evdev); in evdev_dispose_client()
1070 evdev_stop_repeat(evdev); in evdev_dispose_client()
1071 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1072 EVDEV_UNLOCK(evdev); in evdev_dispose_client()
1075 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1076 EVDEV_LOCK(evdev); in evdev_dispose_client()
1077 evdev_release_client(evdev, client); in evdev_dispose_client()
1078 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1079 EVDEV_UNLOCK(evdev); in evdev_dispose_client()
1083 evdev_grab_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_grab_client() argument
1086 EVDEV_LOCK_ASSERT(evdev); in evdev_grab_client()
1088 if (evdev->ev_grabber != NULL) in evdev_grab_client()
1091 evdev->ev_grabber = client; in evdev_grab_client()
1097 evdev_release_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_release_client() argument
1100 EVDEV_LOCK_ASSERT(evdev); in evdev_release_client()
1102 if (evdev->ev_grabber != client) in evdev_release_client()
1105 evdev->ev_grabber = NULL; in evdev_release_client()
1111 evdev_is_grabbed(struct evdev_dev *evdev) in evdev_is_grabbed() argument
1120 return (evdev->ev_grabber != NULL); in evdev_is_grabbed()
1127 struct evdev_dev *evdev = (struct evdev_dev *)arg; in evdev_repeat_callout() local
1129 if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_repeat_callout()
1131 evdev_send_event(evdev, EV_KEY, evdev->ev_rep_key, KEY_EVENT_REPEAT); in evdev_repeat_callout()
1132 evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1); in evdev_repeat_callout()
1133 if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_repeat_callout()
1136 if (evdev->ev_rep[REP_PERIOD]) in evdev_repeat_callout()
1137 callout_reset(&evdev->ev_rep_callout, in evdev_repeat_callout()
1138 evdev->ev_rep[REP_PERIOD] * hz / 1000, in evdev_repeat_callout()
1139 evdev_repeat_callout, evdev); in evdev_repeat_callout()
1141 evdev->ev_rep_key = KEY_RESERVED; in evdev_repeat_callout()
1145 evdev_start_repeat(struct evdev_dev *evdev, uint16_t key) in evdev_start_repeat() argument
1148 EVDEV_LOCK_ASSERT(evdev); in evdev_start_repeat()
1150 if (evdev->ev_rep[REP_DELAY]) { in evdev_start_repeat()
1151 evdev->ev_rep_key = key; in evdev_start_repeat()
1152 callout_reset(&evdev->ev_rep_callout, in evdev_start_repeat()
1153 evdev->ev_rep[REP_DELAY] * hz / 1000, in evdev_start_repeat()
1154 evdev_repeat_callout, evdev); in evdev_start_repeat()
1159 evdev_stop_repeat(struct evdev_dev *evdev) in evdev_stop_repeat() argument
1162 EVDEV_LOCK_ASSERT(evdev); in evdev_stop_repeat()
1164 if (evdev->ev_rep_key != KEY_RESERVED) { in evdev_stop_repeat()
1165 callout_stop(&evdev->ev_rep_callout); in evdev_stop_repeat()
1166 evdev->ev_rep_key = KEY_RESERVED; in evdev_stop_repeat()
1170 MODULE_VERSION(evdev, 1);