kbd drivers: don't double register keyboard drivers

Keyboard drivers are generally registered via linker set. In these cases,
they're also available as kmods which use KPI for registering/unregistering
keyboard drivers outside of the linker set.

For built-in modules, we still fire off MOD_LOAD and maybe even MOD_UNLOAD
if an error occurs, leading to registration via linker set and at MOD_LOAD
time.

This is a minor optimization at best, but it keeps the internal kbd driver
tidy as a future change will merge the linker set driver list into its
internal keyboard_drivers list via SYSINIT and simplify driver lookup by
removing the need to consult the linker set.
This commit is contained in:
kevans 2019-12-16 16:41:24 +00:00
parent 70c8791e3b
commit 9334768587
6 changed files with 28 additions and 0 deletions

View File

@ -850,11 +850,15 @@ akbd_modevent(module_t mod, int type, void *data)
{ {
switch (type) { switch (type) {
case MOD_LOAD: case MOD_LOAD:
#ifdef KLD_MODULE
kbd_add_driver(&akbd_kbd_driver); kbd_add_driver(&akbd_kbd_driver);
#endif
break; break;
case MOD_UNLOAD: case MOD_UNLOAD:
#ifdef KLD_MODULE
kbd_delete_driver(&akbd_kbd_driver); kbd_delete_driver(&akbd_kbd_driver);
#endif
break; break;
default: default:

View File

@ -983,6 +983,8 @@ KEYBOARD_DRIVER(gpiokeys, gpiokeyssw, gpiokeys_configure);
static int static int
gpiokeys_driver_load(module_t mod, int what, void *arg) gpiokeys_driver_load(module_t mod, int what, void *arg)
{ {
#ifdef KLD_MODULE
switch (what) { switch (what) {
case MOD_LOAD: case MOD_LOAD:
kbd_add_driver(&gpiokeys_kbd_driver); kbd_add_driver(&gpiokeys_kbd_driver);
@ -991,6 +993,7 @@ gpiokeys_driver_load(module_t mod, int what, void *arg)
kbd_delete_driver(&gpiokeys_kbd_driver); kbd_delete_driver(&gpiokeys_kbd_driver);
break; break;
} }
#endif
return (0); return (0);
} }

View File

@ -490,6 +490,8 @@ hv_kbd_intr(hv_kbd_sc *sc)
int int
hvkbd_driver_load(module_t mod, int what, void *arg) hvkbd_driver_load(module_t mod, int what, void *arg)
{ {
#ifdef KLD_MODULE
switch (what) { switch (what) {
case MOD_LOAD: case MOD_LOAD:
kbd_add_driver(&hvkbd_kbd_driver); kbd_add_driver(&hvkbd_kbd_driver);
@ -498,6 +500,7 @@ hvkbd_driver_load(module_t mod, int what, void *arg)
kbd_delete_driver(&hvkbd_kbd_driver); kbd_delete_driver(&hvkbd_kbd_driver);
break; break;
} }
#endif
return (0); return (0);
} }

View File

@ -1423,11 +1423,15 @@ kbdmux_modevent(module_t mod, int type, void *data)
switch (type) { switch (type) {
case MOD_LOAD: case MOD_LOAD:
#ifdef KLD_MODULE
if ((error = kbd_add_driver(&kbdmux_kbd_driver)) != 0) if ((error = kbd_add_driver(&kbdmux_kbd_driver)) != 0)
break; break;
#endif
if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) { if ((sw = kbd_get_switch(KEYBOARD_NAME)) == NULL) {
#ifdef KLD_MODULE
kbd_delete_driver(&kbdmux_kbd_driver); kbd_delete_driver(&kbdmux_kbd_driver);
#endif
error = ENXIO; error = ENXIO;
break; break;
} }
@ -1436,14 +1440,18 @@ kbdmux_modevent(module_t mod, int type, void *data)
if ((error = (*sw->probe)(0, NULL, 0)) != 0 || if ((error = (*sw->probe)(0, NULL, 0)) != 0 ||
(error = (*sw->init)(0, &kbd, NULL, 0)) != 0) { (error = (*sw->init)(0, &kbd, NULL, 0)) != 0) {
#ifdef KLD_MODULE
kbd_delete_driver(&kbdmux_kbd_driver); kbd_delete_driver(&kbdmux_kbd_driver);
#endif
break; break;
} }
#ifdef KBD_INSTALL_CDEV #ifdef KBD_INSTALL_CDEV
if ((error = kbd_attach(kbd)) != 0) { if ((error = kbd_attach(kbd)) != 0) {
(*sw->term)(kbd); (*sw->term)(kbd);
#ifdef KLD_MODULE
kbd_delete_driver(&kbdmux_kbd_driver); kbd_delete_driver(&kbdmux_kbd_driver);
#endif
break; break;
} }
#endif #endif
@ -1454,7 +1462,9 @@ kbdmux_modevent(module_t mod, int type, void *data)
kbd_detach(kbd); kbd_detach(kbd);
#endif #endif
(*sw->term)(kbd); (*sw->term)(kbd);
#ifdef KLD_MODULE
kbd_delete_driver(&kbdmux_kbd_driver); kbd_delete_driver(&kbdmux_kbd_driver);
#endif
break; break;
} }
break; break;
@ -1470,7 +1480,9 @@ kbdmux_modevent(module_t mod, int type, void *data)
kbd_detach(kbd); kbd_detach(kbd);
#endif #endif
(*sw->term)(kbd); (*sw->term)(kbd);
#ifdef KLD_MODULE
kbd_delete_driver(&kbdmux_kbd_driver); kbd_delete_driver(&kbdmux_kbd_driver);
#endif
} }
error = 0; error = 0;
break; break;

View File

@ -2290,6 +2290,7 @@ KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
static int static int
ukbd_driver_load(module_t mod, int what, void *arg) ukbd_driver_load(module_t mod, int what, void *arg)
{ {
#ifdef KLD_MODULE
switch (what) { switch (what) {
case MOD_LOAD: case MOD_LOAD:
kbd_add_driver(&ukbd_kbd_driver); kbd_add_driver(&ukbd_kbd_driver);
@ -2298,6 +2299,7 @@ ukbd_driver_load(module_t mod, int what, void *arg)
kbd_delete_driver(&ukbd_kbd_driver); kbd_delete_driver(&ukbd_kbd_driver);
break; break;
} }
#endif
return (0); return (0);
} }

View File

@ -1360,11 +1360,15 @@ vkbd_modevent(module_t mod, int type, void *data)
clone_cleanup(&vkbd_dev_clones); clone_cleanup(&vkbd_dev_clones);
return (ENOMEM); return (ENOMEM);
} }
#ifdef KLD_MODULE
kbd_add_driver(&vkbd_kbd_driver); kbd_add_driver(&vkbd_kbd_driver);
#endif
break; break;
case MOD_UNLOAD: case MOD_UNLOAD:
#ifdef KLD_MODULE
kbd_delete_driver(&vkbd_kbd_driver); kbd_delete_driver(&vkbd_kbd_driver);
#endif
EVENTHANDLER_DEREGISTER(dev_clone, tag); EVENTHANDLER_DEREGISTER(dev_clone, tag);
clone_cleanup(&vkbd_dev_clones); clone_cleanup(&vkbd_dev_clones);
break; break;