--- 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 <i386/isa/isa_device.h>
 #include <i386/isa/kbdio.h>
 
+#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;

