diff options
author | yokota <yokota@FreeBSD.org> | 1999-08-22 09:52:33 +0000 |
---|---|---|
committer | yokota <yokota@FreeBSD.org> | 1999-08-22 09:52:33 +0000 |
commit | c9a6c5e45ee0200a3cfb5349733d904c3bb9339f (patch) | |
tree | c863c8a9db1db731c5f9cddf215957eab25b7c1f /sys/dev/usb/ukbd.c | |
parent | ae67da834bc3aff6bb01df8bccc2d8f0ff8b97c9 (diff) | |
download | FreeBSD-src-c9a6c5e45ee0200a3cfb5349733d904c3bb9339f.zip FreeBSD-src-c9a6c5e45ee0200a3cfb5349733d904c3bb9339f.tar.gz |
- Remove cdevsw entry points in individual keyboard drivers;
instead, use generic entry points for all drivers.
- Eliminate bogus makedev().
- Eliminate softc in the lower drivers, as it is no longer necessary.
Submitted (95%) by: phk
Diffstat (limited to 'sys/dev/usb/ukbd.c')
-rw-r--r-- | sys/dev/usb/ukbd.c | 156 |
1 files changed, 26 insertions, 130 deletions
diff --git a/sys/dev/usb/ukbd.c b/sys/dev/usb/ukbd.c index 1fdc816..67b0f26 100644 --- a/sys/dev/usb/ukbd.c +++ b/sys/dev/usb/ukbd.c @@ -107,17 +107,8 @@ struct ukbd_data { typedef struct ukbd_softc { bdevice sc_dev; /* base device */ - usbd_interface_handle sc_iface; /* interface */ - - short sc_flags; -#define UKBD_ATTACHED (1 << 0) - keyboard_t *sc_kbd; -#ifdef KBD_INSTALL_CDEV - genkbd_softc_t sc_gensc; -#endif } ukbd_softc_t; -#define UKBDUNIT(dev) (minor(dev)) #define UKBD_CHUNK 128 /* chunk size for read */ #define UKBD_BSIZE 1020 /* buffer size */ @@ -126,39 +117,6 @@ typedef void usbd_disco_t(void *); static usbd_intr_t ukbd_intr; static usbd_disco_t ukbd_disconnect; -static int ukbd_remove_kbd(struct ukbd_softc *sc); - -#ifdef KBD_INSTALL_CDEV - -static d_open_t ukbdopen; -static d_close_t ukbdclose; -static d_read_t ukbdread; -static d_ioctl_t ukbdioctl; -static d_poll_t ukbdpoll; - -static struct cdevsw ukbd_cdevsw = { - /* open */ ukbdopen, - /* close */ ukbdclose, - /* read */ ukbdread, - /* write */ nowrite, - /* ioctl */ ukbdioctl, - /* stop */ nostop, - /* reset */ noreset, - /* devtotty */ nodevtotty, - /* poll */ ukbdpoll, - /* mmap */ nommap, - /* strategy */ nostrategy, - /* name */ DRIVER_NAME, - /* parms */ noparms, - /* maj */ -1, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ 0, - /* maxio */ 0, - /* bmaj */ -1 -}; - -#endif /* KBD_INSTALL_CDEV */ USB_DECLARE_DRIVER(ukbd); @@ -167,7 +125,7 @@ USB_MATCH(ukbd) USB_MATCH_START(ukbd, uaa); keyboard_switch_t *sw; - void *arg[4]; + void *arg[3]; int unit = device_get_unit(self); sw = kbd_get_switch(DRIVER_NAME); @@ -177,7 +135,6 @@ USB_MATCH(ukbd) arg[0] = (void *)uaa; arg[1] = (void *)ukbd_intr; arg[2] = (void *)ukbd_disconnect; - arg[3] = (void *)self; if ((*sw->probe)(unit, (void *)arg, 0)) return (UMATCH_NONE); @@ -192,14 +149,14 @@ USB_ATTACH(ukbd) char devinfo[1024]; keyboard_switch_t *sw; - void *arg[4]; + keyboard_t *kbd; + void *arg[3]; int unit = device_get_unit(self); sw = kbd_get_switch(DRIVER_NAME); if (sw == NULL) USB_ATTACH_ERROR_RETURN; - sc->sc_iface = iface; id = usbd_get_interface_descriptor(iface); usbd_devinfo(uaa->device, 0, devinfo); USB_ATTACH_SETUP; @@ -209,21 +166,19 @@ USB_ATTACH(ukbd) arg[0] = (void *)uaa; arg[1] = (void *)ukbd_intr; arg[2] = (void *)ukbd_disconnect; - arg[3] = (void *)self; - sc->sc_kbd = NULL; + kbd = NULL; if ((*sw->probe)(unit, (void *)arg, 0)) USB_ATTACH_ERROR_RETURN; - if ((*sw->init)(unit, &sc->sc_kbd, (void *)arg, 0)) + if ((*sw->init)(unit, &kbd, (void *)arg, 0)) USB_ATTACH_ERROR_RETURN; - (*sw->enable)(sc->sc_kbd); + (*sw->enable)(kbd); #ifdef KBD_INSTALL_CDEV - if (kbd_attach(makedev(0, unit), sc->sc_kbd, &ukbd_cdevsw)) + if (kbd_attach(kbd)) USB_ATTACH_ERROR_RETURN; #endif if (bootverbose) - (*sw->diag)(sc->sc_kbd, bootverbose); - sc->sc_flags |= UKBD_ATTACHED; + (*sw->diag)(kbd, bootverbose); USB_ATTACH_SUCCESS_RETURN; } @@ -231,14 +186,23 @@ USB_ATTACH(ukbd) int ukbd_detach(device_t self) { - struct ukbd_softc *sc = device_get_softc(self); + keyboard_t *kbd; int error; - error = ukbd_remove_kbd(sc); + kbd = kbd_get_keyboard(kbd_find_keyboard(DRIVER_NAME, + device_get_unit(self))); + if (kbd == NULL) { + DPRINTF(("%s: keyboard not attached!?\n", USBDEVNAME(self))); + return ENXIO; + } +#ifdef KBD_INSTALL_CDEV + error = kbd_detach(kbd); + if (error) + return error; +#endif + error = (*kbdsw[kbd->kb_index]->term)(kbd); if (error) return error; - - sc->sc_flags &= ~UKBD_ATTACHED; DPRINTF(("%s: disconnected\n", USBDEVNAME(self))); @@ -250,79 +214,12 @@ ukbd_detach(device_t self) static void ukbd_disconnect(void *p) { - device_t self = (device_t)p; - struct ukbd_softc *sc = device_get_softc(self); + keyboard_t *kbd = (keyboard_t *)p; - DPRINTF(("ukbd_disconnect: sc:%p\n", sc)); - (*kbdsw[sc->sc_kbd->kb_index]->disable)(sc->sc_kbd); + DPRINTF(("ukbd_disconnect: kbd:%p\n", kbd)); + (*kbdsw[kbd->kb_index]->disable)(kbd); } -static int -ukbd_remove_kbd(struct ukbd_softc *sc) -{ - int error; - -#ifdef KBD_INSTALL_CDEV - error = kbd_detach(makedev(0, sc->sc_kbd->kb_unit), sc->sc_kbd, - &ukbd_cdevsw); - if (error) - return error; -#endif - error = (*kbdsw[sc->sc_kbd->kb_index]->term)(sc->sc_kbd); - if (error) - return error; - sc->sc_kbd = NULL; - - return 0; -} - -/* cdev driver functions */ - -#ifdef KBD_INSTALL_CDEV - -static int -ukbdopen(dev_t dev, int flag, int mode, struct proc *p) -{ - USB_GET_SC_OPEN(ukbd, UKBDUNIT(dev), sc); - - /* FIXME: set the initial input mode (K_XLATE?) and lock state? */ - return genkbdopen(&sc->sc_gensc, sc->sc_kbd, flag, mode, p); -} - -static int -ukbdclose(dev_t dev, int flag, int mode, struct proc *p) -{ - USB_GET_SC(ukbd, UKBDUNIT(dev),sc); - - return genkbdclose(&sc->sc_gensc, sc->sc_kbd, flag, mode, p); -} - -static int -ukbdread(dev_t dev, struct uio *uio, int flag) -{ - USB_GET_SC(ukbd, UKBDUNIT(dev),sc); - - return genkbdread(&sc->sc_gensc, sc->sc_kbd, uio, flag); -} - -static int -ukbdioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *p) -{ - USB_GET_SC(ukbd, UKBDUNIT(dev),sc); - - return genkbdioctl(&sc->sc_gensc, sc->sc_kbd, cmd, arg, flag, p); -} - -static int -ukbdpoll(dev_t dev, int event, struct proc *p) -{ - USB_GET_SC(ukbd, UKBDUNIT(dev),sc); - - return genkbdpoll(&sc->sc_gensc, sc->sc_kbd, event, p); -} - -#endif /* KBD_INSTALL_CDEV */ - void ukbd_intr(usbd_request_handle reqh, usbd_private_handle addr, usbd_status status) { @@ -545,7 +442,7 @@ ukbd_configure(int flags) keyboard_t *kbd; device_t device; struct usb_attach_arg *uaa; - void *arg[4]; + void *arg[3]; device = devclass_get_device(ukbd_devclass, UKBD_DEFAULT); if (device == NULL) @@ -558,7 +455,6 @@ ukbd_configure(int flags) arg[0] = (void *)uaa; arg[1] = (void *)ukbd_intr; arg[2] = (void *)ukbd_disconnect; - arg[3] = (void *)device; kbd = NULL; if (ukbd_probe(UKBD_DEFAULT, arg, flags)) return 0; @@ -689,7 +585,7 @@ ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) return ENXIO; if (ukbd_enable_intr(kbd, TRUE, (usbd_intr_t *)data[1]) == 0) { usbd_set_disco(state->ks_intrpipe, - (usbd_disco_t *)data[2], data[3]); + (usbd_disco_t *)data[2], (void *)kbd); ukbd_timeout((void *)kbd); } KBD_CONFIG_DONE(kbd); |