Subject: wsmouse for sun mouse
To: None <port-sparc@netbsd.org, port-sparc64@netbsd.org>
From: Andrey Petrov <petrov@netbsd.org>
List: port-sparc64
Date: 05/20/2003 23:51:41
Hi,

This patch implements wsmouse fro sun's mouse. I tested it on sparc64,
and am going to do test build for sparc. As usually I appreciate comments.

Thanks,
	Andrey

Index: ms.c
===================================================================
RCS file: /cvsroot/src/sys/dev/sun/ms.c,v
retrieving revision 1.23
diff -u -p -r1.23 ms.c
--- ms.c	2002/10/23 09:13:56	1.23
+++ ms.c	2003/05/20 23:46:01
@@ -79,7 +79,11 @@ __KERNEL_RCSID(0, "$NetBSD: ms.c,v 1.23 
 #include <dev/sun/event_var.h>
 #include <dev/sun/msvar.h>
 
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsmousevar.h>
+
 #include "locators.h"
+#include "wsmouse.h"
 
 extern struct cfdriver ms_cd;
 
@@ -315,6 +319,19 @@ ms_input(ms, c)
 		/* NOTREACHED */
 	}
 
+#if NWSMOUSE > 0
+	if (ms->ms_wsmousedev != NULL && ms->ms_ready == 2) {
+		mb = ((ms->ms_mb & 4) >> 2) |
+			(ms->ms_mb & 2) |
+			((ms->ms_mb & 1) << 2);
+		wsmouse_input(ms->ms_wsmousedev,
+			      mb, ms->ms_dx, ms->ms_dy, 0,
+			      WSMOUSE_INPUT_DELTA);
+		ms->ms_dx = 0;
+		ms->ms_dy = 0;
+		return;
+	}
+#endif
 	/*
 	 * We have at least one event (mouse button, delta-X, or
 	 * delta-Y; possibly all three, and possibly three separate
Index: msvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/sun/msvar.h,v
retrieving revision 1.3
diff -u -p -r1.3 msvar.h
--- msvar.h	2001/12/09 12:02:06	1.3
+++ msvar.h	2003/05/20 23:46:01
@@ -111,6 +111,8 @@ struct ms_softc {
 	 */
 	volatile int ms_ready;		/* event queue is ready */
 	struct	evvar ms_events;	/* event queue state */
+
+	struct device *ms_wsmousedev;
 };
 
 /* front-end call back for mouse input */
Index: sunms.c
===================================================================
RCS file: /cvsroot/src/sys/dev/sun/sunms.c,v
retrieving revision 1.13
diff -u -p -r1.13 sunms.c
--- sunms.c	2003/01/19 16:53:53	1.13
+++ sunms.c	2003/05/20 23:46:01
@@ -80,7 +80,11 @@ __KERNEL_RCSID(0, "$NetBSD: sunms.c,v 1.
 #include <dev/sun/msvar.h>
 #include <dev/sun/kbd_ms_ttyvar.h>
 
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsmousevar.h>
+
 #include "ms.h"
+#include "wsmouse.h"
 #if NMS > 0
 
 #ifdef SUN_MS_BPS
@@ -101,6 +105,16 @@ struct  linesw sunms_disc =
 	{ "sunms", 8, ttylopen, ttylclose, ttyerrio, ttyerrio, ttynullioctl,
 	  sunmsinput, ttstart, nullmodem, ttpoll };	/* 8- SUNMOUSEDISC */
 
+int	sunms_enable(void *);
+int	sunms_ioctl(void *, u_long, caddr_t, int, struct proc *);
+void	sunms_disable(void *);
+
+const struct wsmouse_accessops	sunms_accessops = {
+	sunms_enable,
+	sunms_ioctl,
+	sunms_disable,
+};
+
 /*
  * ms_match: how is this zs channel configured?
  */
@@ -132,6 +146,9 @@ sunms_attach(parent, self, aux)
 	struct cfdata *cf;
 	struct tty *tp = args->kmta_tp;
 	int ms_unit;
+#if NWSMOUSE > 0
+	struct wsmousedev_attach_args a;
+#endif
 
 	cf = ms->ms_dev.dv_cfdata;
 	ms_unit = ms->ms_dev.dv_unit;
@@ -151,6 +168,16 @@ sunms_attach(parent, self, aux)
 
 	/* Initialize translator. */
 	ms->ms_byteno = -1;
+
+#if NWSMOUSE > 0
+	/*
+	 * attach wsmouse
+	 */
+	a.accessops = &sunms_accessops;
+	a.accesscookie = ms;
+
+	ms->ms_wsmousedev = config_found(self, &a, wsmousedevprint);
+#endif
 }
 
 /*
@@ -202,5 +229,60 @@ sunmsinput(c, tp)
 	/* Pass this up to the "middle" layer. */
 	ms_input(ms, c);
 	return (0);
+}
+
+int
+sunms_ioctl(v, cmd, data, flag, p)
+	void *v;
+	u_long cmd;
+	caddr_t data;
+	int flag;
+	struct proc *p;
+{
+/*	struct ms_softc *sc = v; */
+
+	switch (cmd) {
+	case WSMOUSEIO_GTYPE:
+		*(u_int *)data = WSMOUSE_TYPE_PS2; /* XXX  */
+		break;
+		
+	default:
+		return (EPASSTHROUGH);
+	}
+	return (0);
+}
+
+int
+sunms_enable(v)
+	void *v;
+{
+	struct ms_softc *ms = v;
+	int err;
+	int s;
+
+	if (ms->ms_ready)
+		return EBUSY;
+
+	err = sunmsiopen(v, 0);
+	if (err)
+		return err;
+
+	s = spltty();
+	ms->ms_ready = 2;
+	splx(s);
+
+	return 0;
+}
+
+void
+sunms_disable(v)
+	void *v;
+{
+	struct ms_softc *ms = v;
+	int s;
+
+	s = spltty();
+	ms->ms_ready = 0;
+	splx(s);
 }
 #endif
Index: files.sun
===================================================================
RCS file: /cvsroot/src/sys/dev/sun/files.sun,v
retrieving revision 1.7
diff -u -p -r1.7 files.sun
--- files.sun	2003/01/24 16:54:35	1.7
+++ files.sun	2003/05/20 23:46:01
@@ -35,7 +35,7 @@ file	dev/sun/wskbdmap_sun.c		kbd & wskbd
 
 # upper layer of sun ms driver
 # XXX: middle layer for sun serial mice (split out?)
-device ms: firm_events
+device ms: firm_events, wsmousedev
 file	dev/sun/ms.c			ms needs-flag
 
 # e.g. - lower layer: sun (mouse systems) mouse at zs