Lines Matching refs:evdev

51 #define	debugf(evdev, fmt, args...)	printf("evdev: " fmt "\n", ##args)  argument
53 #define debugf(evdev, fmt, args...) argument
57 FEATURE(evdev, "Input event devices support");
80 SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
104 evdev_free(struct evdev_dev *evdev) in evdev_free() argument
107 if (evdev != NULL && evdev->ev_cdev != NULL && in evdev_free()
108 evdev->ev_cdev->si_drv1 != NULL) in evdev_free()
109 evdev_unregister(evdev); in evdev_free()
111 free(evdev, M_EVDEV); in evdev_free()
130 evdev_set_report_size(struct evdev_dev *evdev, size_t report_size) in evdev_set_report_size() argument
136 evdev->ev_report_size = report_size; in evdev_set_report_size()
141 evdev_estimate_report_size(struct evdev_dev *evdev) in evdev_estimate_report_size() argument
150 bit_ffs_at(evdev->ev_key_flags, KEY_OK, KEY_CNT - KEY_OK, &res); in evdev_estimate_report_size()
152 bit_ffs(evdev->ev_key_flags, BTN_MISC, &res); in evdev_estimate_report_size()
154 bit_count(evdev->ev_key_flags, BTN_MISC, KEY_OK - BTN_MISC, &res); in evdev_estimate_report_size()
158 bit_count(evdev->ev_rel_flags, 0, REL_CNT, &res); in evdev_estimate_report_size()
165 if (evdev->ev_absinfo != NULL) { in evdev_estimate_report_size()
166 bit_count(evdev->ev_abs_flags, 0, ABS_CNT, &res); in evdev_estimate_report_size()
168 bit_count(evdev->ev_abs_flags, ABS_MT_FIRST, MT_CNT, &res); in evdev_estimate_report_size()
171 if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_estimate_report_size()
173 size += res * MAXIMAL_MT_SLOT(evdev); in evdev_estimate_report_size()
181 bit_count(evdev->ev_msc_flags, 0, MSC_CNT, &res); in evdev_estimate_report_size()
185 bit_count(evdev->ev_led_flags, 0, LED_CNT, &res); in evdev_estimate_report_size()
189 bit_ffs(evdev->ev_snd_flags, SND_CNT, &res); in evdev_estimate_report_size()
192 bit_ffs(evdev->ev_sw_flags, SW_CNT, &res); in evdev_estimate_report_size()
202 evdev_sysctl_create(struct evdev_dev *evdev) in evdev_sysctl_create() argument
207 snprintf(ev_unit_str, sizeof(ev_unit_str), "%d", evdev->ev_unit); in evdev_sysctl_create()
208 sysctl_ctx_init(&evdev->ev_sysctl_ctx); in evdev_sysctl_create()
210 ev_sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
215 SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
217 evdev->ev_name, 0, in evdev_sysctl_create()
220 SYSCTL_ADD_STRUCT(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
222 &evdev->ev_id, input_id, in evdev_sysctl_create()
226 SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
228 evdev->ev_shortname, 0, in evdev_sysctl_create()
232 SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
234 evdev->ev_serial, 0, in evdev_sysctl_create()
237 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
239 evdev->ev_prop_flags, sizeof(evdev->ev_prop_flags), "", in evdev_sysctl_create()
242 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
244 evdev->ev_type_flags, sizeof(evdev->ev_type_flags), "", in evdev_sysctl_create()
247 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
249 evdev->ev_key_flags, sizeof(evdev->ev_key_flags), in evdev_sysctl_create()
252 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
254 evdev->ev_rel_flags, sizeof(evdev->ev_rel_flags), "", in evdev_sysctl_create()
257 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
259 evdev->ev_abs_flags, sizeof(evdev->ev_abs_flags), "", in evdev_sysctl_create()
262 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
264 evdev->ev_msc_flags, sizeof(evdev->ev_msc_flags), "", in evdev_sysctl_create()
267 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
269 evdev->ev_led_flags, sizeof(evdev->ev_led_flags), "", in evdev_sysctl_create()
272 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
274 evdev->ev_snd_flags, sizeof(evdev->ev_snd_flags), "", in evdev_sysctl_create()
277 SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx, in evdev_sysctl_create()
279 evdev->ev_sw_flags, sizeof(evdev->ev_sw_flags), "", in evdev_sysctl_create()
284 evdev_register_common(struct evdev_dev *evdev) in evdev_register_common() argument
288 debugf(evdev, "%s: registered evdev provider: %s <%s>\n", in evdev_register_common()
289 evdev->ev_shortname, evdev->ev_name, evdev->ev_serial); in evdev_register_common()
292 CK_SLIST_INIT(&evdev->ev_clients); in evdev_register_common()
293 sx_init(&evdev->ev_list_lock, "evsx"); in evdev_register_common()
295 if (evdev_event_supported(evdev, EV_REP) && in evdev_register_common()
296 bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) { in evdev_register_common()
298 callout_init_mtx(&evdev->ev_rep_callout, in evdev_register_common()
299 evdev->ev_state_lock, 0); in evdev_register_common()
301 if (evdev->ev_rep[REP_DELAY] == 0 && in evdev_register_common()
302 evdev->ev_rep[REP_PERIOD] == 0) { in evdev_register_common()
304 evdev->ev_rep[REP_DELAY] = 250; in evdev_register_common()
305 evdev->ev_rep[REP_PERIOD] = 33; in evdev_register_common()
310 if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT) || in evdev_register_common()
311 bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK)) in evdev_register_common()
312 evdev_mt_init(evdev); in evdev_register_common()
315 if (evdev->ev_report_size == 0) { in evdev_register_common()
316 ret = evdev_set_report_size(evdev, in evdev_register_common()
317 evdev_estimate_report_size(evdev)); in evdev_register_common()
323 ret = evdev_cdev_create(evdev); in evdev_register_common()
328 evdev_sysctl_create(evdev); in evdev_register_common()
332 sx_destroy(&evdev->ev_list_lock); in evdev_register_common()
337 evdev_register(struct evdev_dev *evdev) in evdev_register() argument
341 if (bit_test(evdev->ev_flags, EVDEV_FLAG_EXT_EPOCH)) in evdev_register()
342 evdev->ev_lock_type = EV_LOCK_EXT_EPOCH; in evdev_register()
344 evdev->ev_lock_type = EV_LOCK_INTERNAL; in evdev_register()
345 evdev->ev_state_lock = &evdev->ev_mtx; in evdev_register()
346 mtx_init(&evdev->ev_mtx, "evmtx", NULL, MTX_DEF); in evdev_register()
348 ret = evdev_register_common(evdev); in evdev_register()
350 mtx_destroy(&evdev->ev_mtx); in evdev_register()
356 evdev_register_mtx(struct evdev_dev *evdev, struct mtx *mtx) in evdev_register_mtx() argument
359 evdev->ev_lock_type = EV_LOCK_MTX; in evdev_register_mtx()
360 evdev->ev_state_lock = mtx; in evdev_register_mtx()
361 return (evdev_register_common(evdev)); in evdev_register_mtx()
365 evdev_unregister(struct evdev_dev *evdev) in evdev_unregister() argument
369 debugf(evdev, "%s: unregistered evdev provider: %s\n", in evdev_unregister()
370 evdev->ev_shortname, evdev->ev_name); in evdev_unregister()
372 sysctl_ctx_free(&evdev->ev_sysctl_ctx); in evdev_unregister()
374 EVDEV_LIST_LOCK(evdev); in evdev_unregister()
375 evdev->ev_cdev->si_drv1 = NULL; in evdev_unregister()
377 CK_SLIST_FOREACH_SAFE(client, &evdev->ev_clients, ec_link, tmp) { in evdev_unregister()
379 evdev_dispose_client(evdev, client); in evdev_unregister()
384 EVDEV_LIST_UNLOCK(evdev); in evdev_unregister()
387 ret = evdev_cdev_destroy(evdev); in evdev_unregister()
388 evdev->ev_cdev = NULL; in evdev_unregister()
389 sx_destroy(&evdev->ev_list_lock); in evdev_unregister()
390 if (ret == 0 && evdev->ev_lock_type != EV_LOCK_MTX) in evdev_unregister()
391 mtx_destroy(&evdev->ev_mtx); in evdev_unregister()
393 evdev_free_absinfo(evdev->ev_absinfo); in evdev_unregister()
394 evdev_mt_free(evdev); in evdev_unregister()
400 evdev_set_name(struct evdev_dev *evdev, const char *name) in evdev_set_name() argument
403 snprintf(evdev->ev_name, NAMELEN, "%s", name); in evdev_set_name()
407 evdev_set_id(struct evdev_dev *evdev, uint16_t bustype, uint16_t vendor, in evdev_set_id() argument
411 evdev->ev_id = (struct input_id) { in evdev_set_id()
420 evdev_set_phys(struct evdev_dev *evdev, const char *name) in evdev_set_phys() argument
423 snprintf(evdev->ev_shortname, NAMELEN, "%s", name); in evdev_set_phys()
427 evdev_set_serial(struct evdev_dev *evdev, const char *serial) in evdev_set_serial() argument
430 snprintf(evdev->ev_serial, NAMELEN, "%s", serial); in evdev_set_serial()
434 evdev_set_methods(struct evdev_dev *evdev, void *softc, in evdev_set_methods() argument
438 evdev->ev_methods = methods; in evdev_set_methods()
439 evdev->ev_softc = softc; in evdev_set_methods()
443 evdev_get_softc(struct evdev_dev *evdev) in evdev_get_softc() argument
446 return (evdev->ev_softc); in evdev_get_softc()
450 evdev_support_prop(struct evdev_dev *evdev, uint16_t prop) in evdev_support_prop() argument
454 bit_set(evdev->ev_prop_flags, prop); in evdev_support_prop()
458 evdev_support_event(struct evdev_dev *evdev, uint16_t type) in evdev_support_event() argument
462 bit_set(evdev->ev_type_flags, type); in evdev_support_event()
466 evdev_support_key(struct evdev_dev *evdev, uint16_t code) in evdev_support_key() argument
470 bit_set(evdev->ev_key_flags, code); in evdev_support_key()
474 evdev_support_rel(struct evdev_dev *evdev, uint16_t code) in evdev_support_rel() argument
478 bit_set(evdev->ev_rel_flags, code); in evdev_support_rel()
482 evdev_support_abs(struct evdev_dev *evdev, uint16_t code, int32_t minimum, in evdev_support_abs() argument
497 evdev_set_abs_bit(evdev, code); in evdev_support_abs()
498 evdev_set_absinfo(evdev, code, &absinfo); in evdev_support_abs()
502 evdev_set_abs_bit(struct evdev_dev *evdev, uint16_t code) in evdev_set_abs_bit() argument
506 if (evdev->ev_absinfo == NULL) in evdev_set_abs_bit()
507 evdev->ev_absinfo = evdev_alloc_absinfo(); in evdev_set_abs_bit()
508 bit_set(evdev->ev_abs_flags, code); in evdev_set_abs_bit()
512 evdev_support_msc(struct evdev_dev *evdev, uint16_t code) in evdev_support_msc() argument
516 bit_set(evdev->ev_msc_flags, code); in evdev_support_msc()
521 evdev_support_led(struct evdev_dev *evdev, uint16_t code) in evdev_support_led() argument
525 bit_set(evdev->ev_led_flags, code); in evdev_support_led()
529 evdev_support_snd(struct evdev_dev *evdev, uint16_t code) in evdev_support_snd() argument
533 bit_set(evdev->ev_snd_flags, code); in evdev_support_snd()
537 evdev_support_sw(struct evdev_dev *evdev, uint16_t code) in evdev_support_sw() argument
541 bit_set(evdev->ev_sw_flags, code); in evdev_support_sw()
545 evdev_event_supported(struct evdev_dev *evdev, uint16_t type) in evdev_event_supported() argument
549 return (bit_test(evdev->ev_type_flags, type)); in evdev_event_supported()
553 evdev_set_absinfo(struct evdev_dev *evdev, uint16_t axis, in evdev_set_absinfo() argument
563 if (evdev->ev_absinfo == NULL) in evdev_set_absinfo()
564 evdev->ev_absinfo = evdev_alloc_absinfo(); in evdev_set_absinfo()
567 evdev->ev_absinfo[ABS_MT_SLOT].maximum = absinfo->maximum; in evdev_set_absinfo()
569 memcpy(&evdev->ev_absinfo[axis], absinfo, in evdev_set_absinfo()
574 evdev_set_repeat_params(struct evdev_dev *evdev, uint16_t property, int value) in evdev_set_repeat_params() argument
578 evdev->ev_rep[property] = value; in evdev_set_repeat_params()
582 evdev_set_flag(struct evdev_dev *evdev, uint16_t flag) in evdev_set_flag() argument
586 bit_set(evdev->ev_flags, flag); in evdev_set_flag()
590 evdev_check_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_check_event() argument
598 if (type != EV_SYN && !evdev_event_supported(evdev, type)) in evdev_check_event()
610 if (!bit_test(evdev->ev_key_flags, code)) in evdev_check_event()
617 if (!bit_test(evdev->ev_rel_flags, code)) in evdev_check_event()
624 if (!bit_test(evdev->ev_abs_flags, code)) in evdev_check_event()
627 (value < 0 || value > MAXIMAL_MT_SLOT(evdev))) in evdev_check_event()
629 if (ABS_IS_MT(code) && evdev->ev_mt == NULL && in evdev_check_event()
630 bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_check_event()
637 if (!bit_test(evdev->ev_msc_flags, code)) in evdev_check_event()
644 if (!bit_test(evdev->ev_led_flags, code)) in evdev_check_event()
651 if (!bit_test(evdev->ev_snd_flags, code)) in evdev_check_event()
658 if (!bit_test(evdev->ev_sw_flags, code)) in evdev_check_event()
675 evdev_modify_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_modify_event() argument
680 EVDEV_LOCK_ASSERT(evdev); in evdev_modify_event()
684 if (!evdev_event_supported(evdev, EV_REP)) in evdev_modify_event()
687 if (!bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) { in evdev_modify_event()
689 if (bit_test(evdev->ev_key_states, code) && in evdev_modify_event()
694 if (bit_test(evdev->ev_key_states, code) == !*value && in evdev_modify_event()
695 !CK_SLIST_EMPTY(&evdev->ev_clients)) { in evdev_modify_event()
697 evdev_start_repeat(evdev, code); in evdev_modify_event()
699 evdev_stop_repeat(evdev); in evdev_modify_event()
708 old_value = evdev->ev_absinfo[code].value; in evdev_modify_event()
709 else if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_modify_event()
713 *value = evdev_mt_reassign_id(evdev, in evdev_modify_event()
714 evdev_mt_get_last_slot(evdev), *value); in evdev_modify_event()
717 old_value = evdev_mt_get_value(evdev, in evdev_modify_event()
718 evdev_mt_get_last_slot(evdev), code); in evdev_modify_event()
720 fuzz = evdev->ev_absinfo[code].fuzz; in evdev_modify_event()
736 evdev_sparse_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_sparse_event() argument
741 EVDEV_LOCK_ASSERT(evdev); in evdev_sparse_event()
752 if (bit_test(evdev->ev_key_states, code) == value) in evdev_sparse_event()
754 bit_change(evdev->ev_key_states, code, value); in evdev_sparse_event()
758 if (bit_test(evdev->ev_key_states, code) == 0 || in evdev_sparse_event()
759 !evdev_event_supported(evdev, EV_REP)) in evdev_sparse_event()
769 if (bit_test(evdev->ev_led_states, code) == value) in evdev_sparse_event()
771 bit_change(evdev->ev_led_states, code, value); in evdev_sparse_event()
775 bit_change(evdev->ev_snd_states, code, value); in evdev_sparse_event()
779 if (bit_test(evdev->ev_sw_states, code) == value) in evdev_sparse_event()
781 bit_change(evdev->ev_sw_states, code, value); in evdev_sparse_event()
785 if (evdev->ev_rep[code] == value) in evdev_sparse_event()
787 evdev_set_repeat_params(evdev, code, value); in evdev_sparse_event()
800 evdev_mt_set_last_slot(evdev, value); in evdev_sparse_event()
805 if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_sparse_event()
808 last_mt_slot = evdev_mt_get_last_slot(evdev); in evdev_sparse_event()
809 if (evdev_mt_get_value(evdev, last_mt_slot, code) in evdev_sparse_event()
812 evdev_mt_set_value(evdev, last_mt_slot, code, value); in evdev_sparse_event()
813 if (last_mt_slot != CURRENT_MT_SLOT(evdev)) { in evdev_sparse_event()
814 CURRENT_MT_SLOT(evdev) = last_mt_slot; in evdev_sparse_event()
815 evdev->ev_report_opened = true; in evdev_sparse_event()
821 if (evdev->ev_absinfo[code].value == value) in evdev_sparse_event()
823 evdev->ev_absinfo[code].value = value; in evdev_sparse_event()
830 evdev->ev_report_count++; in evdev_sparse_event()
832 if (!evdev->ev_report_opened) in evdev_sparse_event()
834 evdev->ev_report_opened = false; in evdev_sparse_event()
840 evdev->ev_report_opened = true; in evdev_sparse_event()
845 evdev_propagate_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_propagate_event() argument
851 debugf(evdev, "%s pushed event %d/%d/%d", in evdev_propagate_event()
852 evdev->ev_shortname, type, code, value); in evdev_propagate_event()
854 EVDEV_LOCK_ASSERT(evdev); in evdev_propagate_event()
857 if (evdev->ev_lock_type == EV_LOCK_INTERNAL) in evdev_propagate_event()
861 evdev->ev_lock_type == EV_LOCK_MTX || in_epoch(INPUT_EPOCH) != 0, in evdev_propagate_event()
864 CK_SLIST_FOREACH(client, &evdev->ev_clients, ec_link) { in evdev_propagate_event()
865 if (evdev->ev_grabber != NULL && evdev->ev_grabber != client) in evdev_propagate_event()
874 if (evdev->ev_lock_type == EV_LOCK_INTERNAL) in evdev_propagate_event()
877 evdev->ev_event_count++; in evdev_propagate_event()
881 evdev_send_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_send_event() argument
886 EVDEV_LOCK_ASSERT(evdev); in evdev_send_event()
888 evdev_modify_event(evdev, type, code, &value); in evdev_send_event()
889 sparse = evdev_sparse_event(evdev, type, code, value); in evdev_send_event()
893 evdev_propagate_event(evdev, EV_ABS, ABS_MT_SLOT, in evdev_send_event()
894 CURRENT_MT_SLOT(evdev)); in evdev_send_event()
897 evdev_propagate_event(evdev, type, code, value); in evdev_send_event()
905 evdev_restore_after_kdb(struct evdev_dev *evdev) in evdev_restore_after_kdb() argument
909 EVDEV_LOCK_ASSERT(evdev); in evdev_restore_after_kdb()
912 bit_foreach(evdev->ev_kdb_led_states, LED_CNT, code) in evdev_restore_after_kdb()
913 evdev_send_event(evdev, EV_LED, code, in evdev_restore_after_kdb()
914 !bit_test(evdev->ev_led_states, code)); in evdev_restore_after_kdb()
915 bit_nclear(evdev->ev_kdb_led_states, 0, LED_MAX); in evdev_restore_after_kdb()
918 evdev_stop_repeat(evdev); in evdev_restore_after_kdb()
919 bit_foreach(evdev->ev_key_states, KEY_CNT, code) in evdev_restore_after_kdb()
920 evdev_send_event(evdev, EV_KEY, code, KEY_EVENT_UP); in evdev_restore_after_kdb()
921 evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1); in evdev_restore_after_kdb()
925 evdev_push_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_push_event() argument
929 if (evdev_check_event(evdev, type, code, value) != 0) in evdev_push_event()
937 evdev->ev_kdb_active = true; in evdev_push_event()
939 bit_set(evdev->ev_kdb_led_states, in evdev_push_event()
940 bit_test(evdev->ev_led_states, code) != value); in evdev_push_event()
944 EVDEV_ENTER(evdev); in evdev_push_event()
947 if (evdev->ev_kdb_active) { in evdev_push_event()
948 evdev->ev_kdb_active = false; in evdev_push_event()
949 evdev_restore_after_kdb(evdev); in evdev_push_event()
953 bit_test(evdev->ev_abs_flags, ABS_MT_SLOT)) in evdev_push_event()
954 evdev_mt_sync_frame(evdev); in evdev_push_event()
956 if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK) && in evdev_push_event()
957 evdev_mt_record_event(evdev, type, code, value)) in evdev_push_event()
960 evdev_send_event(evdev, type, code, value); in evdev_push_event()
962 EVDEV_EXIT(evdev); in evdev_push_event()
968 evdev_inject_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, in evdev_inject_event() argument
977 if (bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) in evdev_inject_event()
984 if (evdev->ev_methods != NULL && in evdev_inject_event()
985 evdev->ev_methods->ev_event != NULL) in evdev_inject_event()
986 evdev->ev_methods->ev_event(evdev, type, code, value); in evdev_inject_event()
1002 if (evdev->ev_lock_type == EV_LOCK_MTX) in evdev_inject_event()
1003 EVDEV_LOCK(evdev); in evdev_inject_event()
1004 else if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_inject_event()
1006 ret = evdev_push_event(evdev, type, code, value); in evdev_inject_event()
1007 if (evdev->ev_lock_type == EV_LOCK_MTX) in evdev_inject_event()
1008 EVDEV_UNLOCK(evdev); in evdev_inject_event()
1009 else if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_inject_event()
1022 evdev_register_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_register_client() argument
1026 debugf(evdev, "adding new client for device %s", evdev->ev_shortname); in evdev_register_client()
1028 EVDEV_LIST_LOCK_ASSERT(evdev); in evdev_register_client()
1030 if (CK_SLIST_EMPTY(&evdev->ev_clients) && evdev->ev_methods != NULL && in evdev_register_client()
1031 evdev->ev_methods->ev_open != NULL) { in evdev_register_client()
1032 debugf(evdev, "calling ev_open() on device %s", in evdev_register_client()
1033 evdev->ev_shortname); in evdev_register_client()
1034 ret = evdev->ev_methods->ev_open(evdev); in evdev_register_client()
1037 CK_SLIST_INSERT_HEAD(&evdev->ev_clients, client, ec_link); in evdev_register_client()
1042 evdev_dispose_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_dispose_client() argument
1044 debugf(evdev, "removing client for device %s", evdev->ev_shortname); in evdev_dispose_client()
1046 EVDEV_LIST_LOCK_ASSERT(evdev); in evdev_dispose_client()
1048 CK_SLIST_REMOVE(&evdev->ev_clients, client, evdev_client, ec_link); in evdev_dispose_client()
1049 if (CK_SLIST_EMPTY(&evdev->ev_clients)) { in evdev_dispose_client()
1050 if (evdev->ev_methods != NULL && in evdev_dispose_client()
1051 evdev->ev_methods->ev_close != NULL) in evdev_dispose_client()
1052 (void)evdev->ev_methods->ev_close(evdev); in evdev_dispose_client()
1053 if (evdev_event_supported(evdev, EV_REP) && in evdev_dispose_client()
1054 bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) { in evdev_dispose_client()
1055 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1056 EVDEV_LOCK(evdev); in evdev_dispose_client()
1057 evdev_stop_repeat(evdev); in evdev_dispose_client()
1058 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1059 EVDEV_UNLOCK(evdev); in evdev_dispose_client()
1062 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1063 EVDEV_LOCK(evdev); in evdev_dispose_client()
1064 evdev_release_client(evdev, client); in evdev_dispose_client()
1065 if (evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dispose_client()
1066 EVDEV_UNLOCK(evdev); in evdev_dispose_client()
1070 evdev_grab_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_grab_client() argument
1073 EVDEV_LOCK_ASSERT(evdev); in evdev_grab_client()
1075 if (evdev->ev_grabber != NULL) in evdev_grab_client()
1078 evdev->ev_grabber = client; in evdev_grab_client()
1084 evdev_release_client(struct evdev_dev *evdev, struct evdev_client *client) in evdev_release_client() argument
1087 EVDEV_LOCK_ASSERT(evdev); in evdev_release_client()
1089 if (evdev->ev_grabber != client) in evdev_release_client()
1092 evdev->ev_grabber = NULL; in evdev_release_client()
1101 struct evdev_dev *evdev = (struct evdev_dev *)arg; in evdev_repeat_callout() local
1103 if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_repeat_callout()
1105 evdev_send_event(evdev, EV_KEY, evdev->ev_rep_key, KEY_EVENT_REPEAT); in evdev_repeat_callout()
1106 evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1); in evdev_repeat_callout()
1107 if (evdev->ev_lock_type == EV_LOCK_EXT_EPOCH) in evdev_repeat_callout()
1110 if (evdev->ev_rep[REP_PERIOD]) in evdev_repeat_callout()
1111 callout_reset(&evdev->ev_rep_callout, in evdev_repeat_callout()
1112 evdev->ev_rep[REP_PERIOD] * hz / 1000, in evdev_repeat_callout()
1113 evdev_repeat_callout, evdev); in evdev_repeat_callout()
1115 evdev->ev_rep_key = KEY_RESERVED; in evdev_repeat_callout()
1119 evdev_start_repeat(struct evdev_dev *evdev, uint16_t key) in evdev_start_repeat() argument
1122 EVDEV_LOCK_ASSERT(evdev); in evdev_start_repeat()
1124 if (evdev->ev_rep[REP_DELAY]) { in evdev_start_repeat()
1125 evdev->ev_rep_key = key; in evdev_start_repeat()
1126 callout_reset(&evdev->ev_rep_callout, in evdev_start_repeat()
1127 evdev->ev_rep[REP_DELAY] * hz / 1000, in evdev_start_repeat()
1128 evdev_repeat_callout, evdev); in evdev_start_repeat()
1133 evdev_stop_repeat(struct evdev_dev *evdev) in evdev_stop_repeat() argument
1136 EVDEV_LOCK_ASSERT(evdev); in evdev_stop_repeat()
1138 if (evdev->ev_rep_key != KEY_RESERVED) { in evdev_stop_repeat()
1139 callout_stop(&evdev->ev_rep_callout); in evdev_stop_repeat()
1140 evdev->ev_rep_key = KEY_RESERVED; in evdev_stop_repeat()
1144 MODULE_VERSION(evdev, 1);