Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
db9.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1999-2001 Vojtech Pavlik
3  *
4  * Based on the work of:
5  * Andree Borrmann Mats Sjövall
6  */
7 
8 /*
9  * Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver for Linux
10  */
11 
12 /*
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26  *
27  * Should you need to contact me, the author, you can do so either by
28  * e-mail - mail your message to <[email protected]>, or by paper mail:
29  * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
30  */
31 
32 #include <linux/kernel.h>
33 #include <linux/module.h>
34 #include <linux/delay.h>
35 #include <linux/init.h>
36 #include <linux/parport.h>
37 #include <linux/input.h>
38 #include <linux/mutex.h>
39 #include <linux/slab.h>
40 
41 MODULE_AUTHOR("Vojtech Pavlik <[email protected]>");
42 MODULE_DESCRIPTION("Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver");
43 MODULE_LICENSE("GPL");
44 
45 struct db9_config {
46  int args[2];
47  unsigned int nargs;
48 };
49 
50 #define DB9_MAX_PORTS 3
51 static struct db9_config db9_cfg[DB9_MAX_PORTS] __initdata;
52 
53 module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0);
54 MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)");
55 module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[1].nargs, 0);
56 MODULE_PARM_DESC(dev2, "Describes second attached device (<parport#>,<type>)");
57 module_param_array_named(dev3, db9_cfg[2].args, int, &db9_cfg[2].nargs, 0);
58 MODULE_PARM_DESC(dev3, "Describes third attached device (<parport#>,<type>)");
59 
60 #define DB9_ARG_PARPORT 0
61 #define DB9_ARG_MODE 1
62 
63 #define DB9_MULTI_STICK 0x01
64 #define DB9_MULTI2_STICK 0x02
65 #define DB9_GENESIS_PAD 0x03
66 #define DB9_GENESIS5_PAD 0x05
67 #define DB9_GENESIS6_PAD 0x06
68 #define DB9_SATURN_PAD 0x07
69 #define DB9_MULTI_0802 0x08
70 #define DB9_MULTI_0802_2 0x09
71 #define DB9_CD32_PAD 0x0A
72 #define DB9_SATURN_DPP 0x0B
73 #define DB9_SATURN_DPP_2 0x0C
74 #define DB9_MAX_PAD 0x0D
75 
76 #define DB9_UP 0x01
77 #define DB9_DOWN 0x02
78 #define DB9_LEFT 0x04
79 #define DB9_RIGHT 0x08
80 #define DB9_FIRE1 0x10
81 #define DB9_FIRE2 0x20
82 #define DB9_FIRE3 0x40
83 #define DB9_FIRE4 0x80
84 
85 #define DB9_NORMAL 0x0a
86 #define DB9_NOSELECT 0x08
87 
88 #define DB9_GENESIS6_DELAY 14
89 #define DB9_REFRESH_TIME HZ/100
90 
91 #define DB9_MAX_DEVICES 2
92 
93 struct db9_mode_data {
94  const char *name;
95  const short *buttons;
96  int n_buttons;
97  int n_pads;
98  int n_axis;
100  int reverse;
101 };
102 
103 struct db9 {
104  struct input_dev *dev[DB9_MAX_DEVICES];
106  struct pardevice *pd;
107  int mode;
108  int used;
109  struct mutex mutex;
111 };
112 
113 static struct db9 *db9_base[3];
114 
115 static const short db9_multi_btn[] = { BTN_TRIGGER, BTN_THUMB };
116 static const short db9_genesis_btn[] = { BTN_START, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_MODE };
117 static const short db9_cd32_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_START };
118 static const short db9_abs[] = { ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_RZ, ABS_Z, ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y };
119 
120 static const struct db9_mode_data db9_modes[] = {
121  { NULL, NULL, 0, 0, 0, 0, 0 },
122  { "Multisystem joystick", db9_multi_btn, 1, 1, 2, 1, 1 },
123  { "Multisystem joystick (2 fire)", db9_multi_btn, 2, 1, 2, 1, 1 },
124  { "Genesis pad", db9_genesis_btn, 4, 1, 2, 1, 1 },
125  { NULL, NULL, 0, 0, 0, 0, 0 },
126  { "Genesis 5 pad", db9_genesis_btn, 6, 1, 2, 1, 1 },
127  { "Genesis 6 pad", db9_genesis_btn, 8, 1, 2, 1, 1 },
128  { "Saturn pad", db9_cd32_btn, 9, 6, 7, 0, 1 },
129  { "Multisystem (0.8.0.2) joystick", db9_multi_btn, 1, 1, 2, 1, 1 },
130  { "Multisystem (0.8.0.2-dual) joystick", db9_multi_btn, 1, 2, 2, 1, 1 },
131  { "Amiga CD-32 pad", db9_cd32_btn, 7, 1, 2, 1, 1 },
132  { "Saturn dpp", db9_cd32_btn, 9, 6, 7, 0, 0 },
133  { "Saturn dpp dual", db9_cd32_btn, 9, 12, 7, 0, 0 },
134 };
135 
136 /*
137  * Saturn controllers
138  */
139 #define DB9_SATURN_DELAY 300
140 static const int db9_saturn_byte[] = { 1, 1, 1, 2, 2, 2, 2, 2, 1 };
141 static const unsigned char db9_saturn_mask[] = { 0x04, 0x01, 0x02, 0x40, 0x20, 0x10, 0x08, 0x80, 0x08 };
142 
143 /*
144  * db9_saturn_write_sub() writes 2 bit data.
145  */
146 static void db9_saturn_write_sub(struct parport *port, int type, unsigned char data, int powered, int pwr_sub)
147 {
148  unsigned char c;
149 
150  switch (type) {
151  case 1: /* DPP1 */
152  c = 0x80 | 0x30 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | data;
153  parport_write_data(port, c);
154  break;
155  case 2: /* DPP2 */
156  c = 0x40 | data << 4 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | 0x03;
157  parport_write_data(port, c);
158  break;
159  case 0: /* DB9 */
160  c = ((((data & 2) ? 2 : 0) | ((data & 1) ? 4 : 0)) ^ 0x02) | !powered;
161  parport_write_control(port, c);
162  break;
163  }
164 }
165 
166 /*
167  * gc_saturn_read_sub() reads 4 bit data.
168  */
169 static unsigned char db9_saturn_read_sub(struct parport *port, int type)
170 {
171  unsigned char data;
172 
173  if (type) {
174  /* DPP */
175  data = parport_read_status(port) ^ 0x80;
176  return (data & 0x80 ? 1 : 0) | (data & 0x40 ? 2 : 0)
177  | (data & 0x20 ? 4 : 0) | (data & 0x10 ? 8 : 0);
178  } else {
179  /* DB9 */
180  data = parport_read_data(port) & 0x0f;
181  return (data & 0x8 ? 1 : 0) | (data & 0x4 ? 2 : 0)
182  | (data & 0x2 ? 4 : 0) | (data & 0x1 ? 8 : 0);
183  }
184 }
185 
186 /*
187  * db9_saturn_read_analog() sends clock and reads 8 bit data.
188  */
189 static unsigned char db9_saturn_read_analog(struct parport *port, int type, int powered)
190 {
191  unsigned char data;
192 
193  db9_saturn_write_sub(port, type, 0, powered, 0);
195  data = db9_saturn_read_sub(port, type) << 4;
196  db9_saturn_write_sub(port, type, 2, powered, 0);
198  data |= db9_saturn_read_sub(port, type);
199  return data;
200 }
201 
202 /*
203  * db9_saturn_read_packet() reads whole saturn packet at connector
204  * and returns device identifier code.
205  */
206 static unsigned char db9_saturn_read_packet(struct parport *port, unsigned char *data, int type, int powered)
207 {
208  int i, j;
209  unsigned char tmp;
210 
211  db9_saturn_write_sub(port, type, 3, powered, 0);
212  data[0] = db9_saturn_read_sub(port, type);
213  switch (data[0] & 0x0f) {
214  case 0xf:
215  /* 1111 no pad */
216  return data[0] = 0xff;
217  case 0x4: case 0x4 | 0x8:
218  /* ?100 : digital controller */
219  db9_saturn_write_sub(port, type, 0, powered, 1);
220  data[2] = db9_saturn_read_sub(port, type) << 4;
221  db9_saturn_write_sub(port, type, 2, powered, 1);
222  data[1] = db9_saturn_read_sub(port, type) << 4;
223  db9_saturn_write_sub(port, type, 1, powered, 1);
224  data[1] |= db9_saturn_read_sub(port, type);
225  db9_saturn_write_sub(port, type, 3, powered, 1);
226  /* data[2] |= db9_saturn_read_sub(port, type); */
227  data[2] |= data[0];
228  return data[0] = 0x02;
229  case 0x1:
230  /* 0001 : analog controller or multitap */
231  db9_saturn_write_sub(port, type, 2, powered, 0);
233  data[0] = db9_saturn_read_analog(port, type, powered);
234  if (data[0] != 0x41) {
235  /* read analog controller */
236  for (i = 0; i < (data[0] & 0x0f); i++)
237  data[i + 1] = db9_saturn_read_analog(port, type, powered);
238  db9_saturn_write_sub(port, type, 3, powered, 0);
239  return data[0];
240  } else {
241  /* read multitap */
242  if (db9_saturn_read_analog(port, type, powered) != 0x60)
243  return data[0] = 0xff;
244  for (i = 0; i < 60; i += 10) {
245  data[i] = db9_saturn_read_analog(port, type, powered);
246  if (data[i] != 0xff)
247  /* read each pad */
248  for (j = 0; j < (data[i] & 0x0f); j++)
249  data[i + j + 1] = db9_saturn_read_analog(port, type, powered);
250  }
251  db9_saturn_write_sub(port, type, 3, powered, 0);
252  return 0x41;
253  }
254  case 0x0:
255  /* 0000 : mouse */
256  db9_saturn_write_sub(port, type, 2, powered, 0);
258  tmp = db9_saturn_read_analog(port, type, powered);
259  if (tmp == 0xff) {
260  for (i = 0; i < 3; i++)
261  data[i + 1] = db9_saturn_read_analog(port, type, powered);
262  db9_saturn_write_sub(port, type, 3, powered, 0);
263  return data[0] = 0xe3;
264  }
265  default:
266  return data[0];
267  }
268 }
269 
270 /*
271  * db9_saturn_report() analyzes packet and reports.
272  */
273 static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *devs[], int n, int max_pads)
274 {
275  struct input_dev *dev;
276  int tmp, i, j;
277 
278  tmp = (id == 0x41) ? 60 : 10;
279  for (j = 0; j < tmp && n < max_pads; j += 10, n++) {
280  dev = devs[n];
281  switch (data[j]) {
282  case 0x16: /* multi controller (analog 4 axis) */
283  input_report_abs(dev, db9_abs[5], data[j + 6]);
284  case 0x15: /* mission stick (analog 3 axis) */
285  input_report_abs(dev, db9_abs[3], data[j + 4]);
286  input_report_abs(dev, db9_abs[4], data[j + 5]);
287  case 0x13: /* racing controller (analog 1 axis) */
288  input_report_abs(dev, db9_abs[2], data[j + 3]);
289  case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */
290  case 0x02: /* digital pad (digital 2 axis + buttons) */
291  input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));
292  input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));
293  for (i = 0; i < 9; i++)
294  input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);
295  break;
296  case 0x19: /* mission stick x2 (analog 6 axis + buttons) */
297  input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));
298  input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));
299  for (i = 0; i < 9; i++)
300  input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);
301  input_report_abs(dev, db9_abs[2], data[j + 3]);
302  input_report_abs(dev, db9_abs[3], data[j + 4]);
303  input_report_abs(dev, db9_abs[4], data[j + 5]);
304  /*
305  input_report_abs(dev, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1));
306  input_report_abs(dev, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1));
307  */
308  input_report_abs(dev, db9_abs[6], data[j + 7]);
309  input_report_abs(dev, db9_abs[7], data[j + 8]);
310  input_report_abs(dev, db9_abs[5], data[j + 9]);
311  break;
312  case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */
313  input_report_key(dev, BTN_A, data[j + 3] & 0x80);
314  input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f);
315  break;
316  case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */
317  input_report_key(dev, BTN_START, data[j + 1] & 0x08);
318  input_report_key(dev, BTN_A, data[j + 1] & 0x04);
319  input_report_key(dev, BTN_C, data[j + 1] & 0x02);
320  input_report_key(dev, BTN_B, data[j + 1] & 0x01);
321  input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80);
322  input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */
323  break;
324  case 0xff:
325  default: /* no pad */
326  input_report_abs(dev, db9_abs[0], 0);
327  input_report_abs(dev, db9_abs[1], 0);
328  for (i = 0; i < 9; i++)
329  input_report_key(dev, db9_cd32_btn[i], 0);
330  break;
331  }
332  }
333  return n;
334 }
335 
336 static int db9_saturn(int mode, struct parport *port, struct input_dev *devs[])
337 {
338  unsigned char id, data[60];
339  int type, n, max_pads;
340  int tmp, i;
341 
342  switch (mode) {
343  case DB9_SATURN_PAD:
344  type = 0;
345  n = 1;
346  break;
347  case DB9_SATURN_DPP:
348  type = 1;
349  n = 1;
350  break;
351  case DB9_SATURN_DPP_2:
352  type = 1;
353  n = 2;
354  break;
355  default:
356  return -1;
357  }
358  max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES);
359  for (tmp = 0, i = 0; i < n; i++) {
360  id = db9_saturn_read_packet(port, data, type + i, 1);
361  tmp = db9_saturn_report(id, data, devs, tmp, max_pads);
362  }
363  return 0;
364 }
365 
366 static void db9_timer(unsigned long private)
367 {
368  struct db9 *db9 = (void *) private;
369  struct parport *port = db9->pd->port;
370  struct input_dev *dev = db9->dev[0];
371  struct input_dev *dev2 = db9->dev[1];
372  int data, i;
373 
374  switch (db9->mode) {
375  case DB9_MULTI_0802_2:
376 
377  data = parport_read_data(port) >> 3;
378 
379  input_report_abs(dev2, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
380  input_report_abs(dev2, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
381  input_report_key(dev2, BTN_TRIGGER, ~data & DB9_FIRE1);
382 
383  case DB9_MULTI_0802:
384 
385  data = parport_read_status(port) >> 3;
386 
387  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
388  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
389  input_report_key(dev, BTN_TRIGGER, data & DB9_FIRE1);
390  break;
391 
392  case DB9_MULTI_STICK:
393 
394  data = parport_read_data(port);
395 
396  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
397  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
398  input_report_key(dev, BTN_TRIGGER, ~data & DB9_FIRE1);
399  break;
400 
401  case DB9_MULTI2_STICK:
402 
403  data = parport_read_data(port);
404 
405  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
406  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
407  input_report_key(dev, BTN_TRIGGER, ~data & DB9_FIRE1);
408  input_report_key(dev, BTN_THUMB, ~data & DB9_FIRE2);
409  break;
410 
411  case DB9_GENESIS_PAD:
412 
414  data = parport_read_data(port);
415 
416  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
417  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
418  input_report_key(dev, BTN_B, ~data & DB9_FIRE1);
419  input_report_key(dev, BTN_C, ~data & DB9_FIRE2);
420 
422  data = parport_read_data(port);
423 
424  input_report_key(dev, BTN_A, ~data & DB9_FIRE1);
425  input_report_key(dev, BTN_START, ~data & DB9_FIRE2);
426  break;
427 
428  case DB9_GENESIS5_PAD:
429 
431  data = parport_read_data(port);
432 
433  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
434  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
435  input_report_key(dev, BTN_B, ~data & DB9_FIRE1);
436  input_report_key(dev, BTN_C, ~data & DB9_FIRE2);
437 
439  data = parport_read_data(port);
440 
441  input_report_key(dev, BTN_A, ~data & DB9_FIRE1);
442  input_report_key(dev, BTN_X, ~data & DB9_FIRE2);
443  input_report_key(dev, BTN_Y, ~data & DB9_LEFT);
444  input_report_key(dev, BTN_START, ~data & DB9_RIGHT);
445  break;
446 
447  case DB9_GENESIS6_PAD:
448 
449  parport_write_control(port, DB9_NOSELECT); /* 1 */
451  data = parport_read_data(port);
452 
453  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
454  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
455  input_report_key(dev, BTN_B, ~data & DB9_FIRE1);
456  input_report_key(dev, BTN_C, ~data & DB9_FIRE2);
457 
460  data = parport_read_data(port);
461 
462  input_report_key(dev, BTN_A, ~data & DB9_FIRE1);
463  input_report_key(dev, BTN_START, ~data & DB9_FIRE2);
464 
465  parport_write_control(port, DB9_NOSELECT); /* 2 */
469  parport_write_control(port, DB9_NOSELECT); /* 3 */
471  data=parport_read_data(port);
472 
473  input_report_key(dev, BTN_X, ~data & DB9_LEFT);
474  input_report_key(dev, BTN_Y, ~data & DB9_DOWN);
475  input_report_key(dev, BTN_Z, ~data & DB9_UP);
476  input_report_key(dev, BTN_MODE, ~data & DB9_RIGHT);
477 
480  parport_write_control(port, DB9_NOSELECT); /* 4 */
483  break;
484 
485  case DB9_SATURN_PAD:
486  case DB9_SATURN_DPP:
487  case DB9_SATURN_DPP_2:
488 
489  db9_saturn(db9->mode, port, db9->dev);
490  break;
491 
492  case DB9_CD32_PAD:
493 
494  data = parport_read_data(port);
495 
496  input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1));
497  input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1));
498 
499  parport_write_control(port, 0x0a);
500 
501  for (i = 0; i < 7; i++) {
502  data = parport_read_data(port);
503  parport_write_control(port, 0x02);
504  parport_write_control(port, 0x0a);
505  input_report_key(dev, db9_cd32_btn[i], ~data & DB9_FIRE2);
506  }
507 
508  parport_write_control(port, 0x00);
509  break;
510  }
511 
512  input_sync(dev);
513 
514  mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME);
515 }
516 
517 static int db9_open(struct input_dev *dev)
518 {
519  struct db9 *db9 = input_get_drvdata(dev);
520  struct parport *port = db9->pd->port;
521  int err;
522 
523  err = mutex_lock_interruptible(&db9->mutex);
524  if (err)
525  return err;
526 
527  if (!db9->used++) {
528  parport_claim(db9->pd);
529  parport_write_data(port, 0xff);
530  if (db9_modes[db9->mode].reverse) {
531  parport_data_reverse(port);
533  }
534  mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME);
535  }
536 
537  mutex_unlock(&db9->mutex);
538  return 0;
539 }
540 
541 static void db9_close(struct input_dev *dev)
542 {
543  struct db9 *db9 = input_get_drvdata(dev);
544  struct parport *port = db9->pd->port;
545 
546  mutex_lock(&db9->mutex);
547  if (!--db9->used) {
548  del_timer_sync(&db9->timer);
549  parport_write_control(port, 0x00);
550  parport_data_forward(port);
551  parport_release(db9->pd);
552  }
553  mutex_unlock(&db9->mutex);
554 }
555 
556 static struct db9 __init *db9_probe(int parport, int mode)
557 {
558  struct db9 *db9;
559  const struct db9_mode_data *db9_mode;
560  struct parport *pp;
561  struct pardevice *pd;
562  struct input_dev *input_dev;
563  int i, j;
564  int err;
565 
566  if (mode < 1 || mode >= DB9_MAX_PAD || !db9_modes[mode].n_buttons) {
567  printk(KERN_ERR "db9.c: Bad device type %d\n", mode);
568  err = -EINVAL;
569  goto err_out;
570  }
571 
572  db9_mode = &db9_modes[mode];
573 
574  pp = parport_find_number(parport);
575  if (!pp) {
576  printk(KERN_ERR "db9.c: no such parport\n");
577  err = -ENODEV;
578  goto err_out;
579  }
580 
581  if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) {
582  printk(KERN_ERR "db9.c: specified parport is not bidirectional\n");
583  err = -EINVAL;
584  goto err_put_pp;
585  }
586 
588  if (!pd) {
589  printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n");
590  err = -EBUSY;
591  goto err_put_pp;
592  }
593 
594  db9 = kzalloc(sizeof(struct db9), GFP_KERNEL);
595  if (!db9) {
596  printk(KERN_ERR "db9.c: Not enough memory\n");
597  err = -ENOMEM;
598  goto err_unreg_pardev;
599  }
600 
601  mutex_init(&db9->mutex);
602  db9->pd = pd;
603  db9->mode = mode;
604  init_timer(&db9->timer);
605  db9->timer.data = (long) db9;
606  db9->timer.function = db9_timer;
607 
608  for (i = 0; i < (min(db9_mode->n_pads, DB9_MAX_DEVICES)); i++) {
609 
610  db9->dev[i] = input_dev = input_allocate_device();
611  if (!input_dev) {
612  printk(KERN_ERR "db9.c: Not enough memory for input device\n");
613  err = -ENOMEM;
614  goto err_unreg_devs;
615  }
616 
617  snprintf(db9->phys[i], sizeof(db9->phys[i]),
618  "%s/input%d", db9->pd->port->name, i);
619 
620  input_dev->name = db9_mode->name;
621  input_dev->phys = db9->phys[i];
622  input_dev->id.bustype = BUS_PARPORT;
623  input_dev->id.vendor = 0x0002;
624  input_dev->id.product = mode;
625  input_dev->id.version = 0x0100;
626 
627  input_set_drvdata(input_dev, db9);
628 
629  input_dev->open = db9_open;
630  input_dev->close = db9_close;
631 
632  input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
633  for (j = 0; j < db9_mode->n_buttons; j++)
634  set_bit(db9_mode->buttons[j], input_dev->keybit);
635  for (j = 0; j < db9_mode->n_axis; j++) {
636  if (j < 2)
637  input_set_abs_params(input_dev, db9_abs[j], -1, 1, 0, 0);
638  else
639  input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0);
640  }
641 
642  err = input_register_device(input_dev);
643  if (err)
644  goto err_free_dev;
645  }
646 
647  parport_put_port(pp);
648  return db9;
649 
650  err_free_dev:
651  input_free_device(db9->dev[i]);
652  err_unreg_devs:
653  while (--i >= 0)
654  input_unregister_device(db9->dev[i]);
655  kfree(db9);
656  err_unreg_pardev:
658  err_put_pp:
659  parport_put_port(pp);
660  err_out:
661  return ERR_PTR(err);
662 }
663 
664 static void db9_remove(struct db9 *db9)
665 {
666  int i;
667 
668  for (i = 0; i < min(db9_modes[db9->mode].n_pads, DB9_MAX_DEVICES); i++)
669  input_unregister_device(db9->dev[i]);
671  kfree(db9);
672 }
673 
674 static int __init db9_init(void)
675 {
676  int i;
677  int have_dev = 0;
678  int err = 0;
679 
680  for (i = 0; i < DB9_MAX_PORTS; i++) {
681  if (db9_cfg[i].nargs == 0 || db9_cfg[i].args[DB9_ARG_PARPORT] < 0)
682  continue;
683 
684  if (db9_cfg[i].nargs < 2) {
685  printk(KERN_ERR "db9.c: Device type must be specified.\n");
686  err = -EINVAL;
687  break;
688  }
689 
690  db9_base[i] = db9_probe(db9_cfg[i].args[DB9_ARG_PARPORT],
691  db9_cfg[i].args[DB9_ARG_MODE]);
692  if (IS_ERR(db9_base[i])) {
693  err = PTR_ERR(db9_base[i]);
694  break;
695  }
696 
697  have_dev = 1;
698  }
699 
700  if (err) {
701  while (--i >= 0)
702  if (db9_base[i])
703  db9_remove(db9_base[i]);
704  return err;
705  }
706 
707  return have_dev ? 0 : -ENODEV;
708 }
709 
710 static void __exit db9_exit(void)
711 {
712  int i;
713 
714  for (i = 0; i < DB9_MAX_PORTS; i++)
715  if (db9_base[i])
716  db9_remove(db9_base[i]);
717 }
718 
719 module_init(db9_init);
720 module_exit(db9_exit);