summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/evdev
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-09 14:02:09 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:38 +0200
commitbb80d9df8bac71eedee1a6787ca63aef972a7e48 (patch)
tree1b5cb9443c5ead5706c35afb618abbbd1592315e /freebsd/sys/dev/evdev
parentUpdate to FreeBSD head 2017-10-01 (diff)
downloadrtems-libbsd-bb80d9df8bac71eedee1a6787ca63aef972a7e48.tar.bz2
Update to FreeBSD head 2017-12-01
Git mirror commit e724f51f811a4b2bd29447f8b85ab5c2f9b88266. Update #3472.
Diffstat (limited to 'freebsd/sys/dev/evdev')
-rw-r--r--freebsd/sys/dev/evdev/evdev.c14
-rw-r--r--freebsd/sys/dev/evdev/evdev.h2
-rw-r--r--freebsd/sys/dev/evdev/evdev_utils.c19
3 files changed, 26 insertions, 9 deletions
diff --git a/freebsd/sys/dev/evdev/evdev.c b/freebsd/sys/dev/evdev/evdev.c
index b3c786a5..6c2976d7 100644
--- a/freebsd/sys/dev/evdev/evdev.c
+++ b/freebsd/sys/dev/evdev/evdev.c
@@ -52,6 +52,9 @@
#ifdef FEATURE
FEATURE(evdev, "Input event devices support");
+#ifdef EVDEV_SUPPORT
+FEATURE(evdev_support, "Evdev support in hybrid drivers");
+#endif
#endif
enum evdev_sparse_result
@@ -70,12 +73,14 @@ int evdev_rcpt_mask = EVDEV_RCPT_HW_MOUSE | EVDEV_RCPT_HW_KBD;
#endif /* __rtems__ */
int evdev_sysmouse_t_axis = 0;
+#ifdef EVDEV_SUPPORT
SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW, 0, "Evdev args");
SYSCTL_INT(_kern_evdev, OID_AUTO, rcpt_mask, CTLFLAG_RW, &evdev_rcpt_mask, 0,
"Who is receiving events: bit0 - sysmouse, bit1 - kbdmux, "
"bit2 - mouse hardware, bit3 - keyboard hardware");
SYSCTL_INT(_kern_evdev, OID_AUTO, sysmouse_t_axis, CTLFLAG_RW,
&evdev_sysmouse_t_axis, 0, "Extract T-axis from 0-none, 1-ums, 2-psm");
+#endif
static void evdev_start_repeat(struct evdev_dev *, uint16_t);
static void evdev_stop_repeat(struct evdev_dev *);
@@ -583,7 +588,8 @@ evdev_modify_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
*value = KEY_EVENT_REPEAT;
} else {
/* Start/stop callout for evdev repeats */
- if (bit_test(evdev->ev_key_states, code) == !*value) {
+ if (bit_test(evdev->ev_key_states, code) == !*value &&
+ !LIST_EMPTY(&evdev->ev_clients)) {
if (*value == KEY_EVENT_DOWN)
evdev_start_repeat(evdev, code);
else
@@ -638,8 +644,6 @@ evdev_sparse_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
break;
case EV_SND:
- if (bit_test(evdev->ev_snd_states, code) == value)
- return (EV_SKIP_EVENT);
bit_change(evdev->ev_snd_states, code, value);
break;
@@ -817,7 +821,11 @@ evdev_inject_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
case EV_ABS:
case EV_SW:
push:
+ if (evdev->ev_lock_type != EV_LOCK_INTERNAL)
+ EVDEV_LOCK(evdev);
ret = evdev_push_event(evdev, type, code, value);
+ if (evdev->ev_lock_type != EV_LOCK_INTERNAL)
+ EVDEV_UNLOCK(evdev);
break;
default:
diff --git a/freebsd/sys/dev/evdev/evdev.h b/freebsd/sys/dev/evdev/evdev.h
index 946913c4..31f0c2c3 100644
--- a/freebsd/sys/dev/evdev/evdev.h
+++ b/freebsd/sys/dev/evdev/evdev.h
@@ -197,7 +197,7 @@ static __inline int
evdev_push_snd(struct evdev_dev *evdev, uint16_t code, int32_t value)
{
- return (evdev_push_event(evdev, EV_SND, code, value != 0));
+ return (evdev_push_event(evdev, EV_SND, code, value));
}
static __inline int
diff --git a/freebsd/sys/dev/evdev/evdev_utils.c b/freebsd/sys/dev/evdev/evdev_utils.c
index caf81a46..9814ffeb 100644
--- a/freebsd/sys/dev/evdev/evdev_utils.c
+++ b/freebsd/sys/dev/evdev/evdev_utils.c
@@ -34,7 +34,9 @@
#include <sys/conf.h>
#include <sys/kbio.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
#include <sys/malloc.h>
+#include <sys/mutex.h>
#include <sys/systm.h>
#include <dev/evdev/evdev.h>
@@ -64,7 +66,7 @@ static uint16_t evdev_usb_scancodes[256] = {
KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP,
KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT,
KEY_LEFT, KEY_DOWN, KEY_UP, KEY_NUMLOCK,
- KEY_SLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS,
+ KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS,
KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3,
KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7,
/* 0x60 - 0x7f */
@@ -131,7 +133,7 @@ static uint16_t evdev_at_set1_scancodes[] = {
KEY_APOSTROPHE, KEY_GRAVE, KEY_LEFTSHIFT, KEY_BACKSLASH,
KEY_Z, KEY_X, KEY_C, KEY_V,
KEY_B, KEY_N, KEY_M, KEY_COMMA,
- KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, NONE,
+ KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, KEY_KPASTERISK,
KEY_LEFTALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1,
KEY_F2, KEY_F3, KEY_F4, KEY_F5,
/* 0x40 - 0x5f */
@@ -140,7 +142,7 @@ static uint16_t evdev_at_set1_scancodes[] = {
KEY_KP8, KEY_KP9, KEY_KPMINUS, KEY_KP4,
KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1,
KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT,
- NONE, NONE, NONE, KEY_F11,
+ NONE, NONE, KEY_102ND, KEY_F11,
KEY_F12, NONE, NONE, NONE,
NONE, NONE, NONE, NONE,
/* 0x60 - 0x7f */
@@ -167,7 +169,7 @@ static uint16_t evdev_at_set1_scancodes[] = {
NONE, NONE, NONE, NONE,
NONE, NONE, KEY_VOLUMEDOWN, NONE,
KEY_VOLUMEUP, NONE, KEY_HOMEPAGE, NONE,
- NONE, KEY_KPASTERISK, NONE, KEY_SYSRQ,
+ NONE, KEY_KPSLASH, NONE, KEY_SYSRQ,
KEY_RIGHTALT, NONE, NONE, NONE,
NONE, NONE, NONE, NONE,
/* 0x40 - 0x5f. 0xE0 prefixed */
@@ -316,19 +318,26 @@ evdev_ev_kbd_event(struct evdev_dev *evdev, void *softc, uint16_t type,
leds |= 1 << i;
else
leds &= ~(1 << i);
- if (leds != oleds)
+ if (leds != oleds) {
+ mtx_lock(&Giant);
kbdd_ioctl(kbd, KDSETLED,
(caddr_t)&leds);
+ mtx_unlock(&Giant);
+ }
break;
}
}
} else if (type == EV_REP && code == REP_DELAY) {
delay[0] = value;
delay[1] = kbd->kb_delay2;
+ mtx_lock(&Giant);
kbdd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay);
+ mtx_unlock(&Giant);
} else if (type == EV_REP && code == REP_PERIOD) {
delay[0] = kbd->kb_delay1;
delay[1] = value;
+ mtx_lock(&Giant);
kbdd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay);
+ mtx_unlock(&Giant);
}
}