xref: /dflybsd-src/sys/dev/misc/evdev/evdev.c (revision a162a738eca94f99d45d88429e86cfd0fbfbe95d)
1d3d1dd3eSPeeter Must /*-
2d3d1dd3eSPeeter Must  * Copyright (c) 2014 Jakub Wojciech Klama <jceel@FreeBSD.org>
3d3d1dd3eSPeeter Must  * Copyright (c) 2015-2016 Vladimir Kondratyev <wulf@FreeBSD.org>
4d3d1dd3eSPeeter Must  * All rights reserved.
5d3d1dd3eSPeeter Must  *
6d3d1dd3eSPeeter Must  * Redistribution and use in source and binary forms, with or without
7d3d1dd3eSPeeter Must  * modification, are permitted provided that the following conditions
8d3d1dd3eSPeeter Must  * are met:
9d3d1dd3eSPeeter Must  * 1. Redistributions of source code must retain the above copyright
10d3d1dd3eSPeeter Must  *    notice, this list of conditions and the following disclaimer.
11d3d1dd3eSPeeter Must  * 2. Redistributions in binary form must reproduce the above copyright
12d3d1dd3eSPeeter Must  *    notice, this list of conditions and the following disclaimer in the
13d3d1dd3eSPeeter Must  *    documentation and/or other materials provided with the distribution.
14d3d1dd3eSPeeter Must  *
15d3d1dd3eSPeeter Must  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16d3d1dd3eSPeeter Must  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17d3d1dd3eSPeeter Must  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18d3d1dd3eSPeeter Must  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19d3d1dd3eSPeeter Must  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20d3d1dd3eSPeeter Must  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21d3d1dd3eSPeeter Must  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22d3d1dd3eSPeeter Must  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23d3d1dd3eSPeeter Must  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24d3d1dd3eSPeeter Must  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25d3d1dd3eSPeeter Must  * SUCH DAMAGE.
26d3d1dd3eSPeeter Must  *
27d3d1dd3eSPeeter Must  * $FreeBSD$
28d3d1dd3eSPeeter Must  */
29d3d1dd3eSPeeter Must 
30d3d1dd3eSPeeter Must #include "opt_evdev.h"
31d3d1dd3eSPeeter Must 
32d3d1dd3eSPeeter Must #include <sys/param.h>
33d3d1dd3eSPeeter Must #include <sys/conf.h>
34d3d1dd3eSPeeter Must #include <sys/kernel.h>
35d3d1dd3eSPeeter Must #include <sys/malloc.h>
36d3d1dd3eSPeeter Must #include <sys/module.h>
37d3d1dd3eSPeeter Must #include <sys/sysctl.h>
38d3d1dd3eSPeeter Must #include <sys/systm.h>
39d3d1dd3eSPeeter Must 
40d3d1dd3eSPeeter Must #include <sys/devfs.h>  /* XXX detach driver when client is reading */
41d3d1dd3eSPeeter Must 
42d3d1dd3eSPeeter Must /* Use FreeBSD's bitstring.h locally. */
43d3d1dd3eSPeeter Must #include "freebsd-bitstring.h"
44d3d1dd3eSPeeter Must 
45d3d1dd3eSPeeter Must #include <dev/misc/evdev/evdev.h>
46d3d1dd3eSPeeter Must #include <dev/misc/evdev/evdev_private.h>
47d3d1dd3eSPeeter Must #include <dev/misc/evdev/input.h>
48d3d1dd3eSPeeter Must 
49d3d1dd3eSPeeter Must #ifdef EVDEV_DEBUG
50d3d1dd3eSPeeter Must #define	debugf(evdev, fmt, args...)	kprintf("evdev: " fmt "\n", ##args)
51d3d1dd3eSPeeter Must #else
52d3d1dd3eSPeeter Must #define	debugf(evdev, fmt, args...)
53d3d1dd3eSPeeter Must #endif
54d3d1dd3eSPeeter Must 
55d3d1dd3eSPeeter Must #ifdef FEATURE
56d3d1dd3eSPeeter Must FEATURE(evdev, "Input event devices support");
57*a162a738SMichael Neumann #ifdef EVDEV_SUPPORT
58*a162a738SMichael Neumann FEATURE(evdev_support, "Evdev support in hybrid drivers");
59*a162a738SMichael Neumann #endif
60d3d1dd3eSPeeter Must #endif
61d3d1dd3eSPeeter Must 
62d3d1dd3eSPeeter Must enum evdev_sparse_result
63d3d1dd3eSPeeter Must {
64d3d1dd3eSPeeter Must 	EV_SKIP_EVENT,		/* Event value not changed */
65d3d1dd3eSPeeter Must 	EV_REPORT_EVENT,	/* Event value changed */
66d3d1dd3eSPeeter Must 	EV_REPORT_MT_SLOT,	/* Event value and MT slot number changed */
67d3d1dd3eSPeeter Must };
68d3d1dd3eSPeeter Must 
69d3d1dd3eSPeeter Must MALLOC_DEFINE(M_EVDEV, "evdev", "evdev memory");
70d3d1dd3eSPeeter Must 
7181a8d1dbSMatthew Dillon /*
7281a8d1dbSMatthew Dillon  * By default, to avoid duplicate events (in particular for mouse movement),
7381a8d1dbSMatthew Dillon  * make evdev only collect events from actual hardware devices and not from
7481a8d1dbSMatthew Dillon  * sysmouse or kbdmux.
7581a8d1dbSMatthew Dillon  */
7681a8d1dbSMatthew Dillon #if 0
77d3d1dd3eSPeeter Must int evdev_rcpt_mask = EVDEV_RCPT_SYSMOUSE | EVDEV_RCPT_KBDMUX;
7881a8d1dbSMatthew Dillon #endif
7981a8d1dbSMatthew Dillon int evdev_rcpt_mask = EVDEV_RCPT_HW_MOUSE | EVDEV_RCPT_HW_KBD;
80d3d1dd3eSPeeter Must int evdev_sysmouse_t_axis = 0;
81d3d1dd3eSPeeter Must 
82d3d1dd3eSPeeter Must /*
83d3d1dd3eSPeeter Must  * For the sake of clarity, evdev_rcpt_mask should be properly called
84d3d1dd3eSPeeter Must  * evdev_sender_mask since the drivers (sysmouse, kbdmux, mouse and keyboard
85d3d1dd3eSPeeter Must  * hardware drivers) send events *to* evdev, they do not receive events
86d3d1dd3eSPeeter Must  * *from* evdev. Accordingly, we have changed the description of the sysctl
87d3d1dd3eSPeeter Must  * to "Who sends events", but kept all the variable names so importing
88d3d1dd3eSPeeter Must  * future changes is easier.
89d3d1dd3eSPeeter Must  */
90d3d1dd3eSPeeter Must 
91d3d1dd3eSPeeter Must SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW, 0, "Evdev args");
92*a162a738SMichael Neumann #ifdef EVDEV_SUPPORT
93d3d1dd3eSPeeter Must SYSCTL_INT(_kern_evdev, OID_AUTO, rcpt_mask, CTLFLAG_RW, &evdev_rcpt_mask, 0,
94d3d1dd3eSPeeter Must     "Who sends events: bit0 - sysmouse, bit1 - kbdmux, "
95d3d1dd3eSPeeter Must     "bit2 - mouse hardware, bit3 - keyboard hardware");
96d3d1dd3eSPeeter Must SYSCTL_INT(_kern_evdev, OID_AUTO, sysmouse_t_axis, CTLFLAG_RW,
97d3d1dd3eSPeeter Must     &evdev_sysmouse_t_axis, 0, "Extract T-axis from 0-none, 1-ums, 2-psm");
98*a162a738SMichael Neumann #endif
99*a162a738SMichael Neumann SYSCTL_NODE(_kern_evdev, OID_AUTO, input, CTLFLAG_RD, 0,
100*a162a738SMichael Neumann     "Evdev input devices");
101d3d1dd3eSPeeter Must 
102d3d1dd3eSPeeter Must static void evdev_start_repeat(struct evdev_dev *, uint16_t);
103d3d1dd3eSPeeter Must static void evdev_stop_repeat(struct evdev_dev *);
104d3d1dd3eSPeeter Must static int evdev_check_event(struct evdev_dev *, uint16_t, uint16_t, int32_t);
105d3d1dd3eSPeeter Must 
106d3d1dd3eSPeeter Must struct evdev_dev *
evdev_alloc(void)107d3d1dd3eSPeeter Must evdev_alloc(void)
108d3d1dd3eSPeeter Must {
109d3d1dd3eSPeeter Must 
110d3d1dd3eSPeeter Must 	return kmalloc(sizeof(struct evdev_dev), M_EVDEV, M_WAITOK | M_ZERO);
111d3d1dd3eSPeeter Must }
112d3d1dd3eSPeeter Must 
113d3d1dd3eSPeeter Must void
evdev_free(struct evdev_dev * evdev)114d3d1dd3eSPeeter Must evdev_free(struct evdev_dev *evdev)
115d3d1dd3eSPeeter Must {
116493442f3SMatthew Dillon 	if (evdev) {
117493442f3SMatthew Dillon 		if (evdev->ev_cdev != NULL && evdev->ev_cdev->si_drv1 != NULL)
118d3d1dd3eSPeeter Must 			evdev_unregister(evdev);
119d3d1dd3eSPeeter Must 		kfree(evdev, M_EVDEV);
120d3d1dd3eSPeeter Must 	}
121493442f3SMatthew Dillon }
122d3d1dd3eSPeeter Must 
123d3d1dd3eSPeeter Must static struct input_absinfo *
evdev_alloc_absinfo(void)124d3d1dd3eSPeeter Must evdev_alloc_absinfo(void)
125d3d1dd3eSPeeter Must {
126d3d1dd3eSPeeter Must 
127d3d1dd3eSPeeter Must 	return (kmalloc(sizeof(struct input_absinfo) * ABS_CNT, M_EVDEV,
128d3d1dd3eSPeeter Must 	    M_WAITOK | M_ZERO));
129d3d1dd3eSPeeter Must }
130d3d1dd3eSPeeter Must 
131d3d1dd3eSPeeter Must static void
evdev_free_absinfo(struct input_absinfo * absinfo)132d3d1dd3eSPeeter Must evdev_free_absinfo(struct input_absinfo *absinfo)
133d3d1dd3eSPeeter Must {
134d3d1dd3eSPeeter Must 
135d3d1dd3eSPeeter Must 	kfree(absinfo, M_EVDEV);
136d3d1dd3eSPeeter Must }
137d3d1dd3eSPeeter Must 
138d3d1dd3eSPeeter Must int
evdev_set_report_size(struct evdev_dev * evdev,size_t report_size)139d3d1dd3eSPeeter Must evdev_set_report_size(struct evdev_dev *evdev, size_t report_size)
140d3d1dd3eSPeeter Must {
141d3d1dd3eSPeeter Must 	if (report_size > KEY_CNT + REL_CNT + ABS_CNT + MAX_MT_SLOTS * MT_CNT +
142d3d1dd3eSPeeter Must 	    MSC_CNT + LED_CNT + SND_CNT + SW_CNT + FF_CNT)
143d3d1dd3eSPeeter Must 		return (EINVAL);
144d3d1dd3eSPeeter Must 
145d3d1dd3eSPeeter Must 	evdev->ev_report_size = report_size;
146d3d1dd3eSPeeter Must 	return (0);
147d3d1dd3eSPeeter Must }
148d3d1dd3eSPeeter Must 
149d3d1dd3eSPeeter Must static size_t
evdev_estimate_report_size(struct evdev_dev * evdev)150d3d1dd3eSPeeter Must evdev_estimate_report_size(struct evdev_dev *evdev)
151d3d1dd3eSPeeter Must {
152d3d1dd3eSPeeter Must 	size_t size = 0;
153d3d1dd3eSPeeter Must 	int res;
154d3d1dd3eSPeeter Must 
155d3d1dd3eSPeeter Must 	/*
156d3d1dd3eSPeeter Must 	 * Keyboards generate one event per report but other devices with
157d3d1dd3eSPeeter Must 	 * buttons like mouses can report events simultaneously
158d3d1dd3eSPeeter Must 	 */
159d3d1dd3eSPeeter Must 	bit_ffs_at(evdev->ev_key_flags, KEY_OK, KEY_CNT - KEY_OK, &res);
160d3d1dd3eSPeeter Must 	if (res == -1)
161d3d1dd3eSPeeter Must 		bit_ffs(evdev->ev_key_flags, BTN_MISC, &res);
162d3d1dd3eSPeeter Must 	size += (res != -1);
163d3d1dd3eSPeeter Must 	bit_count(evdev->ev_key_flags, BTN_MISC, KEY_OK - BTN_MISC, &res);
164d3d1dd3eSPeeter Must 	size += res;
165d3d1dd3eSPeeter Must 
166d3d1dd3eSPeeter Must 	/* All relative axes can be reported simultaneously */
167d3d1dd3eSPeeter Must 	bit_count(evdev->ev_rel_flags, 0, REL_CNT, &res);
168d3d1dd3eSPeeter Must 	size += res;
169d3d1dd3eSPeeter Must 
170d3d1dd3eSPeeter Must 	/*
171d3d1dd3eSPeeter Must 	 * All absolute axes can be reported simultaneously.
172d3d1dd3eSPeeter Must 	 * Multitouch axes can be reported ABS_MT_SLOT times
173d3d1dd3eSPeeter Must 	 */
174d3d1dd3eSPeeter Must 	if (evdev->ev_absinfo != NULL) {
175d3d1dd3eSPeeter Must 		bit_count(evdev->ev_abs_flags, 0, ABS_CNT, &res);
176d3d1dd3eSPeeter Must 		size += res;
177d3d1dd3eSPeeter Must 		bit_count(evdev->ev_abs_flags, ABS_MT_FIRST, MT_CNT, &res);
178d3d1dd3eSPeeter Must 		if (res > 0) {
179d3d1dd3eSPeeter Must 			res++;	/* ABS_MT_SLOT or SYN_MT_REPORT */
180d3d1dd3eSPeeter Must 			if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
181d3d1dd3eSPeeter Must 				/* MT type B */
182d3d1dd3eSPeeter Must 				size += res * MAXIMAL_MT_SLOT(evdev);
183d3d1dd3eSPeeter Must 			else
184d3d1dd3eSPeeter Must 				/* MT type A */
185d3d1dd3eSPeeter Must 				size += res * (MAX_MT_REPORTS - 1);
186d3d1dd3eSPeeter Must 		}
187d3d1dd3eSPeeter Must 	}
188d3d1dd3eSPeeter Must 
189d3d1dd3eSPeeter Must 	/* All misc events can be reported simultaneously */
190d3d1dd3eSPeeter Must 	bit_count(evdev->ev_msc_flags, 0, MSC_CNT, &res);
191d3d1dd3eSPeeter Must 	size += res;
192d3d1dd3eSPeeter Must 
193d3d1dd3eSPeeter Must 	/* All leds can be reported simultaneously */
194d3d1dd3eSPeeter Must 	bit_count(evdev->ev_led_flags, 0, LED_CNT, &res);
195d3d1dd3eSPeeter Must 	size += res;
196d3d1dd3eSPeeter Must 
197d3d1dd3eSPeeter Must 	/* Assume other events are generated once per report */
198d3d1dd3eSPeeter Must 	bit_ffs(evdev->ev_snd_flags, SND_CNT, &res);
199d3d1dd3eSPeeter Must 	size += (res != -1);
200d3d1dd3eSPeeter Must 
201d3d1dd3eSPeeter Must 	bit_ffs(evdev->ev_sw_flags, SW_CNT, &res);
202d3d1dd3eSPeeter Must 	size += (res != -1);
203d3d1dd3eSPeeter Must 
204d3d1dd3eSPeeter Must 	/* XXX: FF part is not implemented yet */
205d3d1dd3eSPeeter Must 
206d3d1dd3eSPeeter Must 	size++;		/* SYN_REPORT */
207d3d1dd3eSPeeter Must 	return (size);
208d3d1dd3eSPeeter Must }
209d3d1dd3eSPeeter Must 
210*a162a738SMichael Neumann static void
evdev_sysctl_create(struct evdev_dev * evdev)211*a162a738SMichael Neumann evdev_sysctl_create(struct evdev_dev *evdev)
212*a162a738SMichael Neumann {
213*a162a738SMichael Neumann 	struct sysctl_oid *ev_sysctl_tree;
214*a162a738SMichael Neumann 	char ev_unit_str[8];
215*a162a738SMichael Neumann 
216*a162a738SMichael Neumann 	ksnprintf(ev_unit_str, sizeof(ev_unit_str), "%d", evdev->ev_unit);
217*a162a738SMichael Neumann 	sysctl_ctx_init(&evdev->ev_sysctl_ctx);
218*a162a738SMichael Neumann 
219*a162a738SMichael Neumann 	ev_sysctl_tree = SYSCTL_ADD_NODE(&evdev->ev_sysctl_ctx,
220*a162a738SMichael Neumann 	    SYSCTL_STATIC_CHILDREN(_kern_evdev_input), OID_AUTO,
221*a162a738SMichael Neumann 	    ev_unit_str, CTLFLAG_RD, NULL, "device index");
222*a162a738SMichael Neumann 
223*a162a738SMichael Neumann 	SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx,
224*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "name", CTLFLAG_RD,
225*a162a738SMichael Neumann 	    evdev->ev_name, 0,
226*a162a738SMichael Neumann 	    "Input device name");
227*a162a738SMichael Neumann 
228*a162a738SMichael Neumann 	SYSCTL_ADD_STRUCT(&evdev->ev_sysctl_ctx,
229*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "id", CTLFLAG_RD,
230*a162a738SMichael Neumann 	    &evdev->ev_id, input_id,
231*a162a738SMichael Neumann 	    "Input device identification");
232*a162a738SMichael Neumann 
233*a162a738SMichael Neumann 	/* ioctl returns ENOENT if phys is not set. sysctl returns "" here */
234*a162a738SMichael Neumann 	SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx,
235*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "phys", CTLFLAG_RD,
236*a162a738SMichael Neumann 	    evdev->ev_shortname, 0,
237*a162a738SMichael Neumann 	    "Input device short name");
238*a162a738SMichael Neumann 
239*a162a738SMichael Neumann 	/* ioctl returns ENOENT if uniq is not set. sysctl returns "" here */
240*a162a738SMichael Neumann 	SYSCTL_ADD_STRING(&evdev->ev_sysctl_ctx,
241*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "uniq", CTLFLAG_RD,
242*a162a738SMichael Neumann 	    evdev->ev_serial, 0,
243*a162a738SMichael Neumann 	    "Input device unique number");
244*a162a738SMichael Neumann 
245*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
246*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "props", CTLFLAG_RD,
247*a162a738SMichael Neumann 	    evdev->ev_prop_flags, sizeof(evdev->ev_prop_flags), "",
248*a162a738SMichael Neumann 	    "Input device properties");
249*a162a738SMichael Neumann 
250*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
251*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "type_bits", CTLFLAG_RD,
252*a162a738SMichael Neumann 	    evdev->ev_type_flags, sizeof(evdev->ev_type_flags), "",
253*a162a738SMichael Neumann 	    "Input device supported events types");
254*a162a738SMichael Neumann 
255*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
256*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "key_bits", CTLFLAG_RD,
257*a162a738SMichael Neumann 	    evdev->ev_key_flags, sizeof(evdev->ev_key_flags),
258*a162a738SMichael Neumann 	    "", "Input device supported keys");
259*a162a738SMichael Neumann 
260*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
261*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "rel_bits", CTLFLAG_RD,
262*a162a738SMichael Neumann 	    evdev->ev_rel_flags, sizeof(evdev->ev_rel_flags), "",
263*a162a738SMichael Neumann 	    "Input device supported relative events");
264*a162a738SMichael Neumann 
265*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
266*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "abs_bits", CTLFLAG_RD,
267*a162a738SMichael Neumann 	    evdev->ev_abs_flags, sizeof(evdev->ev_abs_flags), "",
268*a162a738SMichael Neumann 	    "Input device supported absolute events");
269*a162a738SMichael Neumann 
270*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
271*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "msc_bits", CTLFLAG_RD,
272*a162a738SMichael Neumann 	    evdev->ev_msc_flags, sizeof(evdev->ev_msc_flags), "",
273*a162a738SMichael Neumann 	    "Input device supported miscellaneous events");
274*a162a738SMichael Neumann 
275*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
276*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "led_bits", CTLFLAG_RD,
277*a162a738SMichael Neumann 	    evdev->ev_led_flags, sizeof(evdev->ev_led_flags), "",
278*a162a738SMichael Neumann 	    "Input device supported LED events");
279*a162a738SMichael Neumann 
280*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
281*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "snd_bits", CTLFLAG_RD,
282*a162a738SMichael Neumann 	    evdev->ev_snd_flags, sizeof(evdev->ev_snd_flags), "",
283*a162a738SMichael Neumann 	    "Input device supported sound events");
284*a162a738SMichael Neumann 
285*a162a738SMichael Neumann 	SYSCTL_ADD_OPAQUE(&evdev->ev_sysctl_ctx,
286*a162a738SMichael Neumann 	    SYSCTL_CHILDREN(ev_sysctl_tree), OID_AUTO, "sw_bits", CTLFLAG_RD,
287*a162a738SMichael Neumann 	    evdev->ev_sw_flags, sizeof(evdev->ev_sw_flags), "",
288*a162a738SMichael Neumann 	    "Input device supported switch events");
289*a162a738SMichael Neumann }
290*a162a738SMichael Neumann 
291d3d1dd3eSPeeter Must static int
evdev_register_common(struct evdev_dev * evdev)292d3d1dd3eSPeeter Must evdev_register_common(struct evdev_dev *evdev)
293d3d1dd3eSPeeter Must {
294d3d1dd3eSPeeter Must 	int ret;
295d3d1dd3eSPeeter Must 
296d3d1dd3eSPeeter Must 	debugf(evdev, "%s: registered evdev provider: %s <%s>\n",
297d3d1dd3eSPeeter Must 	    evdev->ev_shortname, evdev->ev_name, evdev->ev_serial);
298d3d1dd3eSPeeter Must 
299d3d1dd3eSPeeter Must 	/* Initialize internal structures */
300d3d1dd3eSPeeter Must 	LIST_INIT(&evdev->ev_clients);
301d3d1dd3eSPeeter Must 
302d3d1dd3eSPeeter Must 	if (evdev_event_supported(evdev, EV_REP) &&
303d3d1dd3eSPeeter Must 	    bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) {
304d3d1dd3eSPeeter Must 		/* Initialize callout */
305*a162a738SMichael Neumann 		callout_init_lk(&evdev->ev_rep_callout, evdev->ev_state_lock);
306d3d1dd3eSPeeter Must 
307d3d1dd3eSPeeter Must 		if (evdev->ev_rep[REP_DELAY] == 0 &&
308d3d1dd3eSPeeter Must 		    evdev->ev_rep[REP_PERIOD] == 0) {
309d3d1dd3eSPeeter Must 			/* Supply default values */
310d3d1dd3eSPeeter Must 			evdev->ev_rep[REP_DELAY] = 250;
311d3d1dd3eSPeeter Must 			evdev->ev_rep[REP_PERIOD] = 33;
312d3d1dd3eSPeeter Must 		}
313d3d1dd3eSPeeter Must 	}
314d3d1dd3eSPeeter Must 
315*a162a738SMichael Neumann 	/* Initialize multitouch protocol type B states or A to B converter */
316*a162a738SMichael Neumann 	if (bit_test(evdev->ev_abs_flags, ABS_MT_SLOT) ||
317*a162a738SMichael Neumann 	    bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK))
318d3d1dd3eSPeeter Must 		evdev_mt_init(evdev);
319d3d1dd3eSPeeter Must 
320d3d1dd3eSPeeter Must 	/* Estimate maximum report size */
321d3d1dd3eSPeeter Must 	if (evdev->ev_report_size == 0) {
322d3d1dd3eSPeeter Must 		ret = evdev_set_report_size(evdev,
323d3d1dd3eSPeeter Must 		    evdev_estimate_report_size(evdev));
324d3d1dd3eSPeeter Must 		if (ret != 0)
325d3d1dd3eSPeeter Must 			goto bail_out;
326d3d1dd3eSPeeter Must 	}
327d3d1dd3eSPeeter Must 
328d3d1dd3eSPeeter Must 	/* Create char device node */
329d3d1dd3eSPeeter Must 	ret = evdev_cdev_create(evdev);
330*a162a738SMichael Neumann 	if (ret != 0)
331*a162a738SMichael Neumann 		goto bail_out;
332*a162a738SMichael Neumann 
333*a162a738SMichael Neumann 	/* Create sysctls (for device enumeration without /dev/input access rights) */
334*a162a738SMichael Neumann 	evdev_sysctl_create(evdev);
335*a162a738SMichael Neumann 
336d3d1dd3eSPeeter Must bail_out:
337d3d1dd3eSPeeter Must 	return (ret);
338d3d1dd3eSPeeter Must }
339d3d1dd3eSPeeter Must 
340d3d1dd3eSPeeter Must int
evdev_register(struct evdev_dev * evdev)341d3d1dd3eSPeeter Must evdev_register(struct evdev_dev *evdev)
342d3d1dd3eSPeeter Must {
343d3d1dd3eSPeeter Must 	int ret;
344d3d1dd3eSPeeter Must 
345d3d1dd3eSPeeter Must 	evdev->ev_lock_type = EV_LOCK_INTERNAL;
346*a162a738SMichael Neumann 	evdev->ev_state_lock = &evdev->ev_mtx;
347d3d1dd3eSPeeter Must 	lockinit(&evdev->ev_mtx, "evmtx", 0, 0);
348d3d1dd3eSPeeter Must 
349d3d1dd3eSPeeter Must 	ret = evdev_register_common(evdev);
350d3d1dd3eSPeeter Must 	if (ret != 0)
351d3d1dd3eSPeeter Must 		lockuninit(&evdev->ev_mtx);
352d3d1dd3eSPeeter Must 
353d3d1dd3eSPeeter Must 	return (ret);
354d3d1dd3eSPeeter Must }
355d3d1dd3eSPeeter Must 
356d3d1dd3eSPeeter Must int
evdev_register_mtx(struct evdev_dev * evdev,struct lock * mtx)357d3d1dd3eSPeeter Must evdev_register_mtx(struct evdev_dev *evdev, struct lock *mtx)
358d3d1dd3eSPeeter Must {
359d3d1dd3eSPeeter Must 
360d3d1dd3eSPeeter Must 	evdev->ev_lock_type = EV_LOCK_MTX;
361*a162a738SMichael Neumann 	evdev->ev_state_lock = mtx;
362d3d1dd3eSPeeter Must 	return (evdev_register_common(evdev));
363d3d1dd3eSPeeter Must }
364d3d1dd3eSPeeter Must 
365d3d1dd3eSPeeter Must int
evdev_unregister(struct evdev_dev * evdev)366d3d1dd3eSPeeter Must evdev_unregister(struct evdev_dev *evdev)
367d3d1dd3eSPeeter Must {
368*a162a738SMichael Neumann 	struct evdev_client *client, *tmp;
369d3d1dd3eSPeeter Must 	int ret;
370d3d1dd3eSPeeter Must 	debugf(evdev, "%s: unregistered evdev provider: %s\n",
371d3d1dd3eSPeeter Must 	    evdev->ev_shortname, evdev->ev_name);
372d3d1dd3eSPeeter Must 
373*a162a738SMichael Neumann 	sysctl_ctx_free(&evdev->ev_sysctl_ctx);
374*a162a738SMichael Neumann 
375d3d1dd3eSPeeter Must 	EVDEV_LOCK(evdev);
376d3d1dd3eSPeeter Must 	evdev->ev_cdev->si_drv1 = NULL;
377d3d1dd3eSPeeter Must 	/* Wake up sleepers */
378*a162a738SMichael Neumann 	LIST_FOREACH_MUTABLE(client, &evdev->ev_clients, ec_link, tmp) {
379d3d1dd3eSPeeter Must 		evdev_revoke_client(client);
380d3d1dd3eSPeeter Must 		evdev_dispose_client(evdev, client);
381d3d1dd3eSPeeter Must 		EVDEV_CLIENT_LOCKQ(client);
382d3d1dd3eSPeeter Must 		evdev_notify_event(client);
383d3d1dd3eSPeeter Must 		EVDEV_CLIENT_UNLOCKQ(client);
384d3d1dd3eSPeeter Must 		if (evdev->ev_cdev) {
385d3d1dd3eSPeeter Must 			devfs_assume_knotes(evdev->ev_cdev, &client->kqinfo);
386d3d1dd3eSPeeter Must 		}
387d3d1dd3eSPeeter Must 	}
388d3d1dd3eSPeeter Must 	EVDEV_UNLOCK(evdev);
389d3d1dd3eSPeeter Must 
390d3d1dd3eSPeeter Must 	ret = evdev_cdev_destroy(evdev);
391d3d1dd3eSPeeter Must 	evdev->ev_cdev = NULL;
392d3d1dd3eSPeeter Must 	if (ret == 0 && evdev->ev_lock_type == EV_LOCK_INTERNAL) {
393d3d1dd3eSPeeter Must 		lockuninit(&evdev->ev_mtx);
394d3d1dd3eSPeeter Must 	}
395d3d1dd3eSPeeter Must 
396d3d1dd3eSPeeter Must 	/*
397d3d1dd3eSPeeter Must 	 * For some devices, e.g. keyboards, ev_absinfo and ev_mt
398d3d1dd3eSPeeter Must 	 * may be NULL, so check before freeing them.
399d3d1dd3eSPeeter Must 	 */
400d3d1dd3eSPeeter Must 	if (evdev->ev_absinfo != NULL)
401d3d1dd3eSPeeter Must 	    evdev_free_absinfo(evdev->ev_absinfo);
402d3d1dd3eSPeeter Must 	if (evdev->ev_mt != NULL)
403d3d1dd3eSPeeter Must 	    evdev_mt_free(evdev);
404d3d1dd3eSPeeter Must 
405d3d1dd3eSPeeter Must 	return (ret);
406d3d1dd3eSPeeter Must }
407d3d1dd3eSPeeter Must 
408d3d1dd3eSPeeter Must inline void
evdev_set_name(struct evdev_dev * evdev,const char * name)409d3d1dd3eSPeeter Must evdev_set_name(struct evdev_dev *evdev, const char *name)
410d3d1dd3eSPeeter Must {
411d3d1dd3eSPeeter Must 
412d3d1dd3eSPeeter Must 	ksnprintf(evdev->ev_name, NAMELEN, "%s", name);
413d3d1dd3eSPeeter Must }
414d3d1dd3eSPeeter Must 
415d3d1dd3eSPeeter Must inline void
evdev_set_id(struct evdev_dev * evdev,uint16_t bustype,uint16_t vendor,uint16_t product,uint16_t version)416d3d1dd3eSPeeter Must evdev_set_id(struct evdev_dev *evdev, uint16_t bustype, uint16_t vendor,
417d3d1dd3eSPeeter Must     uint16_t product, uint16_t version)
418d3d1dd3eSPeeter Must {
419d3d1dd3eSPeeter Must 
420d3d1dd3eSPeeter Must 	evdev->ev_id = (struct input_id) {
421d3d1dd3eSPeeter Must 		.bustype = bustype,
422d3d1dd3eSPeeter Must 		.vendor = vendor,
423d3d1dd3eSPeeter Must 		.product = product,
424d3d1dd3eSPeeter Must 		.version = version
425d3d1dd3eSPeeter Must 	};
426d3d1dd3eSPeeter Must }
427d3d1dd3eSPeeter Must 
428d3d1dd3eSPeeter Must inline void
evdev_set_phys(struct evdev_dev * evdev,const char * name)429d3d1dd3eSPeeter Must evdev_set_phys(struct evdev_dev *evdev, const char *name)
430d3d1dd3eSPeeter Must {
431d3d1dd3eSPeeter Must 
432d3d1dd3eSPeeter Must 	ksnprintf(evdev->ev_shortname, NAMELEN, "%s", name);
433d3d1dd3eSPeeter Must }
434d3d1dd3eSPeeter Must 
435d3d1dd3eSPeeter Must inline void
evdev_set_serial(struct evdev_dev * evdev,const char * serial)436d3d1dd3eSPeeter Must evdev_set_serial(struct evdev_dev *evdev, const char *serial)
437d3d1dd3eSPeeter Must {
438d3d1dd3eSPeeter Must 
439d3d1dd3eSPeeter Must 	ksnprintf(evdev->ev_serial, NAMELEN, "%s", serial);
440d3d1dd3eSPeeter Must }
441d3d1dd3eSPeeter Must 
442d3d1dd3eSPeeter Must inline void
evdev_set_methods(struct evdev_dev * evdev,void * softc,const struct evdev_methods * methods)443d3d1dd3eSPeeter Must evdev_set_methods(struct evdev_dev *evdev, void *softc,
444d3d1dd3eSPeeter Must     const struct evdev_methods *methods)
445d3d1dd3eSPeeter Must {
446d3d1dd3eSPeeter Must 
447d3d1dd3eSPeeter Must 	evdev->ev_methods = methods;
448d3d1dd3eSPeeter Must 	evdev->ev_softc = softc;
449d3d1dd3eSPeeter Must }
450d3d1dd3eSPeeter Must 
451*a162a738SMichael Neumann inline void *
evdev_get_softc(struct evdev_dev * evdev)452*a162a738SMichael Neumann evdev_get_softc(struct evdev_dev *evdev)
453*a162a738SMichael Neumann {
454*a162a738SMichael Neumann 
455*a162a738SMichael Neumann 	return (evdev->ev_softc);
456*a162a738SMichael Neumann }
457*a162a738SMichael Neumann 
458d3d1dd3eSPeeter Must inline void
evdev_support_prop(struct evdev_dev * evdev,uint16_t prop)459d3d1dd3eSPeeter Must evdev_support_prop(struct evdev_dev *evdev, uint16_t prop)
460d3d1dd3eSPeeter Must {
461d3d1dd3eSPeeter Must 
462d3d1dd3eSPeeter Must 	KASSERT(prop < INPUT_PROP_CNT, ("invalid evdev input property"));
463d3d1dd3eSPeeter Must 	bit_set(evdev->ev_prop_flags, prop);
464d3d1dd3eSPeeter Must }
465d3d1dd3eSPeeter Must 
466d3d1dd3eSPeeter Must inline void
evdev_support_event(struct evdev_dev * evdev,uint16_t type)467d3d1dd3eSPeeter Must evdev_support_event(struct evdev_dev *evdev, uint16_t type)
468d3d1dd3eSPeeter Must {
469d3d1dd3eSPeeter Must 
470d3d1dd3eSPeeter Must 	KASSERT(type < EV_CNT, ("invalid evdev event property"));
471d3d1dd3eSPeeter Must 	bit_set(evdev->ev_type_flags, type);
472d3d1dd3eSPeeter Must }
473d3d1dd3eSPeeter Must 
474d3d1dd3eSPeeter Must inline void
evdev_support_key(struct evdev_dev * evdev,uint16_t code)475d3d1dd3eSPeeter Must evdev_support_key(struct evdev_dev *evdev, uint16_t code)
476d3d1dd3eSPeeter Must {
477d3d1dd3eSPeeter Must 
478d3d1dd3eSPeeter Must 	KASSERT(code < KEY_CNT, ("invalid evdev key property"));
479d3d1dd3eSPeeter Must 	bit_set(evdev->ev_key_flags, code);
480d3d1dd3eSPeeter Must }
481d3d1dd3eSPeeter Must 
482d3d1dd3eSPeeter Must inline void
evdev_support_rel(struct evdev_dev * evdev,uint16_t code)483d3d1dd3eSPeeter Must evdev_support_rel(struct evdev_dev *evdev, uint16_t code)
484d3d1dd3eSPeeter Must {
485d3d1dd3eSPeeter Must 
486d3d1dd3eSPeeter Must 	KASSERT(code < REL_CNT, ("invalid evdev rel property"));
487d3d1dd3eSPeeter Must 	bit_set(evdev->ev_rel_flags, code);
488d3d1dd3eSPeeter Must }
489d3d1dd3eSPeeter Must 
490d3d1dd3eSPeeter Must inline void
evdev_support_abs(struct evdev_dev * evdev,uint16_t code,int32_t minimum,int32_t maximum,int32_t fuzz,int32_t flat,int32_t resolution)491*a162a738SMichael Neumann evdev_support_abs(struct evdev_dev *evdev, uint16_t code, int32_t minimum,
492*a162a738SMichael Neumann     int32_t maximum, int32_t fuzz, int32_t flat, int32_t resolution)
493d3d1dd3eSPeeter Must {
494d3d1dd3eSPeeter Must 	struct input_absinfo absinfo;
495d3d1dd3eSPeeter Must 
496d3d1dd3eSPeeter Must 	KASSERT(code < ABS_CNT, ("invalid evdev abs property"));
497d3d1dd3eSPeeter Must 
498d3d1dd3eSPeeter Must 	absinfo = (struct input_absinfo) {
499*a162a738SMichael Neumann 		.value = 0,
500d3d1dd3eSPeeter Must 		.minimum = minimum,
501d3d1dd3eSPeeter Must 		.maximum = maximum,
502d3d1dd3eSPeeter Must 		.fuzz = fuzz,
503d3d1dd3eSPeeter Must 		.flat = flat,
504d3d1dd3eSPeeter Must 		.resolution = resolution,
505d3d1dd3eSPeeter Must 	};
506d3d1dd3eSPeeter Must 	evdev_set_abs_bit(evdev, code);
507d3d1dd3eSPeeter Must 	evdev_set_absinfo(evdev, code, &absinfo);
508d3d1dd3eSPeeter Must }
509d3d1dd3eSPeeter Must 
510d3d1dd3eSPeeter Must inline void
evdev_set_abs_bit(struct evdev_dev * evdev,uint16_t code)511d3d1dd3eSPeeter Must evdev_set_abs_bit(struct evdev_dev *evdev, uint16_t code)
512d3d1dd3eSPeeter Must {
513d3d1dd3eSPeeter Must 
514d3d1dd3eSPeeter Must 	KASSERT(code < ABS_CNT, ("invalid evdev abs property"));
515d3d1dd3eSPeeter Must 	if (evdev->ev_absinfo == NULL)
516d3d1dd3eSPeeter Must 		evdev->ev_absinfo = evdev_alloc_absinfo();
517d3d1dd3eSPeeter Must 	bit_set(evdev->ev_abs_flags, code);
518d3d1dd3eSPeeter Must }
519d3d1dd3eSPeeter Must 
520d3d1dd3eSPeeter Must inline void
evdev_support_msc(struct evdev_dev * evdev,uint16_t code)521d3d1dd3eSPeeter Must evdev_support_msc(struct evdev_dev *evdev, uint16_t code)
522d3d1dd3eSPeeter Must {
523d3d1dd3eSPeeter Must 
524d3d1dd3eSPeeter Must 	KASSERT(code < MSC_CNT, ("invalid evdev msc property"));
525d3d1dd3eSPeeter Must 	bit_set(evdev->ev_msc_flags, code);
526d3d1dd3eSPeeter Must }
527d3d1dd3eSPeeter Must 
528d3d1dd3eSPeeter Must 
529d3d1dd3eSPeeter Must inline void
evdev_support_led(struct evdev_dev * evdev,uint16_t code)530d3d1dd3eSPeeter Must evdev_support_led(struct evdev_dev *evdev, uint16_t code)
531d3d1dd3eSPeeter Must {
532d3d1dd3eSPeeter Must 
533d3d1dd3eSPeeter Must 	KASSERT(code < LED_CNT, ("invalid evdev led property"));
534d3d1dd3eSPeeter Must 	bit_set(evdev->ev_led_flags, code);
535d3d1dd3eSPeeter Must }
536d3d1dd3eSPeeter Must 
537d3d1dd3eSPeeter Must inline void
evdev_support_snd(struct evdev_dev * evdev,uint16_t code)538d3d1dd3eSPeeter Must evdev_support_snd(struct evdev_dev *evdev, uint16_t code)
539d3d1dd3eSPeeter Must {
540d3d1dd3eSPeeter Must 
541d3d1dd3eSPeeter Must 	KASSERT(code < SND_CNT, ("invalid evdev snd property"));
542d3d1dd3eSPeeter Must 	bit_set(evdev->ev_snd_flags, code);
543d3d1dd3eSPeeter Must }
544d3d1dd3eSPeeter Must 
545d3d1dd3eSPeeter Must inline void
evdev_support_sw(struct evdev_dev * evdev,uint16_t code)546d3d1dd3eSPeeter Must evdev_support_sw(struct evdev_dev *evdev, uint16_t code)
547d3d1dd3eSPeeter Must {
548d3d1dd3eSPeeter Must 
549d3d1dd3eSPeeter Must 	KASSERT(code < SW_CNT, ("invalid evdev sw property"));
550d3d1dd3eSPeeter Must 	bit_set(evdev->ev_sw_flags, code);
551d3d1dd3eSPeeter Must }
552d3d1dd3eSPeeter Must 
553d3d1dd3eSPeeter Must bool
evdev_event_supported(struct evdev_dev * evdev,uint16_t type)554d3d1dd3eSPeeter Must evdev_event_supported(struct evdev_dev *evdev, uint16_t type)
555d3d1dd3eSPeeter Must {
556d3d1dd3eSPeeter Must 
557d3d1dd3eSPeeter Must 	KASSERT(type < EV_CNT, ("invalid evdev event property"));
558d3d1dd3eSPeeter Must 	return (bit_test(evdev->ev_type_flags, type));
559d3d1dd3eSPeeter Must }
560d3d1dd3eSPeeter Must 
561d3d1dd3eSPeeter Must inline void
evdev_set_absinfo(struct evdev_dev * evdev,uint16_t axis,struct input_absinfo * absinfo)562d3d1dd3eSPeeter Must evdev_set_absinfo(struct evdev_dev *evdev, uint16_t axis,
563d3d1dd3eSPeeter Must     struct input_absinfo *absinfo)
564d3d1dd3eSPeeter Must {
565d3d1dd3eSPeeter Must 
566d3d1dd3eSPeeter Must 	KASSERT(axis < ABS_CNT, ("invalid evdev abs property"));
567d3d1dd3eSPeeter Must 
568d3d1dd3eSPeeter Must 	if (axis == ABS_MT_SLOT &&
569d3d1dd3eSPeeter Must 	    (absinfo->maximum < 1 || absinfo->maximum >= MAX_MT_SLOTS))
570d3d1dd3eSPeeter Must 		return;
571d3d1dd3eSPeeter Must 
572d3d1dd3eSPeeter Must 	if (evdev->ev_absinfo == NULL)
573d3d1dd3eSPeeter Must 		evdev->ev_absinfo = evdev_alloc_absinfo();
574d3d1dd3eSPeeter Must 
575d3d1dd3eSPeeter Must 	if (axis == ABS_MT_SLOT)
576d3d1dd3eSPeeter Must 		evdev->ev_absinfo[ABS_MT_SLOT].maximum = absinfo->maximum;
577d3d1dd3eSPeeter Must 	else
578d3d1dd3eSPeeter Must 		memcpy(&evdev->ev_absinfo[axis], absinfo,
579d3d1dd3eSPeeter Must 		    sizeof(struct input_absinfo));
580d3d1dd3eSPeeter Must }
581d3d1dd3eSPeeter Must 
582d3d1dd3eSPeeter Must inline void
evdev_set_repeat_params(struct evdev_dev * evdev,uint16_t property,int value)583d3d1dd3eSPeeter Must evdev_set_repeat_params(struct evdev_dev *evdev, uint16_t property, int value)
584d3d1dd3eSPeeter Must {
585d3d1dd3eSPeeter Must 
586d3d1dd3eSPeeter Must 	KASSERT(property < REP_CNT, ("invalid evdev repeat property"));
587d3d1dd3eSPeeter Must 	evdev->ev_rep[property] = value;
588d3d1dd3eSPeeter Must }
589d3d1dd3eSPeeter Must 
590d3d1dd3eSPeeter Must inline void
evdev_set_flag(struct evdev_dev * evdev,uint16_t flag)591d3d1dd3eSPeeter Must evdev_set_flag(struct evdev_dev *evdev, uint16_t flag)
592d3d1dd3eSPeeter Must {
593d3d1dd3eSPeeter Must 
594d3d1dd3eSPeeter Must 	KASSERT(flag < EVDEV_FLAG_CNT, ("invalid evdev flag property"));
595d3d1dd3eSPeeter Must 	bit_set(evdev->ev_flags, flag);
596d3d1dd3eSPeeter Must }
597d3d1dd3eSPeeter Must 
598d3d1dd3eSPeeter Must static int
evdev_check_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t value)599d3d1dd3eSPeeter Must evdev_check_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
600d3d1dd3eSPeeter Must     int32_t value)
601d3d1dd3eSPeeter Must {
602d3d1dd3eSPeeter Must 
603d3d1dd3eSPeeter Must 	if (type >= EV_CNT)
604d3d1dd3eSPeeter Must 		return (EINVAL);
605d3d1dd3eSPeeter Must 
606d3d1dd3eSPeeter Must 	/* Allow SYN events implicitly */
607d3d1dd3eSPeeter Must 	if (type != EV_SYN && !evdev_event_supported(evdev, type))
608d3d1dd3eSPeeter Must 		return (EINVAL);
609d3d1dd3eSPeeter Must 
610d3d1dd3eSPeeter Must 	switch (type) {
611d3d1dd3eSPeeter Must 	case EV_SYN:
612d3d1dd3eSPeeter Must 		if (code >= SYN_CNT)
613d3d1dd3eSPeeter Must 			return (EINVAL);
614d3d1dd3eSPeeter Must 		break;
615d3d1dd3eSPeeter Must 
616d3d1dd3eSPeeter Must 	case EV_KEY:
617d3d1dd3eSPeeter Must 		if (code >= KEY_CNT)
618d3d1dd3eSPeeter Must 			return (EINVAL);
619d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_key_flags, code))
620d3d1dd3eSPeeter Must 			return (EINVAL);
621d3d1dd3eSPeeter Must 		break;
622d3d1dd3eSPeeter Must 
623d3d1dd3eSPeeter Must 	case EV_REL:
624d3d1dd3eSPeeter Must 		if (code >= REL_CNT)
625d3d1dd3eSPeeter Must 			return (EINVAL);
626d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_rel_flags, code))
627d3d1dd3eSPeeter Must 			return (EINVAL);
628d3d1dd3eSPeeter Must 		break;
629d3d1dd3eSPeeter Must 
630d3d1dd3eSPeeter Must 	case EV_ABS:
631d3d1dd3eSPeeter Must 		if (code >= ABS_CNT)
632d3d1dd3eSPeeter Must 			return (EINVAL);
633d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_abs_flags, code))
634d3d1dd3eSPeeter Must 			return (EINVAL);
635d3d1dd3eSPeeter Must 		if (code == ABS_MT_SLOT &&
636d3d1dd3eSPeeter Must 		    (value < 0 || value > MAXIMAL_MT_SLOT(evdev)))
637d3d1dd3eSPeeter Must 			return (EINVAL);
638d3d1dd3eSPeeter Must 		if (ABS_IS_MT(code) && evdev->ev_mt == NULL &&
639d3d1dd3eSPeeter Must 		    bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
640d3d1dd3eSPeeter Must 			return (EINVAL);
641d3d1dd3eSPeeter Must 		break;
642d3d1dd3eSPeeter Must 
643d3d1dd3eSPeeter Must 	case EV_MSC:
644d3d1dd3eSPeeter Must 		if (code >= MSC_CNT)
645d3d1dd3eSPeeter Must 			return (EINVAL);
646d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_msc_flags, code))
647d3d1dd3eSPeeter Must 			return (EINVAL);
648d3d1dd3eSPeeter Must 		break;
649d3d1dd3eSPeeter Must 
650d3d1dd3eSPeeter Must 	case EV_LED:
651d3d1dd3eSPeeter Must 		if (code >= LED_CNT)
652d3d1dd3eSPeeter Must 			return (EINVAL);
653d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_led_flags, code))
654d3d1dd3eSPeeter Must 			return (EINVAL);
655d3d1dd3eSPeeter Must 		break;
656d3d1dd3eSPeeter Must 
657d3d1dd3eSPeeter Must 	case EV_SND:
658d3d1dd3eSPeeter Must 		if (code >= SND_CNT)
659d3d1dd3eSPeeter Must 			return (EINVAL);
660d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_snd_flags, code))
661d3d1dd3eSPeeter Must 			return (EINVAL);
662d3d1dd3eSPeeter Must 		break;
663d3d1dd3eSPeeter Must 
664d3d1dd3eSPeeter Must 	case EV_SW:
665d3d1dd3eSPeeter Must 		if (code >= SW_CNT)
666d3d1dd3eSPeeter Must 			return (EINVAL);
667d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_sw_flags, code))
668d3d1dd3eSPeeter Must 			return (EINVAL);
669d3d1dd3eSPeeter Must 		break;
670d3d1dd3eSPeeter Must 
671d3d1dd3eSPeeter Must 	case EV_REP:
672d3d1dd3eSPeeter Must 		if (code >= REP_CNT)
673d3d1dd3eSPeeter Must 			return (EINVAL);
674d3d1dd3eSPeeter Must 		break;
675d3d1dd3eSPeeter Must 
676d3d1dd3eSPeeter Must 	default:
677d3d1dd3eSPeeter Must 		return (EINVAL);
678d3d1dd3eSPeeter Must 	}
679d3d1dd3eSPeeter Must 
680d3d1dd3eSPeeter Must 	return (0);
681d3d1dd3eSPeeter Must }
682d3d1dd3eSPeeter Must 
683d3d1dd3eSPeeter Must static void
evdev_modify_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t * value)684d3d1dd3eSPeeter Must evdev_modify_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
685d3d1dd3eSPeeter Must     int32_t *value)
686d3d1dd3eSPeeter Must {
687*a162a738SMichael Neumann 	int32_t fuzz, old_value, abs_change;
688d3d1dd3eSPeeter Must 
689d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
690d3d1dd3eSPeeter Must 
691d3d1dd3eSPeeter Must 	switch (type) {
692d3d1dd3eSPeeter Must 	case EV_KEY:
693d3d1dd3eSPeeter Must 		if (!evdev_event_supported(evdev, EV_REP))
694d3d1dd3eSPeeter Must 			break;
695d3d1dd3eSPeeter Must 
696d3d1dd3eSPeeter Must 		if (!bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT)) {
697d3d1dd3eSPeeter Must 			/* Detect driver key repeats. */
698d3d1dd3eSPeeter Must 			if (bit_test(evdev->ev_key_states, code) &&
699d3d1dd3eSPeeter Must 			    *value == KEY_EVENT_DOWN)
700d3d1dd3eSPeeter Must 				*value = KEY_EVENT_REPEAT;
701d3d1dd3eSPeeter Must 		} else {
702d3d1dd3eSPeeter Must 			/* Start/stop callout for evdev repeats */
703*a162a738SMichael Neumann 			if (bit_test(evdev->ev_key_states, code) == !*value &&
704*a162a738SMichael Neumann 			    !LIST_EMPTY(&evdev->ev_clients)) {
705d3d1dd3eSPeeter Must 				if (*value == KEY_EVENT_DOWN)
706d3d1dd3eSPeeter Must 					evdev_start_repeat(evdev, code);
707d3d1dd3eSPeeter Must 				else
708d3d1dd3eSPeeter Must 					evdev_stop_repeat(evdev);
709d3d1dd3eSPeeter Must 			}
710d3d1dd3eSPeeter Must 		}
711d3d1dd3eSPeeter Must 		break;
712d3d1dd3eSPeeter Must 
713d3d1dd3eSPeeter Must 	case EV_ABS:
714*a162a738SMichael Neumann 		if (code == ABS_MT_SLOT)
715*a162a738SMichael Neumann 			break;
716*a162a738SMichael Neumann 		else if (!ABS_IS_MT(code))
717*a162a738SMichael Neumann 			old_value = evdev->ev_absinfo[code].value;
718*a162a738SMichael Neumann 		else if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
719*a162a738SMichael Neumann 			/* Pass MT protocol type A events as is */
720*a162a738SMichael Neumann 			break;
721*a162a738SMichael Neumann 		else if (code == ABS_MT_TRACKING_ID) {
722*a162a738SMichael Neumann 			*value = evdev_mt_reassign_id(evdev,
723*a162a738SMichael Neumann 			    evdev_mt_get_last_slot(evdev), *value);
724*a162a738SMichael Neumann 			break;
725*a162a738SMichael Neumann 		} else
726*a162a738SMichael Neumann 			old_value = evdev_mt_get_value(evdev,
727*a162a738SMichael Neumann 			    evdev_mt_get_last_slot(evdev), code);
728*a162a738SMichael Neumann 
729*a162a738SMichael Neumann 		fuzz = evdev->ev_absinfo[code].fuzz;
730*a162a738SMichael Neumann 		if (fuzz == 0)
731*a162a738SMichael Neumann 			break;
732*a162a738SMichael Neumann 
733*a162a738SMichael Neumann 		abs_change = abs(*value - old_value);
734*a162a738SMichael Neumann 		if (abs_change < fuzz / 2)
735*a162a738SMichael Neumann 			*value = old_value;
736*a162a738SMichael Neumann 		else if (abs_change < fuzz)
737*a162a738SMichael Neumann 			*value = (old_value * 3 + *value) / 4;
738*a162a738SMichael Neumann 		else if (abs_change < fuzz * 2)
739*a162a738SMichael Neumann 			*value = (old_value + *value) / 2;
740d3d1dd3eSPeeter Must 		break;
741d3d1dd3eSPeeter Must 	}
742d3d1dd3eSPeeter Must }
743d3d1dd3eSPeeter Must 
744d3d1dd3eSPeeter Must static enum evdev_sparse_result
evdev_sparse_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t value)745d3d1dd3eSPeeter Must evdev_sparse_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
746d3d1dd3eSPeeter Must     int32_t value)
747d3d1dd3eSPeeter Must {
748d3d1dd3eSPeeter Must 	int32_t last_mt_slot;
749d3d1dd3eSPeeter Must 
750d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
751d3d1dd3eSPeeter Must 
752d3d1dd3eSPeeter Must 	/*
753d3d1dd3eSPeeter Must 	 * For certain event types, update device state bits
754d3d1dd3eSPeeter Must 	 * and convert level reporting to edge reporting
755d3d1dd3eSPeeter Must 	 */
756d3d1dd3eSPeeter Must 	switch (type) {
757d3d1dd3eSPeeter Must 	case EV_KEY:
758d3d1dd3eSPeeter Must 		switch (value) {
759d3d1dd3eSPeeter Must 		case KEY_EVENT_UP:
760d3d1dd3eSPeeter Must 		case KEY_EVENT_DOWN:
761d3d1dd3eSPeeter Must 			if (bit_test(evdev->ev_key_states, code) == value)
762d3d1dd3eSPeeter Must 				return (EV_SKIP_EVENT);
763d3d1dd3eSPeeter Must 			bit_change(evdev->ev_key_states, code, value);
764d3d1dd3eSPeeter Must 			break;
765d3d1dd3eSPeeter Must 
766d3d1dd3eSPeeter Must 		case KEY_EVENT_REPEAT:
767d3d1dd3eSPeeter Must 			if (bit_test(evdev->ev_key_states, code) == 0 ||
768d3d1dd3eSPeeter Must 			    !evdev_event_supported(evdev, EV_REP))
769d3d1dd3eSPeeter Must 				return (EV_SKIP_EVENT);
770d3d1dd3eSPeeter Must 			break;
771d3d1dd3eSPeeter Must 
772d3d1dd3eSPeeter Must 		default:
773d3d1dd3eSPeeter Must 			 return (EV_SKIP_EVENT);
774d3d1dd3eSPeeter Must 		}
775d3d1dd3eSPeeter Must 		break;
776d3d1dd3eSPeeter Must 
777d3d1dd3eSPeeter Must 	case EV_LED:
778d3d1dd3eSPeeter Must 		if (bit_test(evdev->ev_led_states, code) == value)
779d3d1dd3eSPeeter Must 			return (EV_SKIP_EVENT);
780d3d1dd3eSPeeter Must 		bit_change(evdev->ev_led_states, code, value);
781d3d1dd3eSPeeter Must 		break;
782d3d1dd3eSPeeter Must 
783d3d1dd3eSPeeter Must 	case EV_SND:
784d3d1dd3eSPeeter Must 		bit_change(evdev->ev_snd_states, code, value);
785d3d1dd3eSPeeter Must 		break;
786d3d1dd3eSPeeter Must 
787d3d1dd3eSPeeter Must 	case EV_SW:
788d3d1dd3eSPeeter Must 		if (bit_test(evdev->ev_sw_states, code) == value)
789d3d1dd3eSPeeter Must 			return (EV_SKIP_EVENT);
790d3d1dd3eSPeeter Must 		bit_change(evdev->ev_sw_states, code, value);
791d3d1dd3eSPeeter Must 		break;
792d3d1dd3eSPeeter Must 
793d3d1dd3eSPeeter Must 	case EV_REP:
794d3d1dd3eSPeeter Must 		if (evdev->ev_rep[code] == value)
795d3d1dd3eSPeeter Must 			return (EV_SKIP_EVENT);
796d3d1dd3eSPeeter Must 		evdev_set_repeat_params(evdev, code, value);
797d3d1dd3eSPeeter Must 		break;
798d3d1dd3eSPeeter Must 
799d3d1dd3eSPeeter Must 	case EV_REL:
800d3d1dd3eSPeeter Must 		if (value == 0)
801d3d1dd3eSPeeter Must 			return (EV_SKIP_EVENT);
802d3d1dd3eSPeeter Must 		break;
803d3d1dd3eSPeeter Must 
804d3d1dd3eSPeeter Must 	/* For EV_ABS, save last value in absinfo and ev_mt_states */
805d3d1dd3eSPeeter Must 	case EV_ABS:
806d3d1dd3eSPeeter Must 		switch (code) {
807d3d1dd3eSPeeter Must 		case ABS_MT_SLOT:
808d3d1dd3eSPeeter Must 			/* Postpone ABS_MT_SLOT till next event */
809*a162a738SMichael Neumann 			evdev_mt_set_last_slot(evdev, value);
810d3d1dd3eSPeeter Must 			return (EV_SKIP_EVENT);
811d3d1dd3eSPeeter Must 
812d3d1dd3eSPeeter Must 		case ABS_MT_FIRST ... ABS_MT_LAST:
813d3d1dd3eSPeeter Must 			/* Pass MT protocol type A events as is */
814d3d1dd3eSPeeter Must 			if (!bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
815d3d1dd3eSPeeter Must 				break;
816d3d1dd3eSPeeter Must 			/* Don`t repeat MT protocol type B events */
817*a162a738SMichael Neumann 			last_mt_slot = evdev_mt_get_last_slot(evdev);
818*a162a738SMichael Neumann 			if (evdev_mt_get_value(evdev, last_mt_slot, code)
819d3d1dd3eSPeeter Must 			     == value)
820d3d1dd3eSPeeter Must 				return (EV_SKIP_EVENT);
821*a162a738SMichael Neumann 			evdev_mt_set_value(evdev, last_mt_slot, code, value);
822d3d1dd3eSPeeter Must 			if (last_mt_slot != CURRENT_MT_SLOT(evdev)) {
823d3d1dd3eSPeeter Must 				CURRENT_MT_SLOT(evdev) = last_mt_slot;
824d3d1dd3eSPeeter Must 				evdev->ev_report_opened = true;
825d3d1dd3eSPeeter Must 				return (EV_REPORT_MT_SLOT);
826d3d1dd3eSPeeter Must 			}
827d3d1dd3eSPeeter Must 			break;
828d3d1dd3eSPeeter Must 
829d3d1dd3eSPeeter Must 		default:
830d3d1dd3eSPeeter Must 			if (evdev->ev_absinfo[code].value == value)
831d3d1dd3eSPeeter Must 				return (EV_SKIP_EVENT);
832d3d1dd3eSPeeter Must 			evdev->ev_absinfo[code].value = value;
833d3d1dd3eSPeeter Must 		}
834d3d1dd3eSPeeter Must 		break;
835d3d1dd3eSPeeter Must 
836d3d1dd3eSPeeter Must 	case EV_SYN:
837d3d1dd3eSPeeter Must 		if (code == SYN_REPORT) {
838d3d1dd3eSPeeter Must 			/* Count empty reports as well as non empty */
839d3d1dd3eSPeeter Must 			evdev->ev_report_count++;
840d3d1dd3eSPeeter Must 			/* Skip empty reports */
841d3d1dd3eSPeeter Must 			if (!evdev->ev_report_opened)
842d3d1dd3eSPeeter Must 				return (EV_SKIP_EVENT);
843d3d1dd3eSPeeter Must 			evdev->ev_report_opened = false;
844d3d1dd3eSPeeter Must 			return (EV_REPORT_EVENT);
845d3d1dd3eSPeeter Must 		}
846d3d1dd3eSPeeter Must 		break;
847d3d1dd3eSPeeter Must 	}
848d3d1dd3eSPeeter Must 
849d3d1dd3eSPeeter Must 	evdev->ev_report_opened = true;
850d3d1dd3eSPeeter Must 	return (EV_REPORT_EVENT);
851d3d1dd3eSPeeter Must }
852d3d1dd3eSPeeter Must 
853d3d1dd3eSPeeter Must static void
evdev_propagate_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t value)854d3d1dd3eSPeeter Must evdev_propagate_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
855d3d1dd3eSPeeter Must     int32_t value)
856d3d1dd3eSPeeter Must {
857d3d1dd3eSPeeter Must 	struct evdev_client *client;
858d3d1dd3eSPeeter Must 
859d3d1dd3eSPeeter Must 	debugf(evdev, "%s pushed event %d/%d/%d",
860d3d1dd3eSPeeter Must 	    evdev->ev_shortname, type, code, value);
861d3d1dd3eSPeeter Must 
862d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
863d3d1dd3eSPeeter Must 
864d3d1dd3eSPeeter Must 	/* Propagate event through all clients */
865d3d1dd3eSPeeter Must 	LIST_FOREACH(client, &evdev->ev_clients, ec_link) {
866d3d1dd3eSPeeter Must 		if (evdev->ev_grabber != NULL && evdev->ev_grabber != client)
867d3d1dd3eSPeeter Must 			continue;
868d3d1dd3eSPeeter Must 
869d3d1dd3eSPeeter Must 		EVDEV_CLIENT_LOCKQ(client);
870d3d1dd3eSPeeter Must 		evdev_client_push(client, type, code, value);
871d3d1dd3eSPeeter Must 		if (type == EV_SYN && code == SYN_REPORT)
872d3d1dd3eSPeeter Must 			evdev_notify_event(client);
873d3d1dd3eSPeeter Must 		EVDEV_CLIENT_UNLOCKQ(client);
874d3d1dd3eSPeeter Must 	}
875d3d1dd3eSPeeter Must 
876d3d1dd3eSPeeter Must 	evdev->ev_event_count++;
877d3d1dd3eSPeeter Must }
878d3d1dd3eSPeeter Must 
879d3d1dd3eSPeeter Must void
evdev_send_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t value)880d3d1dd3eSPeeter Must evdev_send_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
881d3d1dd3eSPeeter Must     int32_t value)
882d3d1dd3eSPeeter Must {
883d3d1dd3eSPeeter Must 	enum evdev_sparse_result sparse;
884d3d1dd3eSPeeter Must 
885d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
886d3d1dd3eSPeeter Must 
887*a162a738SMichael Neumann 	evdev_modify_event(evdev, type, code, &value);
888d3d1dd3eSPeeter Must 	sparse =  evdev_sparse_event(evdev, type, code, value);
889d3d1dd3eSPeeter Must 	switch (sparse) {
890d3d1dd3eSPeeter Must 	case EV_REPORT_MT_SLOT:
891d3d1dd3eSPeeter Must 		/* report postponed ABS_MT_SLOT */
892d3d1dd3eSPeeter Must 		evdev_propagate_event(evdev, EV_ABS, ABS_MT_SLOT,
893d3d1dd3eSPeeter Must 		    CURRENT_MT_SLOT(evdev));
894d3d1dd3eSPeeter Must 		/* FALLTHROUGH */
895d3d1dd3eSPeeter Must 	case EV_REPORT_EVENT:
896d3d1dd3eSPeeter Must 		evdev_propagate_event(evdev, type, code, value);
897d3d1dd3eSPeeter Must 		/* FALLTHROUGH */
898d3d1dd3eSPeeter Must 	case EV_SKIP_EVENT:
899d3d1dd3eSPeeter Must 		break;
900d3d1dd3eSPeeter Must 	}
901d3d1dd3eSPeeter Must }
902d3d1dd3eSPeeter Must 
903d3d1dd3eSPeeter Must int
evdev_push_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t value)904d3d1dd3eSPeeter Must evdev_push_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
905d3d1dd3eSPeeter Must     int32_t value)
906d3d1dd3eSPeeter Must {
907d3d1dd3eSPeeter Must 
908d3d1dd3eSPeeter Must 	if (evdev_check_event(evdev, type, code, value) != 0)
909d3d1dd3eSPeeter Must 		return (EINVAL);
910d3d1dd3eSPeeter Must 
911d3d1dd3eSPeeter Must 	EVDEV_ENTER(evdev);
912d3d1dd3eSPeeter Must 
913d3d1dd3eSPeeter Must 	if (type == EV_SYN && code == SYN_REPORT &&
914*a162a738SMichael Neumann 	    bit_test(evdev->ev_abs_flags, ABS_MT_SLOT))
915*a162a738SMichael Neumann 		evdev_mt_sync_frame(evdev);
916*a162a738SMichael Neumann 	else
917*a162a738SMichael Neumann 		if (bit_test(evdev->ev_flags, EVDEV_FLAG_MT_TRACK) &&
918*a162a738SMichael Neumann 		    evdev_mt_record_event(evdev, type, code, value))
919*a162a738SMichael Neumann 			goto exit;
920d3d1dd3eSPeeter Must 
921*a162a738SMichael Neumann 	evdev_send_event(evdev, type, code, value);
922*a162a738SMichael Neumann exit:
923d3d1dd3eSPeeter Must 	EVDEV_EXIT(evdev);
924d3d1dd3eSPeeter Must 
925d3d1dd3eSPeeter Must 	return (0);
926d3d1dd3eSPeeter Must }
927d3d1dd3eSPeeter Must 
928d3d1dd3eSPeeter Must int
evdev_inject_event(struct evdev_dev * evdev,uint16_t type,uint16_t code,int32_t value)929d3d1dd3eSPeeter Must evdev_inject_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
930d3d1dd3eSPeeter Must     int32_t value)
931d3d1dd3eSPeeter Must {
932d3d1dd3eSPeeter Must 	int ret = 0;
933d3d1dd3eSPeeter Must 
934d3d1dd3eSPeeter Must 	switch (type) {
935d3d1dd3eSPeeter Must 	case EV_REP:
936d3d1dd3eSPeeter Must 		/* evdev repeats should not be processed by hardware driver */
937d3d1dd3eSPeeter Must 		if (bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT))
938d3d1dd3eSPeeter Must 			goto push;
939d3d1dd3eSPeeter Must 		/* FALLTHROUGH */
940d3d1dd3eSPeeter Must 	case EV_LED:
941d3d1dd3eSPeeter Must 	case EV_MSC:
942d3d1dd3eSPeeter Must 	case EV_SND:
943d3d1dd3eSPeeter Must 	case EV_FF:
944d3d1dd3eSPeeter Must 		if (evdev->ev_methods != NULL &&
945d3d1dd3eSPeeter Must 		    evdev->ev_methods->ev_event != NULL)
946*a162a738SMichael Neumann 			evdev->ev_methods->ev_event(evdev,
947d3d1dd3eSPeeter Must 			    type, code, value);
948d3d1dd3eSPeeter Must 		/*
949d3d1dd3eSPeeter Must 		 * Leds and driver repeats should be reported in ev_event
950d3d1dd3eSPeeter Must 		 * method body to interoperate with kbdmux states and rates
951d3d1dd3eSPeeter Must 		 * propagation so both ways (ioctl and evdev) of changing it
952d3d1dd3eSPeeter Must 		 * will produce only one evdev event report to client.
953d3d1dd3eSPeeter Must 		 */
954d3d1dd3eSPeeter Must 		if (type == EV_LED || type == EV_REP)
955d3d1dd3eSPeeter Must 			break;
956d3d1dd3eSPeeter Must 		/* FALLTHROUGH */
957d3d1dd3eSPeeter Must 	case EV_SYN:
958d3d1dd3eSPeeter Must 	case EV_KEY:
959d3d1dd3eSPeeter Must 	case EV_REL:
960d3d1dd3eSPeeter Must 	case EV_ABS:
961d3d1dd3eSPeeter Must 	case EV_SW:
962d3d1dd3eSPeeter Must push:
963*a162a738SMichael Neumann 		if (evdev->ev_lock_type != EV_LOCK_INTERNAL)
964*a162a738SMichael Neumann 			EVDEV_LOCK(evdev);
965d3d1dd3eSPeeter Must 		ret = evdev_push_event(evdev, type,  code, value);
966*a162a738SMichael Neumann 		if (evdev->ev_lock_type != EV_LOCK_INTERNAL)
967*a162a738SMichael Neumann 			EVDEV_UNLOCK(evdev);
968d3d1dd3eSPeeter Must 		break;
969d3d1dd3eSPeeter Must 
970d3d1dd3eSPeeter Must 	default:
971d3d1dd3eSPeeter Must 		ret = EINVAL;
972d3d1dd3eSPeeter Must 	}
973d3d1dd3eSPeeter Must 
974d3d1dd3eSPeeter Must 	return (ret);
975d3d1dd3eSPeeter Must }
976d3d1dd3eSPeeter Must 
977d3d1dd3eSPeeter Must int
evdev_register_client(struct evdev_dev * evdev,struct evdev_client * client)978d3d1dd3eSPeeter Must evdev_register_client(struct evdev_dev *evdev, struct evdev_client *client)
979d3d1dd3eSPeeter Must {
980d3d1dd3eSPeeter Must 	int ret = 0;
981d3d1dd3eSPeeter Must 
982d3d1dd3eSPeeter Must 	debugf(evdev, "adding new client for device %s", evdev->ev_shortname);
983d3d1dd3eSPeeter Must 
984d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
985d3d1dd3eSPeeter Must 
986d3d1dd3eSPeeter Must 	if (LIST_EMPTY(&evdev->ev_clients) && evdev->ev_methods != NULL &&
987d3d1dd3eSPeeter Must 	    evdev->ev_methods->ev_open != NULL) {
988d3d1dd3eSPeeter Must 		debugf(evdev, "calling ev_open() on device %s",
989d3d1dd3eSPeeter Must 		    evdev->ev_shortname);
990*a162a738SMichael Neumann 		ret = evdev->ev_methods->ev_open(evdev);
991d3d1dd3eSPeeter Must 	}
992d3d1dd3eSPeeter Must 	if (ret == 0)
993d3d1dd3eSPeeter Must 		LIST_INSERT_HEAD(&evdev->ev_clients, client, ec_link);
994d3d1dd3eSPeeter Must 	return (ret);
995d3d1dd3eSPeeter Must }
996d3d1dd3eSPeeter Must 
997d3d1dd3eSPeeter Must void
evdev_dispose_client(struct evdev_dev * evdev,struct evdev_client * client)998d3d1dd3eSPeeter Must evdev_dispose_client(struct evdev_dev *evdev, struct evdev_client *client)
999d3d1dd3eSPeeter Must {
1000d3d1dd3eSPeeter Must 	debugf(evdev, "removing client for device %s", evdev->ev_shortname);
1001d3d1dd3eSPeeter Must 
1002d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
1003d3d1dd3eSPeeter Must 
1004d3d1dd3eSPeeter Must 	LIST_REMOVE(client, ec_link);
1005d3d1dd3eSPeeter Must 	if (LIST_EMPTY(&evdev->ev_clients)) {
1006d3d1dd3eSPeeter Must 		if (evdev->ev_methods != NULL &&
1007d3d1dd3eSPeeter Must 		    evdev->ev_methods->ev_close != NULL)
1008*a162a738SMichael Neumann 			(void)evdev->ev_methods->ev_close(evdev);
1009d3d1dd3eSPeeter Must 		if (evdev_event_supported(evdev, EV_REP) &&
1010d3d1dd3eSPeeter Must 		    bit_test(evdev->ev_flags, EVDEV_FLAG_SOFTREPEAT))
1011d3d1dd3eSPeeter Must 			evdev_stop_repeat(evdev);
1012d3d1dd3eSPeeter Must 	}
1013d3d1dd3eSPeeter Must 	evdev_release_client(evdev, client);
1014d3d1dd3eSPeeter Must }
1015d3d1dd3eSPeeter Must 
1016d3d1dd3eSPeeter Must int
evdev_grab_client(struct evdev_dev * evdev,struct evdev_client * client)1017d3d1dd3eSPeeter Must evdev_grab_client(struct evdev_dev *evdev, struct evdev_client *client)
1018d3d1dd3eSPeeter Must {
1019d3d1dd3eSPeeter Must 
1020d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
1021d3d1dd3eSPeeter Must 
1022d3d1dd3eSPeeter Must 	if (evdev->ev_grabber != NULL)
1023d3d1dd3eSPeeter Must 		return (EBUSY);
1024d3d1dd3eSPeeter Must 
1025d3d1dd3eSPeeter Must 	evdev->ev_grabber = client;
1026d3d1dd3eSPeeter Must 
1027d3d1dd3eSPeeter Must 	return (0);
1028d3d1dd3eSPeeter Must }
1029d3d1dd3eSPeeter Must 
1030d3d1dd3eSPeeter Must int
evdev_release_client(struct evdev_dev * evdev,struct evdev_client * client)1031d3d1dd3eSPeeter Must evdev_release_client(struct evdev_dev *evdev, struct evdev_client *client)
1032d3d1dd3eSPeeter Must {
1033d3d1dd3eSPeeter Must 
1034d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
1035d3d1dd3eSPeeter Must 
1036d3d1dd3eSPeeter Must 	if (evdev->ev_grabber != client)
1037d3d1dd3eSPeeter Must 		return (EINVAL);
1038d3d1dd3eSPeeter Must 
1039d3d1dd3eSPeeter Must 	evdev->ev_grabber = NULL;
1040d3d1dd3eSPeeter Must 
1041d3d1dd3eSPeeter Must 	return (0);
1042d3d1dd3eSPeeter Must }
1043d3d1dd3eSPeeter Must 
1044*a162a738SMichael Neumann bool
evdev_is_grabbed(struct evdev_dev * evdev)1045*a162a738SMichael Neumann evdev_is_grabbed(struct evdev_dev *evdev)
1046*a162a738SMichael Neumann {
1047*a162a738SMichael Neumann #if 0
1048*a162a738SMichael Neumann 	if (kdb_active || SCHEDULER_STOPPED())
1049*a162a738SMichael Neumann 		return (false);
1050*a162a738SMichael Neumann #endif
1051*a162a738SMichael Neumann 	/*
1052*a162a738SMichael Neumann 	 * The function is intended to be called from evdev-unrelated parts of
1053*a162a738SMichael Neumann 	 * code like syscons-compatible parts of mouse and keyboard drivers.
1054*a162a738SMichael Neumann 	 * That makes unlocked read-only access acceptable.
1055*a162a738SMichael Neumann 	 */
1056*a162a738SMichael Neumann 	return (evdev->ev_grabber != NULL);
1057*a162a738SMichael Neumann }
1058*a162a738SMichael Neumann 
1059d3d1dd3eSPeeter Must static void
evdev_repeat_callout(void * arg)1060d3d1dd3eSPeeter Must evdev_repeat_callout(void *arg)
1061d3d1dd3eSPeeter Must {
1062d3d1dd3eSPeeter Must 	struct evdev_dev *evdev = (struct evdev_dev *)arg;
1063d3d1dd3eSPeeter Must 
1064d3d1dd3eSPeeter Must 	evdev_send_event(evdev, EV_KEY, evdev->ev_rep_key, KEY_EVENT_REPEAT);
1065d3d1dd3eSPeeter Must 	evdev_send_event(evdev, EV_SYN, SYN_REPORT, 1);
1066d3d1dd3eSPeeter Must 
1067d3d1dd3eSPeeter Must 	if (evdev->ev_rep[REP_PERIOD])
1068d3d1dd3eSPeeter Must 		callout_reset(&evdev->ev_rep_callout,
1069d3d1dd3eSPeeter Must 		    evdev->ev_rep[REP_PERIOD] * hz / 1000,
1070d3d1dd3eSPeeter Must 		    evdev_repeat_callout, evdev);
1071d3d1dd3eSPeeter Must 	else
1072d3d1dd3eSPeeter Must 		evdev->ev_rep_key = KEY_RESERVED;
1073d3d1dd3eSPeeter Must }
1074d3d1dd3eSPeeter Must 
1075d3d1dd3eSPeeter Must static void
evdev_start_repeat(struct evdev_dev * evdev,uint16_t key)1076d3d1dd3eSPeeter Must evdev_start_repeat(struct evdev_dev *evdev, uint16_t key)
1077d3d1dd3eSPeeter Must {
1078d3d1dd3eSPeeter Must 
1079d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
1080d3d1dd3eSPeeter Must 
1081d3d1dd3eSPeeter Must 	if (evdev->ev_rep[REP_DELAY]) {
1082d3d1dd3eSPeeter Must 		evdev->ev_rep_key = key;
1083d3d1dd3eSPeeter Must 		callout_reset(&evdev->ev_rep_callout,
1084d3d1dd3eSPeeter Must 		    evdev->ev_rep[REP_DELAY] * hz / 1000,
1085d3d1dd3eSPeeter Must 		    evdev_repeat_callout, evdev);
1086d3d1dd3eSPeeter Must 	}
1087d3d1dd3eSPeeter Must }
1088d3d1dd3eSPeeter Must 
1089d3d1dd3eSPeeter Must static void
evdev_stop_repeat(struct evdev_dev * evdev)1090d3d1dd3eSPeeter Must evdev_stop_repeat(struct evdev_dev *evdev)
1091d3d1dd3eSPeeter Must {
1092d3d1dd3eSPeeter Must 
1093d3d1dd3eSPeeter Must 	EVDEV_LOCK_ASSERT(evdev);
1094d3d1dd3eSPeeter Must 
1095d3d1dd3eSPeeter Must 	if (evdev->ev_rep_key != KEY_RESERVED) {
1096d3d1dd3eSPeeter Must 		callout_stop(&evdev->ev_rep_callout);
1097d3d1dd3eSPeeter Must 		evdev->ev_rep_key = KEY_RESERVED;
1098d3d1dd3eSPeeter Must 	}
1099d3d1dd3eSPeeter Must }
1100d3d1dd3eSPeeter Must 
1101d3d1dd3eSPeeter Must static int
evdev_load(module_t mod,int cmd,void * arg)1102d3d1dd3eSPeeter Must evdev_load(module_t mod, int cmd, void *arg)
1103d3d1dd3eSPeeter Must {
1104d3d1dd3eSPeeter Must 	int error = 0;
1105d3d1dd3eSPeeter Must 
1106d3d1dd3eSPeeter Must 	switch (cmd) {
1107d3d1dd3eSPeeter Must 	case MOD_LOAD:
1108d3d1dd3eSPeeter Must 		kprintf("evdev device loaded.\n");
1109d3d1dd3eSPeeter Must 		break;
1110d3d1dd3eSPeeter Must 	case MOD_UNLOAD:
1111d3d1dd3eSPeeter Must 		kprintf("evdev device unloaded.\n");
1112d3d1dd3eSPeeter Must 		break;
1113d3d1dd3eSPeeter Must 
1114d3d1dd3eSPeeter Must 	default:
1115d3d1dd3eSPeeter Must 		error = EOPNOTSUPP;
1116d3d1dd3eSPeeter Must 		break;
1117d3d1dd3eSPeeter Must     }
1118d3d1dd3eSPeeter Must 
1119d3d1dd3eSPeeter Must     return (error);
1120d3d1dd3eSPeeter Must }
1121d3d1dd3eSPeeter Must 
1122d3d1dd3eSPeeter Must DEV_MODULE(evdev, evdev_load, NULL);
1123d3d1dd3eSPeeter Must MODULE_VERSION(evdev, 1);
1124