Path: blob/master/drivers/input/joystick/gamecon.c
15109 views
/*1* NES, SNES, N64, MultiSystem, PSX gamepad driver for Linux2*3* Copyright (c) 1999-2004 Vojtech Pavlik <[email protected]>4* Copyright (c) 2004 Peter Nelson <[email protected]>5*6* Based on the work of:7* Andree Borrmann John Dahlstrom8* David Kuder Nathan Hand9* Raphael Assenat10*/1112/*13* This program is free software; you can redistribute it and/or modify14* it under the terms of the GNU General Public License as published by15* the Free Software Foundation; either version 2 of the License, or16* (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 of20* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the21* GNU General Public License for more details.22*23* You should have received a copy of the GNU General Public License24* along with this program; if not, write to the Free Software25* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA26*27* Should you need to contact me, the author, you can do so either by28* e-mail - mail your message to <[email protected]>, or by paper mail:29* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic30*/3132#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt3334#include <linux/kernel.h>35#include <linux/delay.h>36#include <linux/module.h>37#include <linux/init.h>38#include <linux/parport.h>39#include <linux/input.h>40#include <linux/mutex.h>41#include <linux/slab.h>4243MODULE_AUTHOR("Vojtech Pavlik <[email protected]>");44MODULE_DESCRIPTION("NES, SNES, N64, MultiSystem, PSX gamepad driver");45MODULE_LICENSE("GPL");4647#define GC_MAX_PORTS 348#define GC_MAX_DEVICES 54950struct gc_config {51int args[GC_MAX_DEVICES + 1];52unsigned int nargs;53};5455static struct gc_config gc_cfg[GC_MAX_PORTS] __initdata;5657module_param_array_named(map, gc_cfg[0].args, int, &gc_cfg[0].nargs, 0);58MODULE_PARM_DESC(map, "Describes first set of devices (<parport#>,<pad1>,<pad2>,..<pad5>)");59module_param_array_named(map2, gc_cfg[1].args, int, &gc_cfg[1].nargs, 0);60MODULE_PARM_DESC(map2, "Describes second set of devices");61module_param_array_named(map3, gc_cfg[2].args, int, &gc_cfg[2].nargs, 0);62MODULE_PARM_DESC(map3, "Describes third set of devices");6364/* see also gs_psx_delay parameter in PSX support section */6566enum gc_type {67GC_NONE = 0,68GC_SNES,69GC_NES,70GC_NES4,71GC_MULTI,72GC_MULTI2,73GC_N64,74GC_PSX,75GC_DDR,76GC_SNESMOUSE,77GC_MAX78};7980#define GC_REFRESH_TIME HZ/1008182struct gc_pad {83struct input_dev *dev;84enum gc_type type;85char phys[32];86};8788struct gc {89struct pardevice *pd;90struct gc_pad pads[GC_MAX_DEVICES];91struct timer_list timer;92int pad_count[GC_MAX];93int used;94struct mutex mutex;95};9697struct gc_subdev {98unsigned int idx;99};100101static struct gc *gc_base[3];102103static const int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 };104105static const char *gc_names[] = {106NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick",107"Multisystem 2-button joystick", "N64 controller", "PSX controller",108"PSX DDR controller", "SNES mouse"109};110111/*112* N64 support.113*/114115static const unsigned char gc_n64_bytes[] = { 0, 1, 13, 15, 14, 12, 10, 11, 2, 3 };116static const short gc_n64_btn[] = {117BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z,118BTN_TL, BTN_TR, BTN_TRIGGER, BTN_START119};120121#define GC_N64_LENGTH 32 /* N64 bit length, not including stop bit */122#define GC_N64_STOP_LENGTH 5 /* Length of encoded stop bit */123#define GC_N64_CMD_00 0x11111111UL124#define GC_N64_CMD_01 0xd1111111UL125#define GC_N64_CMD_03 0xdd111111UL126#define GC_N64_CMD_1b 0xdd1dd111UL127#define GC_N64_CMD_c0 0x111111ddUL128#define GC_N64_CMD_80 0x1111111dUL129#define GC_N64_STOP_BIT 0x1d /* Encoded stop bit */130#define GC_N64_REQUEST_DATA GC_N64_CMD_01 /* the request data command */131#define GC_N64_DELAY 133 /* delay between transmit request, and response ready (us) */132#define GC_N64_DWS 3 /* delay between write segments (required for sound playback because of ISA DMA) */133/* GC_N64_DWS > 24 is known to fail */134#define GC_N64_POWER_W 0xe2 /* power during write (transmit request) */135#define GC_N64_POWER_R 0xfd /* power during read */136#define GC_N64_OUT 0x1d /* output bits to the 4 pads */137/* Reading the main axes of any N64 pad is known to fail if the corresponding bit */138/* in GC_N64_OUT is pulled low on the output port (by any routine) for more */139/* than 123 us */140#define GC_N64_CLOCK 0x02 /* clock bits for read */141142/*143* Used for rumble code.144*/145146/* Send encoded command */147static void gc_n64_send_command(struct gc *gc, unsigned long cmd,148unsigned char target)149{150struct parport *port = gc->pd->port;151int i;152153for (i = 0; i < GC_N64_LENGTH; i++) {154unsigned char data = (cmd >> i) & 1 ? target : 0;155parport_write_data(port, GC_N64_POWER_W | data);156udelay(GC_N64_DWS);157}158}159160/* Send stop bit */161static void gc_n64_send_stop_bit(struct gc *gc, unsigned char target)162{163struct parport *port = gc->pd->port;164int i;165166for (i = 0; i < GC_N64_STOP_LENGTH; i++) {167unsigned char data = (GC_N64_STOP_BIT >> i) & 1 ? target : 0;168parport_write_data(port, GC_N64_POWER_W | data);169udelay(GC_N64_DWS);170}171}172173/*174* gc_n64_read_packet() reads an N64 packet.175* Each pad uses one bit per byte. So all pads connected to this port176* are read in parallel.177*/178179static void gc_n64_read_packet(struct gc *gc, unsigned char *data)180{181int i;182unsigned long flags;183184/*185* Request the pad to transmit data186*/187188local_irq_save(flags);189gc_n64_send_command(gc, GC_N64_REQUEST_DATA, GC_N64_OUT);190gc_n64_send_stop_bit(gc, GC_N64_OUT);191local_irq_restore(flags);192193/*194* Wait for the pad response to be loaded into the 33-bit register195* of the adapter.196*/197198udelay(GC_N64_DELAY);199200/*201* Grab data (ignoring the last bit, which is a stop bit)202*/203204for (i = 0; i < GC_N64_LENGTH; i++) {205parport_write_data(gc->pd->port, GC_N64_POWER_R);206udelay(2);207data[i] = parport_read_status(gc->pd->port);208parport_write_data(gc->pd->port, GC_N64_POWER_R | GC_N64_CLOCK);209}210211/*212* We must wait 200 ms here for the controller to reinitialize before213* the next read request. No worries as long as gc_read is polled less214* frequently than this.215*/216217}218219static void gc_n64_process_packet(struct gc *gc)220{221unsigned char data[GC_N64_LENGTH];222struct input_dev *dev;223int i, j, s;224signed char x, y;225226gc_n64_read_packet(gc, data);227228for (i = 0; i < GC_MAX_DEVICES; i++) {229230if (gc->pads[i].type != GC_N64)231continue;232233dev = gc->pads[i].dev;234s = gc_status_bit[i];235236if (s & ~(data[8] | data[9])) {237238x = y = 0;239240for (j = 0; j < 8; j++) {241if (data[23 - j] & s)242x |= 1 << j;243if (data[31 - j] & s)244y |= 1 << j;245}246247input_report_abs(dev, ABS_X, x);248input_report_abs(dev, ABS_Y, -y);249250input_report_abs(dev, ABS_HAT0X,251!(s & data[6]) - !(s & data[7]));252input_report_abs(dev, ABS_HAT0Y,253!(s & data[4]) - !(s & data[5]));254255for (j = 0; j < 10; j++)256input_report_key(dev, gc_n64_btn[j],257s & data[gc_n64_bytes[j]]);258259input_sync(dev);260}261}262}263264static int gc_n64_play_effect(struct input_dev *dev, void *data,265struct ff_effect *effect)266{267int i;268unsigned long flags;269struct gc *gc = input_get_drvdata(dev);270struct gc_subdev *sdev = data;271unsigned char target = 1 << sdev->idx; /* select desired pin */272273if (effect->type == FF_RUMBLE) {274struct ff_rumble_effect *rumble = &effect->u.rumble;275unsigned int cmd =276rumble->strong_magnitude || rumble->weak_magnitude ?277GC_N64_CMD_01 : GC_N64_CMD_00;278279local_irq_save(flags);280281/* Init Rumble - 0x03, 0x80, 0x01, (34)0x80 */282gc_n64_send_command(gc, GC_N64_CMD_03, target);283gc_n64_send_command(gc, GC_N64_CMD_80, target);284gc_n64_send_command(gc, GC_N64_CMD_01, target);285for (i = 0; i < 32; i++)286gc_n64_send_command(gc, GC_N64_CMD_80, target);287gc_n64_send_stop_bit(gc, target);288289udelay(GC_N64_DELAY);290291/* Now start or stop it - 0x03, 0xc0, 0zx1b, (32)0x01/0x00 */292gc_n64_send_command(gc, GC_N64_CMD_03, target);293gc_n64_send_command(gc, GC_N64_CMD_c0, target);294gc_n64_send_command(gc, GC_N64_CMD_1b, target);295for (i = 0; i < 32; i++)296gc_n64_send_command(gc, cmd, target);297gc_n64_send_stop_bit(gc, target);298299local_irq_restore(flags);300301}302303return 0;304}305306static int __init gc_n64_init_ff(struct input_dev *dev, int i)307{308struct gc_subdev *sdev;309int err;310311sdev = kmalloc(sizeof(*sdev), GFP_KERNEL);312if (!sdev)313return -ENOMEM;314315sdev->idx = i;316317input_set_capability(dev, EV_FF, FF_RUMBLE);318319err = input_ff_create_memless(dev, sdev, gc_n64_play_effect);320if (err) {321kfree(sdev);322return err;323}324325return 0;326}327328/*329* NES/SNES support.330*/331332#define GC_NES_DELAY 6 /* Delay between bits - 6us */333#define GC_NES_LENGTH 8 /* The NES pads use 8 bits of data */334#define GC_SNES_LENGTH 12 /* The SNES true length is 16, but the335last 4 bits are unused */336#define GC_SNESMOUSE_LENGTH 32 /* The SNES mouse uses 32 bits, the first33716 bits are equivalent to a gamepad */338339#define GC_NES_POWER 0xfc340#define GC_NES_CLOCK 0x01341#define GC_NES_LATCH 0x02342343static const unsigned char gc_nes_bytes[] = { 0, 1, 2, 3 };344static const unsigned char gc_snes_bytes[] = { 8, 0, 2, 3, 9, 1, 10, 11 };345static const short gc_snes_btn[] = {346BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR347};348349/*350* gc_nes_read_packet() reads a NES/SNES packet.351* Each pad uses one bit per byte. So all pads connected to352* this port are read in parallel.353*/354355static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data)356{357int i;358359parport_write_data(gc->pd->port, GC_NES_POWER | GC_NES_CLOCK | GC_NES_LATCH);360udelay(GC_NES_DELAY * 2);361parport_write_data(gc->pd->port, GC_NES_POWER | GC_NES_CLOCK);362363for (i = 0; i < length; i++) {364udelay(GC_NES_DELAY);365parport_write_data(gc->pd->port, GC_NES_POWER);366data[i] = parport_read_status(gc->pd->port) ^ 0x7f;367udelay(GC_NES_DELAY);368parport_write_data(gc->pd->port, GC_NES_POWER | GC_NES_CLOCK);369}370}371372static void gc_nes_process_packet(struct gc *gc)373{374unsigned char data[GC_SNESMOUSE_LENGTH];375struct gc_pad *pad;376struct input_dev *dev;377int i, j, s, len;378char x_rel, y_rel;379380len = gc->pad_count[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH :381(gc->pad_count[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH);382383gc_nes_read_packet(gc, len, data);384385for (i = 0; i < GC_MAX_DEVICES; i++) {386387pad = &gc->pads[i];388dev = pad->dev;389s = gc_status_bit[i];390391switch (pad->type) {392393case GC_NES:394395input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7]));396input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5]));397398for (j = 0; j < 4; j++)399input_report_key(dev, gc_snes_btn[j],400s & data[gc_nes_bytes[j]]);401input_sync(dev);402break;403404case GC_SNES:405406input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7]));407input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5]));408409for (j = 0; j < 8; j++)410input_report_key(dev, gc_snes_btn[j],411s & data[gc_snes_bytes[j]]);412input_sync(dev);413break;414415case GC_SNESMOUSE:416/*417* The 4 unused bits from SNES controllers appear418* to be ID bits so use them to make sure we are419* dealing with a mouse.420* gamepad is connected. This is important since421* my SNES gamepad sends 1's for bits 16-31, which422* cause the mouse pointer to quickly move to the423* upper left corner of the screen.424*/425if (!(s & data[12]) && !(s & data[13]) &&426!(s & data[14]) && (s & data[15])) {427input_report_key(dev, BTN_LEFT, s & data[9]);428input_report_key(dev, BTN_RIGHT, s & data[8]);429430x_rel = y_rel = 0;431for (j = 0; j < 7; j++) {432x_rel <<= 1;433if (data[25 + j] & s)434x_rel |= 1;435436y_rel <<= 1;437if (data[17 + j] & s)438y_rel |= 1;439}440441if (x_rel) {442if (data[24] & s)443x_rel = -x_rel;444input_report_rel(dev, REL_X, x_rel);445}446447if (y_rel) {448if (data[16] & s)449y_rel = -y_rel;450input_report_rel(dev, REL_Y, y_rel);451}452453input_sync(dev);454}455break;456457default:458break;459}460}461}462463/*464* Multisystem joystick support465*/466467#define GC_MULTI_LENGTH 5 /* Multi system joystick packet length is 5 */468#define GC_MULTI2_LENGTH 6 /* One more bit for one more button */469470/*471* gc_multi_read_packet() reads a Multisystem joystick packet.472*/473474static void gc_multi_read_packet(struct gc *gc, int length, unsigned char *data)475{476int i;477478for (i = 0; i < length; i++) {479parport_write_data(gc->pd->port, ~(1 << i));480data[i] = parport_read_status(gc->pd->port) ^ 0x7f;481}482}483484static void gc_multi_process_packet(struct gc *gc)485{486unsigned char data[GC_MULTI2_LENGTH];487int data_len = gc->pad_count[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH;488struct gc_pad *pad;489struct input_dev *dev;490int i, s;491492gc_multi_read_packet(gc, data_len, data);493494for (i = 0; i < GC_MAX_DEVICES; i++) {495pad = &gc->pads[i];496dev = pad->dev;497s = gc_status_bit[i];498499switch (pad->type) {500case GC_MULTI2:501input_report_key(dev, BTN_THUMB, s & data[5]);502/* fall through */503504case GC_MULTI:505input_report_abs(dev, ABS_X,506!(s & data[2]) - !(s & data[3]));507input_report_abs(dev, ABS_Y,508!(s & data[0]) - !(s & data[1]));509input_report_key(dev, BTN_TRIGGER, s & data[4]);510input_sync(dev);511break;512513default:514break;515}516}517}518519/*520* PSX support521*522* See documentation at:523* http://www.geocities.co.jp/Playtown/2004/psx/ps_eng.txt524* http://www.gamesx.com/controldata/psxcont/psxcont.htm525*526*/527528#define GC_PSX_DELAY 25 /* 25 usec */529#define GC_PSX_LENGTH 8 /* talk to the controller in bits */530#define GC_PSX_BYTES 6 /* the maximum number of bytes to read off the controller */531532#define GC_PSX_MOUSE 1 /* Mouse */533#define GC_PSX_NEGCON 2 /* NegCon */534#define GC_PSX_NORMAL 4 /* Digital / Analog or Rumble in Digital mode */535#define GC_PSX_ANALOG 5 /* Analog in Analog mode / Rumble in Green mode */536#define GC_PSX_RUMBLE 7 /* Rumble in Red mode */537538#define GC_PSX_CLOCK 0x04 /* Pin 4 */539#define GC_PSX_COMMAND 0x01 /* Pin 2 */540#define GC_PSX_POWER 0xf8 /* Pins 5-9 */541#define GC_PSX_SELECT 0x02 /* Pin 3 */542543#define GC_PSX_ID(x) ((x) >> 4) /* High nibble is device type */544#define GC_PSX_LEN(x) (((x) & 0xf) << 1) /* Low nibble is length in bytes/2 */545546static int gc_psx_delay = GC_PSX_DELAY;547module_param_named(psx_delay, gc_psx_delay, uint, 0);548MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)");549550static const short gc_psx_abs[] = {551ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_HAT0X, ABS_HAT0Y552};553static const short gc_psx_btn[] = {554BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_A, BTN_B, BTN_X, BTN_Y,555BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR556};557static const short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 };558559/*560* gc_psx_command() writes 8bit command and reads 8bit data from561* the psx pad.562*/563564static void gc_psx_command(struct gc *gc, int b, unsigned char *data)565{566struct parport *port = gc->pd->port;567int i, j, cmd, read;568569memset(data, 0, GC_MAX_DEVICES);570571for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) {572cmd = (b & 1) ? GC_PSX_COMMAND : 0;573parport_write_data(port, cmd | GC_PSX_POWER);574udelay(gc_psx_delay);575576read = parport_read_status(port) ^ 0x80;577578for (j = 0; j < GC_MAX_DEVICES; j++) {579struct gc_pad *pad = &gc->pads[j];580581if (pad->type == GC_PSX || pad->type == GC_DDR)582data[j] |= (read & gc_status_bit[j]) ? (1 << i) : 0;583}584585parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER);586udelay(gc_psx_delay);587}588}589590/*591* gc_psx_read_packet() reads a whole psx packet and returns592* device identifier code.593*/594595static void gc_psx_read_packet(struct gc *gc,596unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES],597unsigned char id[GC_MAX_DEVICES])598{599int i, j, max_len = 0;600unsigned long flags;601unsigned char data2[GC_MAX_DEVICES];602603/* Select pad */604parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER);605udelay(gc_psx_delay);606/* Deselect, begin command */607parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_POWER);608udelay(gc_psx_delay);609610local_irq_save(flags);611612gc_psx_command(gc, 0x01, data2); /* Access pad */613gc_psx_command(gc, 0x42, id); /* Get device ids */614gc_psx_command(gc, 0, data2); /* Dump status */615616/* Find the longest pad */617for (i = 0; i < GC_MAX_DEVICES; i++) {618struct gc_pad *pad = &gc->pads[i];619620if ((pad->type == GC_PSX || pad->type == GC_DDR) &&621GC_PSX_LEN(id[i]) > max_len &&622GC_PSX_LEN(id[i]) <= GC_PSX_BYTES) {623max_len = GC_PSX_LEN(id[i]);624}625}626627/* Read in all the data */628for (i = 0; i < max_len; i++) {629gc_psx_command(gc, 0, data2);630for (j = 0; j < GC_MAX_DEVICES; j++)631data[j][i] = data2[j];632}633634local_irq_restore(flags);635636parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER);637638/* Set id's to the real value */639for (i = 0; i < GC_MAX_DEVICES; i++)640id[i] = GC_PSX_ID(id[i]);641}642643static void gc_psx_report_one(struct gc_pad *pad, unsigned char psx_type,644unsigned char *data)645{646struct input_dev *dev = pad->dev;647int i;648649switch (psx_type) {650651case GC_PSX_RUMBLE:652653input_report_key(dev, BTN_THUMBL, ~data[0] & 0x04);654input_report_key(dev, BTN_THUMBR, ~data[0] & 0x02);655656case GC_PSX_NEGCON:657case GC_PSX_ANALOG:658659if (pad->type == GC_DDR) {660for (i = 0; i < 4; i++)661input_report_key(dev, gc_psx_ddr_btn[i],662~data[0] & (0x10 << i));663} else {664for (i = 0; i < 4; i++)665input_report_abs(dev, gc_psx_abs[i + 2],666data[i + 2]);667668input_report_abs(dev, ABS_X,669!!(data[0] & 0x80) * 128 + !(data[0] & 0x20) * 127);670input_report_abs(dev, ABS_Y,671!!(data[0] & 0x10) * 128 + !(data[0] & 0x40) * 127);672}673674for (i = 0; i < 8; i++)675input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i));676677input_report_key(dev, BTN_START, ~data[0] & 0x08);678input_report_key(dev, BTN_SELECT, ~data[0] & 0x01);679680input_sync(dev);681682break;683684case GC_PSX_NORMAL:685686if (pad->type == GC_DDR) {687for (i = 0; i < 4; i++)688input_report_key(dev, gc_psx_ddr_btn[i],689~data[0] & (0x10 << i));690} else {691input_report_abs(dev, ABS_X,692!!(data[0] & 0x80) * 128 + !(data[0] & 0x20) * 127);693input_report_abs(dev, ABS_Y,694!!(data[0] & 0x10) * 128 + !(data[0] & 0x40) * 127);695696/*697* For some reason if the extra axes are left unset698* they drift.699* for (i = 0; i < 4; i++)700input_report_abs(dev, gc_psx_abs[i + 2], 128);701* This needs to be debugged properly,702* maybe fuzz processing needs to be done703* in input_sync()704* --vojtech705*/706}707708for (i = 0; i < 8; i++)709input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i));710711input_report_key(dev, BTN_START, ~data[0] & 0x08);712input_report_key(dev, BTN_SELECT, ~data[0] & 0x01);713714input_sync(dev);715716break;717718default: /* not a pad, ignore */719break;720}721}722723static void gc_psx_process_packet(struct gc *gc)724{725unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES];726unsigned char id[GC_MAX_DEVICES];727struct gc_pad *pad;728int i;729730gc_psx_read_packet(gc, data, id);731732for (i = 0; i < GC_MAX_DEVICES; i++) {733pad = &gc->pads[i];734if (pad->type == GC_PSX || pad->type == GC_DDR)735gc_psx_report_one(pad, id[i], data[i]);736}737}738739/*740* gc_timer() initiates reads of console pads data.741*/742743static void gc_timer(unsigned long private)744{745struct gc *gc = (void *) private;746747/*748* N64 pads - must be read first, any read confuses them for 200 us749*/750751if (gc->pad_count[GC_N64])752gc_n64_process_packet(gc);753754/*755* NES and SNES pads or mouse756*/757758if (gc->pad_count[GC_NES] ||759gc->pad_count[GC_SNES] ||760gc->pad_count[GC_SNESMOUSE]) {761gc_nes_process_packet(gc);762}763764/*765* Multi and Multi2 joysticks766*/767768if (gc->pad_count[GC_MULTI] || gc->pad_count[GC_MULTI2])769gc_multi_process_packet(gc);770771/*772* PSX controllers773*/774775if (gc->pad_count[GC_PSX] || gc->pad_count[GC_DDR])776gc_psx_process_packet(gc);777778mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME);779}780781static int gc_open(struct input_dev *dev)782{783struct gc *gc = input_get_drvdata(dev);784int err;785786err = mutex_lock_interruptible(&gc->mutex);787if (err)788return err;789790if (!gc->used++) {791parport_claim(gc->pd);792parport_write_control(gc->pd->port, 0x04);793mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME);794}795796mutex_unlock(&gc->mutex);797return 0;798}799800static void gc_close(struct input_dev *dev)801{802struct gc *gc = input_get_drvdata(dev);803804mutex_lock(&gc->mutex);805if (!--gc->used) {806del_timer_sync(&gc->timer);807parport_write_control(gc->pd->port, 0x00);808parport_release(gc->pd);809}810mutex_unlock(&gc->mutex);811}812813static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type)814{815struct gc_pad *pad = &gc->pads[idx];816struct input_dev *input_dev;817int i;818int err;819820if (pad_type < 1 || pad_type >= GC_MAX) {821pr_err("Pad type %d unknown\n", pad_type);822return -EINVAL;823}824825pad->dev = input_dev = input_allocate_device();826if (!input_dev) {827pr_err("Not enough memory for input device\n");828return -ENOMEM;829}830831pad->type = pad_type;832833snprintf(pad->phys, sizeof(pad->phys),834"%s/input%d", gc->pd->port->name, idx);835836input_dev->name = gc_names[pad_type];837input_dev->phys = pad->phys;838input_dev->id.bustype = BUS_PARPORT;839input_dev->id.vendor = 0x0001;840input_dev->id.product = pad_type;841input_dev->id.version = 0x0100;842843input_set_drvdata(input_dev, gc);844845input_dev->open = gc_open;846input_dev->close = gc_close;847848if (pad_type != GC_SNESMOUSE) {849input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);850851for (i = 0; i < 2; i++)852input_set_abs_params(input_dev, ABS_X + i, -1, 1, 0, 0);853} else854input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);855856gc->pad_count[pad_type]++;857858switch (pad_type) {859860case GC_N64:861for (i = 0; i < 10; i++)862__set_bit(gc_n64_btn[i], input_dev->keybit);863864for (i = 0; i < 2; i++) {865input_set_abs_params(input_dev, ABS_X + i, -127, 126, 0, 2);866input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0);867}868869err = gc_n64_init_ff(input_dev, idx);870if (err) {871pr_warning("Failed to initiate rumble for N64 device %d\n", idx);872goto err_free_dev;873}874875break;876877case GC_SNESMOUSE:878__set_bit(BTN_LEFT, input_dev->keybit);879__set_bit(BTN_RIGHT, input_dev->keybit);880__set_bit(REL_X, input_dev->relbit);881__set_bit(REL_Y, input_dev->relbit);882break;883884case GC_SNES:885for (i = 4; i < 8; i++)886__set_bit(gc_snes_btn[i], input_dev->keybit);887case GC_NES:888for (i = 0; i < 4; i++)889__set_bit(gc_snes_btn[i], input_dev->keybit);890break;891892case GC_MULTI2:893__set_bit(BTN_THUMB, input_dev->keybit);894case GC_MULTI:895__set_bit(BTN_TRIGGER, input_dev->keybit);896break;897898case GC_PSX:899for (i = 0; i < 6; i++)900input_set_abs_params(input_dev,901gc_psx_abs[i], 4, 252, 0, 2);902for (i = 0; i < 12; i++)903__set_bit(gc_psx_btn[i], input_dev->keybit);904905break;906907case GC_DDR:908for (i = 0; i < 4; i++)909__set_bit(gc_psx_ddr_btn[i], input_dev->keybit);910for (i = 0; i < 12; i++)911__set_bit(gc_psx_btn[i], input_dev->keybit);912913break;914}915916err = input_register_device(pad->dev);917if (err)918goto err_free_dev;919920return 0;921922err_free_dev:923input_free_device(pad->dev);924pad->dev = NULL;925return err;926}927928static struct gc __init *gc_probe(int parport, int *pads, int n_pads)929{930struct gc *gc;931struct parport *pp;932struct pardevice *pd;933int i;934int count = 0;935int err;936937pp = parport_find_number(parport);938if (!pp) {939pr_err("no such parport %d\n", parport);940err = -EINVAL;941goto err_out;942}943944pd = parport_register_device(pp, "gamecon", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);945if (!pd) {946pr_err("parport busy already - lp.o loaded?\n");947err = -EBUSY;948goto err_put_pp;949}950951gc = kzalloc(sizeof(struct gc), GFP_KERNEL);952if (!gc) {953pr_err("Not enough memory\n");954err = -ENOMEM;955goto err_unreg_pardev;956}957958mutex_init(&gc->mutex);959gc->pd = pd;960setup_timer(&gc->timer, gc_timer, (long) gc);961962for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) {963if (!pads[i])964continue;965966err = gc_setup_pad(gc, i, pads[i]);967if (err)968goto err_unreg_devs;969970count++;971}972973if (count == 0) {974pr_err("No valid devices specified\n");975err = -EINVAL;976goto err_free_gc;977}978979parport_put_port(pp);980return gc;981982err_unreg_devs:983while (--i >= 0)984if (gc->pads[i].dev)985input_unregister_device(gc->pads[i].dev);986err_free_gc:987kfree(gc);988err_unreg_pardev:989parport_unregister_device(pd);990err_put_pp:991parport_put_port(pp);992err_out:993return ERR_PTR(err);994}995996static void gc_remove(struct gc *gc)997{998int i;9991000for (i = 0; i < GC_MAX_DEVICES; i++)1001if (gc->pads[i].dev)1002input_unregister_device(gc->pads[i].dev);1003parport_unregister_device(gc->pd);1004kfree(gc);1005}10061007static int __init gc_init(void)1008{1009int i;1010int have_dev = 0;1011int err = 0;10121013for (i = 0; i < GC_MAX_PORTS; i++) {1014if (gc_cfg[i].nargs == 0 || gc_cfg[i].args[0] < 0)1015continue;10161017if (gc_cfg[i].nargs < 2) {1018pr_err("at least one device must be specified\n");1019err = -EINVAL;1020break;1021}10221023gc_base[i] = gc_probe(gc_cfg[i].args[0],1024gc_cfg[i].args + 1, gc_cfg[i].nargs - 1);1025if (IS_ERR(gc_base[i])) {1026err = PTR_ERR(gc_base[i]);1027break;1028}10291030have_dev = 1;1031}10321033if (err) {1034while (--i >= 0)1035if (gc_base[i])1036gc_remove(gc_base[i]);1037return err;1038}10391040return have_dev ? 0 : -ENODEV;1041}10421043static void __exit gc_exit(void)1044{1045int i;10461047for (i = 0; i < GC_MAX_PORTS; i++)1048if (gc_base[i])1049gc_remove(gc_base[i]);1050}10511052module_init(gc_init);1053module_exit(gc_exit);105410551056