GNU Linux-libre 4.14.266-gnu1
[releases.git] / drivers / input / joystick / grip_mp.c
1 /*
2  *  Driver for the Gravis Grip Multiport, a gamepad "hub" that
3  *  connects up to four 9-pin digital gamepads/joysticks.
4  *  Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5.
5  *
6  *  Thanks to Chris Gassib for helpful advice.
7  *
8  *  Copyright (c)      2002 Brian Bonnlander, Bill Soudan
9  *  Copyright (c) 1998-2000 Vojtech Pavlik
10  */
11
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/gameport.h>
16 #include <linux/input.h>
17 #include <linux/delay.h>
18 #include <linux/proc_fs.h>
19 #include <linux/jiffies.h>
20
21 #define DRIVER_DESC     "Gravis Grip Multiport driver"
22
23 MODULE_AUTHOR("Brian Bonnlander");
24 MODULE_DESCRIPTION(DRIVER_DESC);
25 MODULE_LICENSE("GPL");
26
27 #ifdef GRIP_DEBUG
28 #define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg)
29 #else
30 #define dbg(format, arg...) do {} while (0)
31 #endif
32
33 #define GRIP_MAX_PORTS  4
34 /*
35  * Grip multiport state
36  */
37
38 struct grip_port {
39         struct input_dev *dev;
40         int mode;
41         int registered;
42
43         /* individual gamepad states */
44         int buttons;
45         int xaxes;
46         int yaxes;
47         int dirty;     /* has the state been updated? */
48 };
49
50 struct grip_mp {
51         struct gameport *gameport;
52         struct grip_port *port[GRIP_MAX_PORTS];
53         int reads;
54         int bads;
55 };
56
57 /*
58  * Multiport packet interpretation
59  */
60
61 #define PACKET_FULL          0x80000000       /* packet is full                        */
62 #define PACKET_IO_FAST       0x40000000       /* 3 bits per gameport read              */
63 #define PACKET_IO_SLOW       0x20000000       /* 1 bit per gameport read               */
64 #define PACKET_MP_MORE       0x04000000       /* multiport wants to send more          */
65 #define PACKET_MP_DONE       0x02000000       /* multiport done sending                */
66
67 /*
68  * Packet status code interpretation
69  */
70
71 #define IO_GOT_PACKET        0x0100           /* Got a packet                           */
72 #define IO_MODE_FAST         0x0200           /* Used 3 data bits per gameport read     */
73 #define IO_SLOT_CHANGE       0x0800           /* Multiport physical slot status changed */
74 #define IO_DONE              0x1000           /* Multiport is done sending packets      */
75 #define IO_RETRY             0x4000           /* Try again later to get packet          */
76 #define IO_RESET             0x8000           /* Force multiport to resend all packets  */
77
78 /*
79  * Gamepad configuration data.  Other 9-pin digital joystick devices
80  * may work with the multiport, so this may not be an exhaustive list!
81  * Commodore 64 joystick remains untested.
82  */
83
84 #define GRIP_INIT_DELAY         2000          /*  2 ms */
85
86 #define GRIP_MODE_NONE          0
87 #define GRIP_MODE_RESET         1
88 #define GRIP_MODE_GP            2
89 #define GRIP_MODE_C64           3
90
91 static const int grip_btn_gp[]  = { BTN_TR, BTN_TL, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, -1 };
92 static const int grip_btn_c64[] = { BTN_JOYSTICK, -1 };
93
94 static const int grip_abs_gp[]  = { ABS_X, ABS_Y, -1 };
95 static const int grip_abs_c64[] = { ABS_X, ABS_Y, -1 };
96
97 static const int *grip_abs[] = { NULL, NULL, grip_abs_gp, grip_abs_c64 };
98 static const int *grip_btn[] = { NULL, NULL, grip_btn_gp, grip_btn_c64 };
99
100 static const char *grip_name[] = { NULL, NULL, "Gravis Grip Pad", "Commodore 64 Joystick" };
101
102 static const int init_seq[] = {
103         1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
104         1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
105         1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
106         0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1 };
107
108 /* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
109
110 static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
111
112 static int register_slot(int i, struct grip_mp *grip);
113
114 /*
115  * Returns whether an odd or even number of bits are on in pkt.
116  */
117
118 static int bit_parity(u32 pkt)
119 {
120         int x = pkt ^ (pkt >> 16);
121         x ^= x >> 8;
122         x ^= x >> 4;
123         x ^= x >> 2;
124         x ^= x >> 1;
125         return x & 1;
126 }
127
128 /*
129  * Poll gameport; return true if all bits set in 'onbits' are on and
130  * all bits set in 'offbits' are off.
131  */
132
133 static inline int poll_until(u8 onbits, u8 offbits, int u_sec, struct gameport* gp, u8 *data)
134 {
135         int i, nloops;
136
137         nloops = gameport_time(gp, u_sec);
138         for (i = 0; i < nloops; i++) {
139                 *data = gameport_read(gp);
140                 if ((*data & onbits) == onbits &&
141                     (~(*data) & offbits) == offbits)
142                         return 1;
143         }
144         dbg("gameport timed out after %d microseconds.\n", u_sec);
145         return 0;
146 }
147
148 /*
149  * Gets a 28-bit packet from the multiport.
150  *
151  * After getting a packet successfully, commands encoded by sendcode may
152  * be sent to the multiport.
153  *
154  * The multiport clock value is reflected in gameport bit B4.
155  *
156  * Returns a packet status code indicating whether packet is valid, the transfer
157  * mode, and any error conditions.
158  *
159  * sendflags:      current I/O status
160  * sendcode:   data to send to the multiport if sendflags is nonzero
161  */
162
163 static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet)
164 {
165         u8  raw_data;            /* raw data from gameport */
166         u8  data_mask;           /* packet data bits from raw_data */
167         u32 pkt;                 /* packet temporary storage */
168         int bits_per_read;       /* num packet bits per gameport read */
169         int portvals = 0;        /* used for port value sanity check */
170         int i;
171
172         /* Gameport bits B0, B4, B5 should first be off, then B4 should come on. */
173
174         *packet = 0;
175         raw_data = gameport_read(gameport);
176         if (raw_data & 1)
177                 return IO_RETRY;
178
179         for (i = 0; i < 64; i++) {
180                 raw_data = gameport_read(gameport);
181                 portvals |= 1 << ((raw_data >> 4) & 3); /* Demux B4, B5 */
182         }
183
184         if (portvals == 1) {                            /* B4, B5 off */
185                 raw_data = gameport_read(gameport);
186                 portvals = raw_data & 0xf0;
187
188                 if (raw_data & 0x31)
189                         return IO_RESET;
190                 gameport_trigger(gameport);
191
192                 if (!poll_until(0x10, 0, 308, gameport, &raw_data))
193                         return IO_RESET;
194         } else
195                 return IO_RETRY;
196
197         /* Determine packet transfer mode and prepare for packet construction. */
198
199         if (raw_data & 0x20) {                 /* 3 data bits/read */
200                 portvals |= raw_data >> 4;     /* Compare B4-B7 before & after trigger */
201
202                 if (portvals != 0xb)
203                         return 0;
204                 data_mask = 7;
205                 bits_per_read = 3;
206                 pkt = (PACKET_FULL | PACKET_IO_FAST) >> 28;
207         } else {                                 /* 1 data bit/read */
208                 data_mask = 1;
209                 bits_per_read = 1;
210                 pkt = (PACKET_FULL | PACKET_IO_SLOW) >> 28;
211         }
212
213         /* Construct a packet.  Final data bits must be zero. */
214
215         while (1) {
216                 if (!poll_until(0, 0x10, 77, gameport, &raw_data))
217                         return IO_RESET;
218                 raw_data = (raw_data >> 5) & data_mask;
219
220                 if (pkt & PACKET_FULL)
221                         break;
222                 pkt = (pkt << bits_per_read) | raw_data;
223
224                 if (!poll_until(0x10, 0, 77, gameport, &raw_data))
225                         return IO_RESET;
226         }
227
228         if (raw_data)
229                 return IO_RESET;
230
231         /* If 3 bits/read used, drop from 30 bits to 28. */
232
233         if (bits_per_read == 3) {
234                 pkt = (pkt & 0xffff0000) | ((pkt << 1) & 0xffff);
235                 pkt = (pkt >> 2) | 0xf0000000;
236         }
237
238         if (bit_parity(pkt) == 1)
239                 return IO_RESET;
240
241         /* Acknowledge packet receipt */
242
243         if (!poll_until(0x30, 0, 77, gameport, &raw_data))
244                 return IO_RESET;
245
246         raw_data = gameport_read(gameport);
247
248         if (raw_data & 1)
249                 return IO_RESET;
250
251         gameport_trigger(gameport);
252
253         if (!poll_until(0, 0x20, 77, gameport, &raw_data))
254                 return IO_RESET;
255
256         /* Return if we just wanted the packet or multiport wants to send more */
257
258         *packet = pkt;
259         if ((sendflags == 0) || ((sendflags & IO_RETRY) && !(pkt & PACKET_MP_DONE)))
260                 return IO_GOT_PACKET;
261
262         if (pkt & PACKET_MP_MORE)
263                 return IO_GOT_PACKET | IO_RETRY;
264
265         /* Multiport is done sending packets and is ready to receive data */
266
267         if (!poll_until(0x20, 0, 77, gameport, &raw_data))
268                 return IO_GOT_PACKET | IO_RESET;
269
270         raw_data = gameport_read(gameport);
271         if (raw_data & 1)
272                 return IO_GOT_PACKET | IO_RESET;
273
274         /* Trigger gameport based on bits in sendcode */
275
276         gameport_trigger(gameport);
277         do {
278                 if (!poll_until(0x20, 0x10, 116, gameport, &raw_data))
279                         return IO_GOT_PACKET | IO_RESET;
280
281                 if (!poll_until(0x30, 0, 193, gameport, &raw_data))
282                         return IO_GOT_PACKET | IO_RESET;
283
284                 if (raw_data & 1)
285                         return IO_GOT_PACKET | IO_RESET;
286
287                 if (sendcode & 1)
288                         gameport_trigger(gameport);
289
290                 sendcode >>= 1;
291         } while (sendcode);
292
293         return IO_GOT_PACKET | IO_MODE_FAST;
294 }
295
296 /*
297  * Disables and restores interrupts for mp_io(), which does the actual I/O.
298  */
299
300 static int multiport_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet)
301 {
302         int status;
303         unsigned long flags;
304
305         local_irq_save(flags);
306         status = mp_io(gameport, sendflags, sendcode, packet);
307         local_irq_restore(flags);
308
309         return status;
310 }
311
312 /*
313  * Puts multiport into digital mode.  Multiport LED turns green.
314  *
315  * Returns true if a valid digital packet was received, false otherwise.
316  */
317
318 static int dig_mode_start(struct gameport *gameport, u32 *packet)
319 {
320         int i;
321         int flags, tries = 0, bads = 0;
322
323         for (i = 0; i < ARRAY_SIZE(init_seq); i++) {     /* Send magic sequence */
324                 if (init_seq[i])
325                         gameport_trigger(gameport);
326                 udelay(GRIP_INIT_DELAY);
327         }
328
329         for (i = 0; i < 16; i++)            /* Wait for multiport to settle */
330                 udelay(GRIP_INIT_DELAY);
331
332         while (tries < 64 && bads < 8) {    /* Reset multiport and try getting a packet */
333
334                 flags = multiport_io(gameport, IO_RESET, 0x27, packet);
335
336                 if (flags & IO_MODE_FAST)
337                         return 1;
338
339                 if (flags & IO_RETRY)
340                         tries++;
341                 else
342                         bads++;
343         }
344         return 0;
345 }
346
347 /*
348  * Packet structure: B0-B15   => gamepad state
349  *                   B16-B20  => gamepad device type
350  *                   B21-B24  => multiport slot index (1-4)
351  *
352  * Known device types: 0x1f (grip pad), 0x0 (no device).  Others may exist.
353  *
354  * Returns the packet status.
355  */
356
357 static int get_and_decode_packet(struct grip_mp *grip, int flags)
358 {
359         struct grip_port *port;
360         u32 packet;
361         int joytype = 0;
362         int slot;
363
364         /* Get a packet and check for validity */
365
366         flags &= IO_RESET | IO_RETRY;
367         flags = multiport_io(grip->gameport, flags, 0, &packet);
368         grip->reads++;
369
370         if (packet & PACKET_MP_DONE)
371                 flags |= IO_DONE;
372
373         if (flags && !(flags & IO_GOT_PACKET)) {
374                 grip->bads++;
375                 return flags;
376         }
377
378         /* Ignore non-gamepad packets, e.g. multiport hardware version */
379
380         slot = ((packet >> 21) & 0xf) - 1;
381         if ((slot < 0) || (slot > 3))
382                 return flags;
383
384         port = grip->port[slot];
385
386         /*
387          * Handle "reset" packets, which occur at startup, and when gamepads
388          * are removed or plugged in.  May contain configuration of a new gamepad.
389          */
390
391         joytype = (packet >> 16) & 0x1f;
392         if (!joytype) {
393
394                 if (port->registered) {
395                         printk(KERN_INFO "grip_mp: removing %s, slot %d\n",
396                                grip_name[port->mode], slot);
397                         input_unregister_device(port->dev);
398                         port->registered = 0;
399                 }
400                 dbg("Reset: grip multiport slot %d\n", slot);
401                 port->mode = GRIP_MODE_RESET;
402                 flags |= IO_SLOT_CHANGE;
403                 return flags;
404         }
405
406         /* Interpret a grip pad packet */
407
408         if (joytype == 0x1f) {
409
410                 int dir = (packet >> 8) & 0xf;          /* eight way directional value */
411                 port->buttons = (~packet) & 0xff;
412                 port->yaxes = ((axis_map[dir] >> 2) & 3) - 1;
413                 port->xaxes = (axis_map[dir] & 3) - 1;
414                 port->dirty = 1;
415
416                 if (port->mode == GRIP_MODE_RESET)
417                         flags |= IO_SLOT_CHANGE;
418
419                 port->mode = GRIP_MODE_GP;
420
421                 if (!port->registered) {
422                         dbg("New Grip pad in multiport slot %d.\n", slot);
423                         if (register_slot(slot, grip)) {
424                                 port->mode = GRIP_MODE_RESET;
425                                 port->dirty = 0;
426                         }
427                 }
428                 return flags;
429         }
430
431         /* Handle non-grip device codes.  For now, just print diagnostics. */
432
433         {
434                 static int strange_code = 0;
435                 if (strange_code != joytype) {
436                         printk(KERN_INFO "Possible non-grip pad/joystick detected.\n");
437                         printk(KERN_INFO "Got joy type 0x%x and packet 0x%x.\n", joytype, packet);
438                         strange_code = joytype;
439                 }
440         }
441         return flags;
442 }
443
444 /*
445  * Returns true if all multiport slot states appear valid.
446  */
447
448 static int slots_valid(struct grip_mp *grip)
449 {
450         int flags, slot, invalid = 0, active = 0;
451
452         flags = get_and_decode_packet(grip, 0);
453         if (!(flags & IO_GOT_PACKET))
454                 return 0;
455
456         for (slot = 0; slot < 4; slot++) {
457                 if (grip->port[slot]->mode == GRIP_MODE_RESET)
458                         invalid = 1;
459                 if (grip->port[slot]->mode != GRIP_MODE_NONE)
460                         active = 1;
461         }
462
463         /* Return true if no active slot but multiport sent all its data */
464         if (!active)
465                 return (flags & IO_DONE) ? 1 : 0;
466
467         /* Return false if invalid device code received */
468         return invalid ? 0 : 1;
469 }
470
471 /*
472  * Returns whether the multiport was placed into digital mode and
473  * able to communicate its state successfully.
474  */
475
476 static int multiport_init(struct grip_mp *grip)
477 {
478         int dig_mode, initialized = 0, tries = 0;
479         u32 packet;
480
481         dig_mode = dig_mode_start(grip->gameport, &packet);
482         while (!dig_mode && tries < 4) {
483                 dig_mode = dig_mode_start(grip->gameport, &packet);
484                 tries++;
485         }
486
487         if (dig_mode)
488                 dbg("multiport_init(): digital mode activated.\n");
489         else {
490                 dbg("multiport_init(): unable to activate digital mode.\n");
491                 return 0;
492         }
493
494         /* Get packets, store multiport state, and check state's validity */
495         for (tries = 0; tries < 4096; tries++) {
496                 if (slots_valid(grip)) {
497                         initialized = 1;
498                         break;
499                 }
500         }
501         dbg("multiport_init(): initialized == %d\n", initialized);
502         return initialized;
503 }
504
505 /*
506  * Reports joystick state to the linux input layer.
507  */
508
509 static void report_slot(struct grip_mp *grip, int slot)
510 {
511         struct grip_port *port = grip->port[slot];
512         int i;
513
514         /* Store button states with linux input driver */
515
516         for (i = 0; i < 8; i++)
517                 input_report_key(port->dev, grip_btn_gp[i], (port->buttons >> i) & 1);
518
519         /* Store axis states with linux driver */
520
521         input_report_abs(port->dev, ABS_X, port->xaxes);
522         input_report_abs(port->dev, ABS_Y, port->yaxes);
523
524         /* Tell the receiver of the events to process them */
525
526         input_sync(port->dev);
527
528         port->dirty = 0;
529 }
530
531 /*
532  * Get the multiport state.
533  */
534
535 static void grip_poll(struct gameport *gameport)
536 {
537         struct grip_mp *grip = gameport_get_drvdata(gameport);
538         int i, npkts, flags;
539
540         for (npkts = 0; npkts < 4; npkts++) {
541                 flags = IO_RETRY;
542                 for (i = 0; i < 32; i++) {
543                         flags = get_and_decode_packet(grip, flags);
544                         if ((flags & IO_GOT_PACKET) || !(flags & IO_RETRY))
545                                 break;
546                 }
547                 if (flags & IO_DONE)
548                         break;
549         }
550
551         for (i = 0; i < 4; i++)
552                 if (grip->port[i]->dirty)
553                         report_slot(grip, i);
554 }
555
556 /*
557  * Called when a joystick device file is opened
558  */
559
560 static int grip_open(struct input_dev *dev)
561 {
562         struct grip_mp *grip = input_get_drvdata(dev);
563
564         gameport_start_polling(grip->gameport);
565         return 0;
566 }
567
568 /*
569  * Called when a joystick device file is closed
570  */
571
572 static void grip_close(struct input_dev *dev)
573 {
574         struct grip_mp *grip = input_get_drvdata(dev);
575
576         gameport_stop_polling(grip->gameport);
577 }
578
579 /*
580  * Tell the linux input layer about a newly plugged-in gamepad.
581  */
582
583 static int register_slot(int slot, struct grip_mp *grip)
584 {
585         struct grip_port *port = grip->port[slot];
586         struct input_dev *input_dev;
587         int j, t;
588         int err;
589
590         port->dev = input_dev = input_allocate_device();
591         if (!input_dev)
592                 return -ENOMEM;
593
594         input_dev->name = grip_name[port->mode];
595         input_dev->id.bustype = BUS_GAMEPORT;
596         input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS;
597         input_dev->id.product = 0x0100 + port->mode;
598         input_dev->id.version = 0x0100;
599         input_dev->dev.parent = &grip->gameport->dev;
600
601         input_set_drvdata(input_dev, grip);
602
603         input_dev->open = grip_open;
604         input_dev->close = grip_close;
605
606         input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
607
608         for (j = 0; (t = grip_abs[port->mode][j]) >= 0; j++)
609                 input_set_abs_params(input_dev, t, -1, 1, 0, 0);
610
611         for (j = 0; (t = grip_btn[port->mode][j]) >= 0; j++)
612                 if (t > 0)
613                         set_bit(t, input_dev->keybit);
614
615         err = input_register_device(port->dev);
616         if (err) {
617                 input_free_device(port->dev);
618                 return err;
619         }
620
621         port->registered = 1;
622
623         if (port->dirty)                    /* report initial state, if any */
624                 report_slot(grip, slot);
625
626         return 0;
627 }
628
629 static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
630 {
631         struct grip_mp *grip;
632         int err;
633
634         if (!(grip = kzalloc(sizeof(struct grip_mp), GFP_KERNEL)))
635                 return -ENOMEM;
636
637         grip->gameport = gameport;
638
639         gameport_set_drvdata(gameport, grip);
640
641         err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW);
642         if (err)
643                 goto fail1;
644
645         gameport_set_poll_handler(gameport, grip_poll);
646         gameport_set_poll_interval(gameport, 20);
647
648         if (!multiport_init(grip)) {
649                 err = -ENODEV;
650                 goto fail2;
651         }
652
653         if (!grip->port[0]->mode && !grip->port[1]->mode && !grip->port[2]->mode && !grip->port[3]->mode) {
654                 /* nothing plugged in */
655                 err = -ENODEV;
656                 goto fail2;
657         }
658
659         return 0;
660
661 fail2:  gameport_close(gameport);
662 fail1:  gameport_set_drvdata(gameport, NULL);
663         kfree(grip);
664         return err;
665 }
666
667 static void grip_disconnect(struct gameport *gameport)
668 {
669         struct grip_mp *grip = gameport_get_drvdata(gameport);
670         int i;
671
672         for (i = 0; i < 4; i++)
673                 if (grip->port[i]->registered)
674                         input_unregister_device(grip->port[i]->dev);
675         gameport_close(gameport);
676         gameport_set_drvdata(gameport, NULL);
677         kfree(grip);
678 }
679
680 static struct gameport_driver grip_drv = {
681         .driver         = {
682                 .name   = "grip_mp",
683         },
684         .description    = DRIVER_DESC,
685         .connect        = grip_connect,
686         .disconnect     = grip_disconnect,
687 };
688
689 module_gameport_driver(grip_drv);