patch-2.3.31 linux/drivers/char/joystick/joy-db9.c

Next file: linux/drivers/char/joystick/joy-gravis.c
Previous file: linux/drivers/char/joystick/joy-creative.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.30/linux/drivers/char/joystick/joy-db9.c linux/drivers/char/joystick/joy-db9.c
@@ -1,7 +1,10 @@
 /*
- * joy-db9.c  Version 0.5V
+ *  joy-db9.c  Version 0.6V
  *
- * Copyright (c) 1998 Andree Borrmann
+ *  Copyright (c) 1998 Andree Borrmann
+ *  Copyright (c) 1999 Vojtech Pavlik
+ *
+ *  Sponsored by SuSE
  */
 
 /*
@@ -24,6 +27,10 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Should you need to contact me, the author, you can do so either by
+ * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
+ * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
  */
 
 #include <asm/io.h>
@@ -35,8 +42,9 @@
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/delay.h>
+#include <linux/init.h>
 
-MODULE_AUTHOR("Andree Borrmann <A.Borrmann@tu-bs.de>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
 MODULE_PARM(js_db9, "2i");
 MODULE_PARM(js_db9_2, "2i");
 MODULE_PARM(js_db9_3, "2i");
@@ -48,7 +56,8 @@
 #define JS_GENESIS6_PAD	0x06
 #define JS_SATURN_PAD	0x07
 #define JS_MULTI_0802	0x08
-#define JS_MAX_PAD	0x09
+#define JS_MULTI_0802_2	0x09
+#define JS_MAX_PAD	0x0A
 
 #define JS_DB9_UP	0x01
 #define JS_DB9_DOWN	0x02
@@ -59,8 +68,8 @@
 #define JS_DB9_FIRE3	0x40
 #define JS_DB9_FIRE4	0x80
 
-#define JS_DB9_NORMAL	0x22
-#define JS_DB9_NOSELECT	0x20
+#define JS_DB9_NORMAL	0x2a
+#define JS_DB9_NOSELECT	0x28
 
 #define JS_DB9_SATURN0	0x20
 #define JS_DB9_SATURN1	0x22
@@ -76,11 +85,7 @@
 static int js_db9_3[] __initdata = { -1, 0 };
 
 struct js_db9_info {
-#ifdef USE_PARPORT
 	struct pardevice *port;	/* parport device */
-#else
-	int port;		/* hw port */
-#endif
 	int mode;		/* pad mode */
 };
 
@@ -95,6 +100,15 @@
 
 	switch(info->mode)
 	{
+	  case JS_MULTI_0802_2:
+
+		data = JS_PAR_DATA_IN(info->port) >> 3;
+
+		axes[1][1] = (data&JS_DB9_DOWN ?0:1) - (data&JS_DB9_UP  ?0:1);
+		axes[1][0] = (data&JS_DB9_RIGHT?0:1) - (data&JS_DB9_LEFT?0:1);
+
+		buttons[1][0] = (data&JS_DB9_FIRE1?0:1);
+
 	  case JS_MULTI_0802:
 
 		data = JS_PAR_STATUS(info->port) >> 3;
@@ -185,11 +199,12 @@
 		udelay(JS_GENESIS6_DELAY);
 		JS_PAR_CTRL_OUT(JS_DB9_NOSELECT, info->port); /* 3 */
 		udelay(JS_GENESIS6_DELAY);
-		JS_PAR_CTRL_OUT(JS_DB9_NORMAL, info->port);
 		data=JS_PAR_DATA_IN(info->port);
 
-		buttons[0][0] |= (data&JS_DB9_LEFT?0:0x10) | (data&JS_DB9_DOWN?0:0x20) | (data&JS_DB9_UP?0:0x40);
+		buttons[0][0] |= (data&JS_DB9_LEFT?0:0x10) | (data&JS_DB9_DOWN ?0:0x20) |
+				 (data&JS_DB9_UP  ?0:0x40) | (data&JS_DB9_RIGHT?0:0x80);
 
+		JS_PAR_CTRL_OUT(JS_DB9_NORMAL, info->port);
 		udelay(JS_GENESIS6_DELAY);
 		JS_PAR_CTRL_OUT(JS_DB9_NOSELECT, info->port); /* 4 */
 		udelay(JS_GENESIS6_DELAY);
@@ -236,11 +251,11 @@
 	struct js_db9_info *info = dev->port->info;
 
 	if (!MOD_IN_USE) {
-#ifdef USE_PARPORT
 		if (parport_claim(info->port)) return -EBUSY;
-#endif
 
-		JS_PAR_ECTRL_OUT(0x35,info->port);		/* enable PS/2 mode: */
+		JS_PAR_DATA_OUT(0xff, info->port);
+		if (info->mode != JS_MULTI_0802)
+			JS_PAR_ECTRL_OUT(0x35,info->port);	/* enable PS/2 mode: */
 		JS_PAR_CTRL_OUT(JS_DB9_NORMAL,info->port);	/* reverse direction, enable Select signal */
 	}
 		
@@ -260,12 +275,11 @@
 
 	if (!MOD_IN_USE) {
 
-		JS_PAR_CTRL_OUT(0x00,info->port);	/* normal direction */
-		JS_PAR_ECTRL_OUT(0x15,info->port);	/* enable normal mode */
+		JS_PAR_CTRL_OUT(0x00,info->port);		/* normal direction */
+		if (info->mode != JS_MULTI_0802)
+			JS_PAR_ECTRL_OUT(0x15,info->port);	/* enable normal mode */
 
-#ifdef USE_PARPORT
 		parport_release(info->port);
-#endif
 	}
 	return 0;
 }
@@ -274,16 +288,15 @@
 void cleanup_module(void)
 {
 	struct js_db9_info *info;
+	int i;
 
-	while (js_db9_port != NULL) {
-		js_unregister_device(js_db9_port->devs[0]);
+	while (js_db9_port) {
 		info = js_db9_port->info;
-#ifdef USE_PARPORT
+
+		for (i = 0; i < js_db9_port->ndevs; i++)
+			if (js_db9_port->devs[i])
+				js_unregister_device(js_db9_port->devs[i]);
 		parport_unregister_device(info->port);
-#else
-		release_region(info->port, 3);
-		release_region(info->port+0x402, 1);
-#endif
 		js_db9_port = js_unregister_port(js_db9_port);
 	}
 
@@ -295,17 +308,17 @@
  * db9 gamepads.
  */
 
-static void __init js_db9_init_corr(struct js_corr **corr)
+static void __init js_db9_init_corr(struct js_corr *corr)
 {
 	int i;
 
 	for (i = 0; i < 2; i++) {
-		corr[0][i].type = JS_CORR_BROKEN;
-		corr[0][i].prec = 0;
-		corr[0][i].coef[0] = 0;
-		corr[0][i].coef[1] = 0;
-		corr[0][i].coef[2] = (1 << 29);
-		corr[0][i].coef[3] = (1 << 29);
+		corr[i].type = JS_CORR_BROKEN;
+		corr[i].prec = 0;
+		corr[i].coef[0] = 0;
+		corr[i].coef[1] = 0;
+		corr[i].coef[2] = (1 << 29);
+		corr[i].coef[3] = (1 << 29);
 	}
 }
 
@@ -316,75 +329,76 @@
 static struct js_port __init *js_db9_probe(int *config, struct js_port *port)
 {
 	struct js_db9_info info;
-	char buttons[JS_MAX_PAD] = {0,1,2,4,0,6,7,8,1};
+	struct parport *pp;
+	int i;
+	char buttons[JS_MAX_PAD] = {0,1,2,4,0,6,8,8,1,1};
 	char *name[JS_MAX_PAD] = {NULL, "Multisystem joystick", "Multisystem joystick (2 fire)", "Genesis pad",
-					NULL, "Genesis 5 pad", "Genesis 6 pad", "Saturn pad", "Multisystem (0.8.0.2) joystick"};
+					NULL, "Genesis 5 pad", "Genesis 6 pad", "Saturn pad", "Multisystem (0.8.0.2) joystick",
+					"Multisystem (0.8.0.2-dual) joystick"};
 
 	if (config[0] < 0) return port;
 	if (config[1] < 0 || config[1] >= JS_MAX_PAD || !name[config[1]]) return port;
 
-#ifdef USE_PARPORT
-	{
-		struct parport *pp;
+	info.mode = config[1];
 
-		if (config[0] > 0x10)
-			for (pp=parport_enumerate(); pp != NULL && (pp->base!=config[0]); pp=pp->next);
-		else
-			for (pp=parport_enumerate(); pp != NULL && (config[0]>0); pp=pp->next) config[0]--;
-
-		if (pp == NULL) {
-			printk(KERN_ERR "joy-db9: no such parport\n");
-			return port;
-		}
-
-		if (!(pp->modes & PARPORT_MODE_TRISTATE)) {
-			printk(KERN_ERR "js-db9: specified parport is not bidirectional\n");
-			return port;
-		}
-
-		info.port = parport_register_device(pp, "joystick (db9)", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
-		if (!info.port)
-			return port;
+	if (config[0] > 0x10)
+		for (pp=parport_enumerate(); pp && (pp->base!=config[0]); pp=pp->next);
+	else
+		for (pp=parport_enumerate(); pp && (config[0]>0); pp=pp->next) config[0]--;
+
+	if (!pp) {
+		printk(KERN_ERR "joy-db9: no such parport\n");
+		return port;
 	}
-#else
-	info.port = config[0];
-	if (check_region(info.port, 3) || check_region(info.port+0x402,1)) return port;
-	request_region(info.port, 3, "joystick (db9)");
-	request_region(info.port+0x402, 1, "joystick (db9)");
-#endif
 
-	info.mode = config[1];
+	if (!(pp->modes & (PARPORT_MODE_PCPS2 | PARPORT_MODE_PCECPPS2)) && info.mode != JS_MULTI_0802) {
+		printk(KERN_ERR "js-db9: specified parport is not bidirectional\n");
+		return port;
+	}
 
-	port = js_register_port(port, &info, 1, sizeof(struct js_db9_info), js_db9_read);
+	info.port = parport_register_device(pp, "joystick (db9)", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
+	if (!info.port)
+		return port;
+
+	port = js_register_port(port, &info, 1 + (info.mode == JS_MULTI_0802_2), sizeof(struct js_db9_info), js_db9_read);
+
+	for (i = 0; i < 1 + (info.mode == JS_MULTI_0802_2); i++) {
+		printk(KERN_INFO "js%d: %s on %s\n",
+			js_register_device(port, i, 2, buttons[info.mode], name[info.mode], js_db9_open, js_db9_close),
+			name[info.mode], info.port->port->name);
 
-#ifdef USE_PARPORT
-	printk(KERN_INFO "js%d: %s on %s\n",
-		js_register_device(port, 0, 2, buttons[info.mode], name[info.mode], js_db9_open, js_db9_close),
-		name[info.mode], info.port->port->name);
-#else
-	printk(KERN_INFO "js%d: %s at %#x\n",
-		js_register_device(port, 0, 2, buttons[info.mode], name[info.mode], js_db9_open, js_db9_close),
-		name[info.mode], info.port);
-#endif
+		js_db9_init_corr(port->corr[i]);
+	}
 
-	js_db9_init_corr(port->corr);
 
 	return port;
 }
 
 #ifndef MODULE
-void __init js_db9_setup(char *str, int *ints)
+int __init js_db9_setup(SETUP_PARAM)
 {
 	int i;
-
-	if (!strcmp(str,"js_db9"))
-		for (i = 0; i <= ints[0] && i < 2; i++) js_db9[i] = ints[i+1];
-	if (!strcmp(str,"js_db9_2"))
-		for (i = 0; i <= ints[0] && i < 2; i++) js_db9_2[i] = ints[i+1];
-	if (!strcmp(str,"js_db9_3"))
-		for (i = 0; i <= ints[0] && i < 2; i++) js_db9_3[i] = ints[i+1];
-
+	SETUP_PARSE(2);
+	for (i = 0; i <= ints[0] && i < 2; i++) js_db9[i] = ints[i+1];
+	return 1;
+}
+int __init js_db9_setup_2(SETUP_PARAM)
+{
+	int i;
+	SETUP_PARSE(2);
+	for (i = 0; i <= ints[0] && i < 2; i++) js_db9_2[i] = ints[i+1];
+	return 1;
+}
+int __init js_db9_setup_3(SETUP_PARAM)
+{
+	int i;
+	SETUP_PARSE(2);
+	for (i = 0; i <= ints[0] && i < 2; i++) js_db9_3[i] = ints[i+1];
+	return 1;
 }
+__setup("js_db9=", js_db9_setup);
+__setup("js_db9_2=", js_db9_setup_2);
+__setup("js_db9_3=", js_db9_setup_3);
 #endif
 
 #ifdef MODULE

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)