summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/ukbd.c
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-08-22 09:52:33 +0000
committeryokota <yokota@FreeBSD.org>1999-08-22 09:52:33 +0000
commitc9a6c5e45ee0200a3cfb5349733d904c3bb9339f (patch)
treec863c8a9db1db731c5f9cddf215957eab25b7c1f /sys/dev/usb/ukbd.c
parentae67da834bc3aff6bb01df8bccc2d8f0ff8b97c9 (diff)
downloadFreeBSD-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.c156
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);
OpenPOWER on IntegriCloud