--- psm.c 1998/12/01 15:26:02 1.6 +++ psm.c 1999/01/06 16:10:13 1.8 @@ -92,6 +92,10 @@ #include #include +#ifdef NEW_CONFIG +#include "ioconf.h" +#endif /* NEW_CONFIG */ + /* * Driver specific options: the following options may be set by * `options' statements in the kernel configuration file. @@ -149,7 +153,10 @@ } ringbuf_t; /* driver control block */ -static struct psm_softc { /* Driver status information */ +struct psm_softc { /* Driver status information */ +#ifdef NEW_CONFIG + struct device psm_dev; /* device generic information */ +#endif struct selinfo rsel; /* Process selecting for Input */ unsigned char state; /* Mouse driver state */ int config; /* driver configuration flags */ @@ -171,7 +178,10 @@ #ifdef PSM_HOOKAPM struct apmhook resumehook; #endif -} *psm_softc[NPSM]; +}; +#ifndef NEW_CONFIG +static struct psm_softc *psm_softc[NPSM]; +#endif /* driver state flags (state) */ #define PSM_VALID 0x80 @@ -221,8 +231,10 @@ int *, int, mousestatus_t *)); /* function prototypes */ +#ifndef NEW_CONFIG static int psmprobe __P((struct isa_device *)); static int psmattach __P((struct isa_device *)); +#endif static void psm_drvinit __P((void *)); #ifdef PSM_HOOKAPM static int psmresume __P((void *)); @@ -284,17 +296,19 @@ 0xc0, MOUSE_PS2_PACKETSIZE, NULL, }, }; +#ifndef NEW_CONFIG /* device driver declarateion */ struct isa_driver psmdriver = { psmprobe, psmattach, "psm", FALSE }; +#endif #define CDEV_MAJOR 21 #ifdef NEW_CONFIG -struct psm_softc_new { - struct device psm_dev; -}; +static int psm_match __P((struct device *, struct cfdata *, void *)); +static void psm_attach __P((struct device *, struct device *, void *)); +static int psm_init __P((struct psm_softc *, int, int)); struct cfattach psm_ca = { - sizeof(struct psm_softc_new), 0, &psmdriver, isa_dev_match, NULL, NULL, + sizeof(struct psm_softc), 1, NULL, psm_match, psm_attach, NULL,NULL, }; #endif @@ -582,8 +596,13 @@ static int reinitialize(int unit, mousemode_t *mode) { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[unit]; + KBDC kbdc = sc->kbdc; +#else /* NEW_CONFIG */ struct psm_softc *sc = psm_softc[unit]; KBDC kbdc = psm_softc[unit]->kbdc; +#endif /* NEW_CONFIG */ int stat[3]; int i; @@ -669,7 +688,11 @@ static int doopen(int unit, int command_byte) { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[unit]; +#else /* NEW_CONFIG */ struct psm_softc *sc = psm_softc[unit]; +#endif /* NEW_CONFIG */ int stat[3]; /* enable the mouse device */ @@ -721,6 +744,16 @@ /* psm driver entry points */ +#ifdef NEW_CONFIG + +#define endprobe(v) { if (bootverbose) \ + --verbose; \ + kbdc_set_device_mask(sc->kbdc, mask); \ + kbdc_lock(sc->kbdc, FALSE); \ + return (v); \ + } +#else + #define endprobe(v) { if (bootverbose) \ --verbose; \ kbdc_set_device_mask(sc->kbdc, mask); \ @@ -728,17 +761,28 @@ free(sc, M_DEVBUF); \ return (v); \ } +#endif +#ifdef NEW_CONFIG +static int +psm_init(struct psm_softc *sc, int iobase, int flags) +#else static int psmprobe(struct isa_device *dvp) +#endif { +#ifdef NEW_CONFIG + int unit = sc->psm_dev.dv_unit; /* XXX */ +#else int unit = dvp->id_unit; struct psm_softc *sc; +#endif int stat[3]; int command_byte; int mask; int i; +#ifndef NEW_CONFIG /* validate unit number */ if (unit >= NPSM) return (0); @@ -749,13 +793,20 @@ if (sc == NULL) return (0); bzero(sc, sizeof *sc); +#endif #if 0 kbdc_debug(TRUE); #endif +#ifdef NEW_CONFIG + sc->addr = iobase; + sc->kbdc = kbdc_open(sc->addr); + sc->config = flags & PSM_CONFIG_FLAGS; +#else sc->addr = dvp->id_iobase; sc->kbdc = kbdc_open(sc->addr); sc->config = dvp->id_flags & PSM_CONFIG_FLAGS; +#endif sc->flags = 0; if (bootverbose) ++verbose; @@ -764,7 +815,9 @@ printf("psm%d: unable to lock the controller.\n", unit); if (bootverbose) --verbose; +#ifndef NEW_CONFIG free(sc, M_DEVBUF); +#endif return (0); } @@ -978,20 +1031,56 @@ } /* done */ +#ifdef NEW_CONFIG + kbdc_set_device_mask(sc->kbdc, mask | KBD_AUX_CONTROL_BITS); + kbdc_lock(sc->kbdc, FALSE); + return (1); +#else psm_softc[unit] = sc; kbdc_set_device_mask(sc->kbdc, mask | KBD_AUX_CONTROL_BITS); kbdc_lock(sc->kbdc, FALSE); return (IO_PSMSIZE); +#endif } +#ifdef NEW_CONFIG +static int +psm_match(struct device *parent, struct cfdata *cf, void *aux) +{ + struct psm_softc dummy; + struct isa_softc *isa_sc = (struct isa_softc *)parent; + struct isa_attach_args *ia = (struct isa_attach_args *)aux; + int v; + + if (isa_sc->sc_sensitive) + return (0); /* psm is not sensitive device */ + bzero(&dummy, sizeof dummy); + ia->ia_compat.id_alive = IO_PSMSIZE; + + v = psm_init(&dummy, ia->ia_iobase, ia->ia_flags); + return (v); +} + +static void +psm_attach(struct device *parent, struct device *self, void *aux) +#else static int psmattach(struct isa_device *dvp) +#endif { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)self; + struct isa_attach_args *ia = (struct isa_attach_args *)aux; + + psm_init(sc, ia->ia_iobase, ia->ia_flags); + isa_register_intr(ia->ia_irq, &tty_imask, 0, psm_intr, (void *)sc); +#else int unit = dvp->id_unit; struct psm_softc *sc = psm_softc[unit]; if (sc == NULL) /* shouldn't happen */ return (0); +#endif /* Setup initial state */ sc->state = PSM_VALID; @@ -1007,7 +1096,7 @@ #endif /* DEVFS */ #ifdef NEW_CONFIG - printf(": "); + printf(": "); #endif /* NEW_CONFIG */ #ifdef PSM_HOOKAPM @@ -1053,7 +1142,9 @@ if (bootverbose) --verbose; +#ifndef NEW_CONFIG return (1); +#endif /* NEW_CONFIG */ } static int @@ -1070,7 +1161,11 @@ return (ENXIO); /* Get device data */ +#ifdef NEW_CONFIG + sc = (struct psm_softc *)psm_cd.cd_devs[unit]; +#else /* NEW_CONFIG */ sc = psm_softc[unit]; +#endif /* NEW_CONFIG */ if ((sc == NULL) || (sc->state & PSM_VALID) == 0) /* the device is no longer valid/functioning */ return (ENXIO); @@ -1144,7 +1239,11 @@ static int psmclose(dev_t dev, int flag, int fmt, struct proc *p) { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[PSM_UNIT(dev)]; +#else /* NEW_CONFIG */ struct psm_softc *sc = psm_softc[PSM_UNIT(dev)]; +#endif /* NEW_CONFIG */ int stat[3]; int command_byte; int s; @@ -1280,7 +1379,11 @@ static int psmread(dev_t dev, struct uio *uio, int flag) { +#ifdef NEW_CONFIG + register struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[PSM_UNIT(dev)]; +#else /* NEW_CONFIG */ register struct psm_softc *sc = psm_softc[PSM_UNIT(dev)]; +#endif /* NEW_CONFIG */ unsigned char buf[PSM_SMALLBUFSIZE]; int error = 0; int s; @@ -1406,7 +1509,11 @@ static int psmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[PSM_UNIT(dev)]; +#else /* NEW_CONFIG */ struct psm_softc *sc = psm_softc[PSM_UNIT(dev)]; +#endif /* NEW_CONFIG */ mousemode_t mode; mousestatus_t status; #if (defined(MOUSE_GETVARS)) @@ -1697,8 +1804,13 @@ return error; } +#ifdef NEW_CONFIG +void +psm_intr(void *arg) +#else /* NEW_CONFIG */ void psmintr(int unit) +#endif /* NEW_CONFIG */ { /* * the table to turn PS/2 mouse button bits (MOUSE_PS2_BUTTON?DOWN) @@ -1714,7 +1826,11 @@ MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN, MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN }; +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)arg; +#else /* NEW_CONFIG */ register struct psm_softc *sc = psm_softc[unit]; +#endif /* NEW_CONFIG */ mousestatus_t ms; int x, y, z; int c; @@ -1869,7 +1985,11 @@ static int psmpoll(dev_t dev, int events, struct proc *p) { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[PSM_UNIT(dev)]; +#else /* NEW_CONFIG */ struct psm_softc *sc = psm_softc[PSM_UNIT(dev)]; +#endif /* NEW_CONFIG */ int s; int revents = 0; @@ -2152,7 +2272,11 @@ static int psmresume(void *dummy) { +#ifdef NEW_CONFIG + struct psm_softc *sc = (struct psm_softc *)psm_cd.cd_devs[(int)dummy]; +#else /* NEW_CONFIG */ struct psm_softc *sc = psm_softc[(int)dummy]; +#endif /* NEW_CONFIG */ int unit = (int)dummy; int err = 0; int s;