summaryrefslogtreecommitdiffstats
path: root/sys/dev/kbd/kbd.c
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-12-13 10:36:36 +0000
committeryokota <yokota@FreeBSD.org>1999-12-13 10:36:36 +0000
commit5fa506591286dadad6dba89bf9ca24d1369beb33 (patch)
tree3be6f5cad606f048450dae2d9b08b19d7ab290d8 /sys/dev/kbd/kbd.c
parentdd933059e17546022cfd5d8f0461def61da4153f (diff)
downloadFreeBSD-src-5fa506591286dadad6dba89bf9ca24d1369beb33.zip
FreeBSD-src-5fa506591286dadad6dba89bf9ca24d1369beb33.tar.gz
- Add a module event function to the ukbd driver and make the ukbd KLD
module work. - Delete unnecessary #include.
Diffstat (limited to 'sys/dev/kbd/kbd.c')
-rw-r--r--sys/dev/kbd/kbd.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
index 3b63404..793c84c 100644
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -53,6 +53,9 @@ typedef struct genkbd_softc {
struct selinfo gkb_rsel;
} genkbd_softc_t;
+static SLIST_HEAD(, keyboard_driver) keyboard_drivers =
+ SLIST_HEAD_INITIALIZER(keyboard_drivers);
+
/* local arrays */
/*
@@ -150,6 +153,24 @@ kbd_set_maps(keyboard_t *kbd, keymap_t *keymap, accentmap_t *accmap,
kbd->kb_fkeytab_size = fkeymap_size;
}
+/* declare a new keyboard driver */
+int
+kbd_add_driver(keyboard_driver_t *driver)
+{
+ if (SLIST_NEXT(driver, link))
+ return EINVAL;
+ SLIST_INSERT_HEAD(&keyboard_drivers, driver, link);
+ return 0;
+}
+
+int
+kbd_delete_driver(keyboard_driver_t *driver)
+{
+ SLIST_REMOVE(&keyboard_drivers, driver, keyboard_driver, link);
+ SLIST_NEXT(driver, link) = NULL;
+ return 0;
+}
+
/* register a keyboard and associate it with a function table */
int
kbd_register(keyboard_t *kbd)
@@ -175,6 +196,13 @@ kbd_register(keyboard_t *kbd)
kbd->kb_callback.kc_func = NULL;
kbd->kb_callback.kc_arg = NULL;
+ SLIST_FOREACH(p, &keyboard_drivers, link) {
+ if (strcmp(p->name, kbd->kb_name) == 0) {
+ keyboard[index] = kbd;
+ kbdsw[index] = p->kbdsw;
+ return index;
+ }
+ }
list = (const keyboard_driver_t **)kbddriver_set.ls_items;
while ((p = *list++) != NULL) {
if (strcmp(p->name, kbd->kb_name) == 0) {
@@ -226,6 +254,10 @@ keyboard_switch_t
const keyboard_driver_t **list;
const keyboard_driver_t *p;
+ SLIST_FOREACH(p, &keyboard_drivers, link) {
+ if (strcmp(p->name, driver) == 0)
+ return p->kbdsw;
+ }
list = (const keyboard_driver_t **)kbddriver_set.ls_items;
while ((p = *list++) != NULL) {
if (strcmp(p->name, driver) == 0)
@@ -361,6 +393,10 @@ kbd_configure(int flags)
const keyboard_driver_t **list;
const keyboard_driver_t *p;
+ SLIST_FOREACH(p, &keyboard_drivers, link) {
+ if (p->configure != NULL)
+ (*p->configure)(flags);
+ }
list = (const keyboard_driver_t **)kbddriver_set.ls_items;
while ((p = *list++) != NULL) {
if (p->configure != NULL)
@@ -430,12 +466,18 @@ kbd_attach(keyboard_t *kbd)
int
kbd_detach(keyboard_t *kbd)
{
+ dev_t dev;
+
if (kbd->kb_index >= keyboards)
return EINVAL;
if (keyboard[kbd->kb_index] != kbd)
return EINVAL;
- /* XXX: unmake_dev() ? */
+ dev = makedev(kbd_cdevsw.d_maj, kbd->kb_index);
+ if (dev->si_drv1)
+ free(dev->si_drv1, M_DEVBUF);
+ destroy_dev(dev);
+
return 0;
}
OpenPOWER on IntegriCloud