···275275/*276276 * db9_saturn_report() analyzes packet and reports.277277 */278278-static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *dev, int n, int max_pads)278278+static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *devs[], int n, int max_pads)279279{280280+ struct input_dev *dev;280281 int tmp, i, j;281282282283 tmp = (id == 0x41) ? 60 : 10;283283- for (j = 0; (j < tmp) && (n < max_pads); j += 10, n++) {284284+ for (j = 0; j < tmp && n < max_pads; j += 10, n++) {285285+ dev = devs[n];284286 switch (data[j]) {285287 case 0x16: /* multi controller (analog 4 axis) */286286- input_report_abs(dev + n, db9_abs[5], data[j + 6]);288288+ input_report_abs(dev, db9_abs[5], data[j + 6]);287289 case 0x15: /* mission stick (analog 3 axis) */288288- input_report_abs(dev + n, db9_abs[3], data[j + 4]);289289- input_report_abs(dev + n, db9_abs[4], data[j + 5]);290290+ input_report_abs(dev, db9_abs[3], data[j + 4]);291291+ input_report_abs(dev, db9_abs[4], data[j + 5]);290292 case 0x13: /* racing controller (analog 1 axis) */291291- input_report_abs(dev + n, db9_abs[2], data[j + 3]);293293+ input_report_abs(dev, db9_abs[2], data[j + 3]);292294 case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */293295 case 0x02: /* digital pad (digital 2 axis + buttons) */294294- input_report_abs(dev + n, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));295295- input_report_abs(dev + n, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));296296+ input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));297297+ input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));296298 for (i = 0; i < 9; i++)297297- input_report_key(dev + n, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);299299+ input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);298300 break;299301 case 0x19: /* mission stick x2 (analog 6 axis + buttons) */300300- input_report_abs(dev + n, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));301301- input_report_abs(dev + n, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));302302+ input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64));303303+ input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16));302304 for (i = 0; i < 9; i++)303303- input_report_key(dev + n, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);304304- input_report_abs(dev + n, db9_abs[2], data[j + 3]);305305- input_report_abs(dev + n, db9_abs[3], data[j + 4]);306306- input_report_abs(dev + n, db9_abs[4], data[j + 5]);305305+ input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]);306306+ input_report_abs(dev, db9_abs[2], data[j + 3]);307307+ input_report_abs(dev, db9_abs[3], data[j + 4]);308308+ input_report_abs(dev, db9_abs[4], data[j + 5]);307309 /*308308- input_report_abs(dev + n, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1));309309- input_report_abs(dev + n, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1));310310+ input_report_abs(dev, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1));311311+ input_report_abs(dev, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1));310312 */311311- input_report_abs(dev + n, db9_abs[6], data[j + 7]);312312- input_report_abs(dev + n, db9_abs[7], data[j + 8]);313313- input_report_abs(dev + n, db9_abs[5], data[j + 9]);313313+ input_report_abs(dev, db9_abs[6], data[j + 7]);314314+ input_report_abs(dev, db9_abs[7], data[j + 8]);315315+ input_report_abs(dev, db9_abs[5], data[j + 9]);314316 break;315317 case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */316316- input_report_key(dev + n, BTN_A, data[j + 3] & 0x80);317317- input_report_abs(dev + n, db9_abs[2], data[j + 3] & 0x7f);318318+ input_report_key(dev, BTN_A, data[j + 3] & 0x80);319319+ input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f);318320 break;319321 case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */320320- input_report_key(dev + n, BTN_START, data[j + 1] & 0x08);321321- input_report_key(dev + n, BTN_A, data[j + 1] & 0x04);322322- input_report_key(dev + n, BTN_C, data[j + 1] & 0x02);323323- input_report_key(dev + n, BTN_B, data[j + 1] & 0x01);324324- input_report_abs(dev + n, db9_abs[2], data[j + 2] ^ 0x80);325325- input_report_abs(dev + n, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */322322+ input_report_key(dev, BTN_START, data[j + 1] & 0x08);323323+ input_report_key(dev, BTN_A, data[j + 1] & 0x04);324324+ input_report_key(dev, BTN_C, data[j + 1] & 0x02);325325+ input_report_key(dev, BTN_B, data[j + 1] & 0x01);326326+ input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80);327327+ input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */326328 break;327329 case 0xff:328330 default: /* no pad */329329- input_report_abs(dev + n, db9_abs[0], 0);330330- input_report_abs(dev + n, db9_abs[1], 0);331331+ input_report_abs(dev, db9_abs[0], 0);332332+ input_report_abs(dev, db9_abs[1], 0);331333 for (i = 0; i < 9; i++)332332- input_report_key(dev + n, db9_cd32_btn[i], 0);334334+ input_report_key(dev, db9_cd32_btn[i], 0);333335 break;334336 }335337 }336338 return n;337339}338340339339-static int db9_saturn(int mode, struct parport *port, struct input_dev *dev)341341+static int db9_saturn(int mode, struct parport *port, struct input_dev *devs[])340342{341343 unsigned char id, data[60];342344 int type, n, max_pads;···363361 max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES);364362 for (tmp = 0, i = 0; i < n; i++) {365363 id = db9_saturn_read_packet(port, data, type + i, 1);366366- tmp = db9_saturn_report(id, data, dev, tmp, max_pads);364364+ tmp = db9_saturn_report(id, data, devs, tmp, max_pads);367365 }368366 return 0;369367}···491489 case DB9_SATURN_DPP:492490 case DB9_SATURN_DPP_2:493491494494- db9_saturn(db9->mode, port, dev);492492+ db9_saturn(db9->mode, port, db9->dev);495493 break;496494497495 case DB9_CD32_PAD:···616614 if (!input_dev) {617615 printk(KERN_ERR "db9.c: Not enough memory for input device\n");618616 err = -ENOMEM;619619- goto err_free_devs;617617+ goto err_unreg_devs;620618 }621619622620 sprintf(db9->phys[i], "%s/input%d", db9->pd->port->name, i);···642640 input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0);643641 }644642645645- input_register_device(input_dev);643643+ err = input_register_device(input_dev);644644+ if (err)645645+ goto err_free_dev;646646 }647647648648 parport_put_port(pp);649649 return db9;650650651651- err_free_devs:651651+ err_free_dev:652652+ input_free_device(db9->dev[i]);653653+ err_unreg_devs:652654 while (--i >= 0)653655 input_unregister_device(db9->dev[i]);654656 kfree(db9);···664658 return ERR_PTR(err);665659}666660667667-static void __exit db9_remove(struct db9 *db9)661661+static void db9_remove(struct db9 *db9)668662{669663 int i;670664···702696703697 if (err) {704698 while (--i >= 0)705705- db9_remove(db9_base[i]);699699+ if (db9_base[i])700700+ db9_remove(db9_base[i]);706701 return err;707702 }708703
+216-165
drivers/input/joystick/gamecon.c
···159159160160}161161162162+static void gc_n64_process_packet(struct gc *gc)163163+{164164+ unsigned char data[GC_N64_LENGTH];165165+ signed char axes[2];166166+ struct input_dev *dev;167167+ int i, j, s;168168+169169+ gc_n64_read_packet(gc, data);170170+171171+ for (i = 0; i < GC_MAX_DEVICES; i++) {172172+173173+ dev = gc->dev[i];174174+ if (!dev)175175+ continue;176176+177177+ s = gc_status_bit[i];178178+179179+ if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) {180180+181181+ axes[0] = axes[1] = 0;182182+183183+ for (j = 0; j < 8; j++) {184184+ if (data[23 - j] & s)185185+ axes[0] |= 1 << j;186186+ if (data[31 - j] & s)187187+ axes[1] |= 1 << j;188188+ }189189+190190+ input_report_abs(dev, ABS_X, axes[0]);191191+ input_report_abs(dev, ABS_Y, -axes[1]);192192+193193+ input_report_abs(dev, ABS_HAT0X, !(s & data[6]) - !(s & data[7]));194194+ input_report_abs(dev, ABS_HAT0Y, !(s & data[4]) - !(s & data[5]));195195+196196+ for (j = 0; j < 10; j++)197197+ input_report_key(dev, gc_n64_btn[j], s & data[gc_n64_bytes[j]]);198198+199199+ input_sync(dev);200200+ }201201+ }202202+}203203+162204/*163205 * NES/SNES support.164206 */···240198 }241199}242200201201+static void gc_nes_process_packet(struct gc *gc)202202+{203203+ unsigned char data[GC_SNES_LENGTH];204204+ struct input_dev *dev;205205+ int i, j, s;206206+207207+ gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data);208208+209209+ for (i = 0; i < GC_MAX_DEVICES; i++) {210210+211211+ dev = gc->dev[i];212212+ if (!dev)213213+ continue;214214+215215+ s = gc_status_bit[i];216216+217217+ if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) {218218+ input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7]));219219+ input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5]));220220+ }221221+222222+ if (s & gc->pads[GC_NES])223223+ for (j = 0; j < 4; j++)224224+ input_report_key(dev, gc_snes_btn[j], s & data[gc_nes_bytes[j]]);225225+226226+ if (s & gc->pads[GC_SNES])227227+ for (j = 0; j < 8; j++)228228+ input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]);229229+230230+ input_sync(dev);231231+ }232232+}233233+243234/*244235 * Multisystem joystick support245236 */···291216 for (i = 0; i < length; i++) {292217 parport_write_data(gc->pd->port, ~(1 << i));293218 data[i] = parport_read_status(gc->pd->port) ^ 0x7f;219219+ }220220+}221221+222222+static void gc_multi_process_packet(struct gc *gc)223223+{224224+ unsigned char data[GC_MULTI2_LENGTH];225225+ struct input_dev *dev;226226+ int i, s;227227+228228+ gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data);229229+230230+ for (i = 0; i < GC_MAX_DEVICES; i++) {231231+232232+ dev = gc->dev[i];233233+ if (!dev)234234+ continue;235235+236236+ s = gc_status_bit[i];237237+238238+ if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) {239239+ input_report_abs(dev, ABS_X, !(s & data[2]) - !(s & data[3]));240240+ input_report_abs(dev, ABS_Y, !(s & data[0]) - !(s & data[1]));241241+ input_report_key(dev, BTN_TRIGGER, s & data[4]);242242+ }243243+244244+ if (s & gc->pads[GC_MULTI2])245245+ input_report_key(dev, BTN_THUMB, s & data[5]);246246+247247+ input_sync(dev);294248 }295249}296250···367263 * the psx pad.368264 */369265370370-static void gc_psx_command(struct gc *gc, int b, unsigned char data[5])266266+static void gc_psx_command(struct gc *gc, int b, unsigned char data[GC_MAX_DEVICES])371267{372268 int i, j, cmd, read;373373- for (i = 0; i < 5; i++)269269+270270+ for (i = 0; i < GC_MAX_DEVICES; i++)374271 data[i] = 0;375272376273 for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) {···379274 parport_write_data(gc->pd->port, cmd | GC_PSX_POWER);380275 udelay(gc_psx_delay);381276 read = parport_read_status(gc->pd->port) ^ 0x80;382382- for (j = 0; j < 5; j++)277277+ for (j = 0; j < GC_MAX_DEVICES; j++)383278 data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0;384279 parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER);385280 udelay(gc_psx_delay);···391286 * device identifier code.392287 */393288394394-static void gc_psx_read_packet(struct gc *gc, unsigned char data[5][GC_PSX_BYTES], unsigned char id[5])289289+static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES],290290+ unsigned char id[GC_MAX_DEVICES])395291{396292 int i, j, max_len = 0;397293 unsigned long flags;398398- unsigned char data2[5];294294+ unsigned char data2[GC_MAX_DEVICES];399295400296 parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); /* Select pad */401297 udelay(gc_psx_delay);···409303 gc_psx_command(gc, 0x42, id); /* Get device ids */410304 gc_psx_command(gc, 0, data2); /* Dump status */411305412412- for (i =0; i < 5; i++) /* Find the longest pad */306306+ for (i =0; i < GC_MAX_DEVICES; i++) /* Find the longest pad */413307 if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR]))414308 && (GC_PSX_LEN(id[i]) > max_len)415309 && (GC_PSX_LEN(id[i]) <= GC_PSX_BYTES))···417311418312 for (i = 0; i < max_len; i++) { /* Read in all the data */419313 gc_psx_command(gc, 0, data2);420420- for (j = 0; j < 5; j++)314314+ for (j = 0; j < GC_MAX_DEVICES; j++)421315 data[j][i] = data2[j];422316 }423317···425319426320 parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER);427321428428- for(i = 0; i < 5; i++) /* Set id's to the real value */322322+ for(i = 0; i < GC_MAX_DEVICES; i++) /* Set id's to the real value */429323 id[i] = GC_PSX_ID(id[i]);430324}431325432432-/*433433- * gc_timer() reads and analyzes console pads data.434434- */326326+static void gc_psx_process_packet(struct gc *gc)327327+{328328+ unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES];329329+ unsigned char id[GC_MAX_DEVICES];330330+ struct input_dev *dev;331331+ int i, j;435332436436-#define GC_MAX_LENGTH GC_N64_LENGTH333333+ gc_psx_read_packet(gc, data, id);334334+335335+ for (i = 0; i < GC_MAX_DEVICES; i++) {336336+337337+ dev = gc->dev[i];338338+ if (!dev)339339+ continue;340340+341341+ switch (id[i]) {342342+343343+ case GC_PSX_RUMBLE:344344+345345+ input_report_key(dev, BTN_THUMBL, ~data[i][0] & 0x04);346346+ input_report_key(dev, BTN_THUMBR, ~data[i][0] & 0x02);347347+348348+ case GC_PSX_NEGCON:349349+ case GC_PSX_ANALOG:350350+351351+ if (gc->pads[GC_DDR] & gc_status_bit[i]) {352352+ for(j = 0; j < 4; j++)353353+ input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j));354354+ } else {355355+ for (j = 0; j < 4; j++)356356+ input_report_abs(dev, gc_psx_abs[j + 2], data[i][j + 2]);357357+358358+ input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128);359359+ input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128);360360+ }361361+362362+ for (j = 0; j < 8; j++)363363+ input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j));364364+365365+ input_report_key(dev, BTN_START, ~data[i][0] & 0x08);366366+ input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01);367367+368368+ input_sync(dev);369369+370370+ break;371371+372372+ case GC_PSX_NORMAL:373373+ if (gc->pads[GC_DDR] & gc_status_bit[i]) {374374+ for(j = 0; j < 4; j++)375375+ input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j));376376+ } else {377377+ input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128);378378+ input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128);379379+380380+ /* for some reason if the extra axes are left unset they drift */381381+ /* for (j = 0; j < 4; j++)382382+ input_report_abs(dev, gc_psx_abs[j + 2], 128);383383+ * This needs to be debugged properly,384384+ * maybe fuzz processing needs to be done in input_sync()385385+ * --vojtech386386+ */387387+ }388388+389389+ for (j = 0; j < 8; j++)390390+ input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j));391391+392392+ input_report_key(dev, BTN_START, ~data[i][0] & 0x08);393393+ input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01);394394+395395+ input_sync(dev);396396+397397+ break;398398+399399+ case 0: /* not a pad, ignore */400400+ break;401401+ }402402+ }403403+}404404+405405+/*406406+ * gc_timer() initiates reads of console pads data.407407+ */437408438409static void gc_timer(unsigned long private)439410{440411 struct gc *gc = (void *) private;441441- unsigned char data[GC_MAX_LENGTH];442442- unsigned char data_psx[5][GC_PSX_BYTES];443443- int i, j, s;444412445413/*446414 * N64 pads - must be read first, any read confuses them for 200 us447415 */448416449449- if (gc->pads[GC_N64]) {450450-451451- gc_n64_read_packet(gc, data);452452-453453- for (i = 0; i < 5; i++) {454454-455455- s = gc_status_bit[i];456456-457457- if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) {458458-459459- signed char axes[2];460460- axes[0] = axes[1] = 0;461461-462462- for (j = 0; j < 8; j++) {463463- if (data[23 - j] & s) axes[0] |= 1 << j;464464- if (data[31 - j] & s) axes[1] |= 1 << j;465465- }466466-467467- input_report_abs(gc->dev[i], ABS_X, axes[0]);468468- input_report_abs(gc->dev[i], ABS_Y, -axes[1]);469469-470470- input_report_abs(gc->dev[i], ABS_HAT0X, !(s & data[6]) - !(s & data[7]));471471- input_report_abs(gc->dev[i], ABS_HAT0Y, !(s & data[4]) - !(s & data[5]));472472-473473- for (j = 0; j < 10; j++)474474- input_report_key(gc->dev[i], gc_n64_btn[j], s & data[gc_n64_bytes[j]]);475475-476476- input_sync(gc->dev[i]);477477- }478478- }479479- }417417+ if (gc->pads[GC_N64])418418+ gc_n64_process_packet(gc);480419481420/*482421 * NES and SNES pads483422 */484423485485- if (gc->pads[GC_NES] || gc->pads[GC_SNES]) {486486-487487- gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data);488488-489489- for (i = 0; i < 5; i++) {490490-491491- s = gc_status_bit[i];492492-493493- if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) {494494- input_report_abs(gc->dev[i], ABS_X, !(s & data[6]) - !(s & data[7]));495495- input_report_abs(gc->dev[i], ABS_Y, !(s & data[4]) - !(s & data[5]));496496- }497497-498498- if (s & gc->pads[GC_NES])499499- for (j = 0; j < 4; j++)500500- input_report_key(gc->dev[i], gc_snes_btn[j], s & data[gc_nes_bytes[j]]);501501-502502- if (s & gc->pads[GC_SNES])503503- for (j = 0; j < 8; j++)504504- input_report_key(gc->dev[i], gc_snes_btn[j], s & data[gc_snes_bytes[j]]);505505-506506- input_sync(gc->dev[i]);507507- }508508- }424424+ if (gc->pads[GC_NES] || gc->pads[GC_SNES])425425+ gc_nes_process_packet(gc);509426510427/*511428 * Multi and Multi2 joysticks512429 */513430514514- if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) {515515-516516- gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data);517517-518518- for (i = 0; i < 5; i++) {519519-520520- s = gc_status_bit[i];521521-522522- if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) {523523- input_report_abs(gc->dev[i], ABS_X, !(s & data[2]) - !(s & data[3]));524524- input_report_abs(gc->dev[i], ABS_Y, !(s & data[0]) - !(s & data[1]));525525- input_report_key(gc->dev[i], BTN_TRIGGER, s & data[4]);526526- }527527-528528- if (s & gc->pads[GC_MULTI2])529529- input_report_key(gc->dev[i], BTN_THUMB, s & data[5]);530530-531531- input_sync(gc->dev[i]);532532- }533533- }431431+ if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2])432432+ gc_multi_process_packet(gc);534433535434/*536435 * PSX controllers537436 */538437539539- if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) {540540-541541- gc_psx_read_packet(gc, data_psx, data);542542-543543- for (i = 0; i < 5; i++) {544544- switch (data[i]) {545545-546546- case GC_PSX_RUMBLE:547547-548548- input_report_key(gc->dev[i], BTN_THUMBL, ~data_psx[i][0] & 0x04);549549- input_report_key(gc->dev[i], BTN_THUMBR, ~data_psx[i][0] & 0x02);550550-551551- case GC_PSX_NEGCON:552552- case GC_PSX_ANALOG:553553-554554- if (gc->pads[GC_DDR] & gc_status_bit[i]) {555555- for(j = 0; j < 4; j++)556556- input_report_key(gc->dev[i], gc_psx_ddr_btn[j], ~data_psx[i][0] & (0x10 << j));557557- } else {558558- for (j = 0; j < 4; j++)559559- input_report_abs(gc->dev[i], gc_psx_abs[j+2], data_psx[i][j + 2]);560560-561561- input_report_abs(gc->dev[i], ABS_X, 128 + !(data_psx[i][0] & 0x20) * 127 - !(data_psx[i][0] & 0x80) * 128);562562- input_report_abs(gc->dev[i], ABS_Y, 128 + !(data_psx[i][0] & 0x40) * 127 - !(data_psx[i][0] & 0x10) * 128);563563- }564564-565565- for (j = 0; j < 8; j++)566566- input_report_key(gc->dev[i], gc_psx_btn[j], ~data_psx[i][1] & (1 << j));567567-568568- input_report_key(gc->dev[i], BTN_START, ~data_psx[i][0] & 0x08);569569- input_report_key(gc->dev[i], BTN_SELECT, ~data_psx[i][0] & 0x01);570570-571571- input_sync(gc->dev[i]);572572-573573- break;574574-575575- case GC_PSX_NORMAL:576576- if (gc->pads[GC_DDR] & gc_status_bit[i]) {577577- for(j = 0; j < 4; j++)578578- input_report_key(gc->dev[i], gc_psx_ddr_btn[j], ~data_psx[i][0] & (0x10 << j));579579- } else {580580- input_report_abs(gc->dev[i], ABS_X, 128 + !(data_psx[i][0] & 0x20) * 127 - !(data_psx[i][0] & 0x80) * 128);581581- input_report_abs(gc->dev[i], ABS_Y, 128 + !(data_psx[i][0] & 0x40) * 127 - !(data_psx[i][0] & 0x10) * 128);582582-583583- /* for some reason if the extra axes are left unset they drift */584584- /* for (j = 0; j < 4; j++)585585- input_report_abs(gc->dev[i], gc_psx_abs[j+2], 128);586586- * This needs to be debugged properly,587587- * maybe fuzz processing needs to be done in input_sync()588588- * --vojtech589589- */590590- }591591-592592- for (j = 0; j < 8; j++)593593- input_report_key(gc->dev[i], gc_psx_btn[j], ~data_psx[i][1] & (1 << j));594594-595595- input_report_key(gc->dev[i], BTN_START, ~data_psx[i][0] & 0x08);596596- input_report_key(gc->dev[i], BTN_SELECT, ~data_psx[i][0] & 0x01);597597-598598- input_sync(gc->dev[i]);599599-600600- break;601601-602602- case 0: /* not a pad, ignore */603603- break;604604- }605605- }606606- }438438+ if (gc->pads[GC_PSX] || gc->pads[GC_DDR])439439+ gc_psx_process_packet(gc);607440608441 mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME);609442}···699654 gc->timer.data = (long) gc;700655 gc->timer.function = gc_timer;701656702702- for (i = 0; i < n_pads; i++) {657657+ for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) {703658 if (!pads[i])704659 continue;705660706661 sprintf(gc->phys[i], "%s/input%d", gc->pd->port->name, i);707662 err = gc_setup_pad(gc, i, pads[i]);708663 if (err)709709- goto err_free_devs;664664+ goto err_unreg_devs;710665711711- input_register_device(gc->dev[i]);666666+ err = input_register_device(gc->dev[i]);667667+ if (err)668668+ goto err_free_dev;712669 }713670714671 if (!gc->pads[0]) {···722675 parport_put_port(pp);723676 return gc;724677725725- err_free_devs:678678+ err_free_dev:679679+ input_free_device(gc->dev[i]);680680+ err_unreg_devs:726681 while (--i >= 0)727727- input_unregister_device(gc->dev[i]);682682+ if (gc->dev[i])683683+ input_unregister_device(gc->dev[i]);728684 err_free_gc:729685 kfree(gc);730686 err_unreg_pardev:···738688 return ERR_PTR(err);739689}740690741741-static void __exit gc_remove(struct gc *gc)691691+static void gc_remove(struct gc *gc)742692{743693 int i;744694···776726777727 if (err) {778728 while (--i >= 0)779779- gc_remove(gc_base[i]);729729+ if (gc_base[i])730730+ gc_remove(gc_base[i]);780731 return err;781732 }782733
+9-2
drivers/input/joystick/grip.c
···192192 for (i = 0; i < 2; i++) {193193194194 dev = grip->dev[i];195195+ if (!dev)196196+ continue;197197+195198 grip->reads++;196199197200 switch (grip->mode[i]) {···384381 if (t > 0)385382 set_bit(t, input_dev->keybit);386383387387- input_register_device(grip->dev[i]);384384+ err = input_register_device(grip->dev[i]);385385+ if (err)386386+ goto fail4;388387 }389388390389 return 0;391390392392- fail3: for (i = 0; i < 2; i++)391391+ fail4: input_free_device(grip->dev[i]);392392+ fail3: while (--i >= 0)393393 if (grip->dev[i])394394 input_unregister_device(grip->dev[i]);395395 fail2: gameport_close(gameport);···417411static struct gameport_driver grip_drv = {418412 .driver = {419413 .name = "grip",414414+ .owner = THIS_MODULE,420415 },421416 .description = DRIVER_DESC,422417 .connect = grip_connect,
+1-1
drivers/input/joystick/iforce/iforce-main.c
···345345 int i;346346347347 input_dev = input_allocate_device();348348- if (input_dev)348348+ if (!input_dev)349349 return -ENOMEM;350350351351 init_waitqueue_head(&iforce->wait);
···204204 if (n_buttons[i] > 6) {205205 printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]);206206 err = -EINVAL;207207- goto err_free_devs;207207+ goto err_unreg_devs;208208 }209209210210 tgfx->dev[i] = input_dev = input_allocate_device();211211 if (!input_dev) {212212 printk(KERN_ERR "turbografx.c: Not enough memory for input device\n");213213 err = -ENOMEM;214214- goto err_free_devs;214214+ goto err_unreg_devs;215215 }216216217217 tgfx->sticks |= (1 << i);···238238 for (j = 0; j < n_buttons[i]; j++)239239 set_bit(tgfx_buttons[j], input_dev->keybit);240240241241- input_register_device(tgfx->dev[i]);241241+ err = input_register_device(tgfx->dev[i]);242242+ if (err)243243+ goto err_free_dev;242244 }243245244246 if (!tgfx->sticks) {···251249252250 return tgfx;253251254254- err_free_devs:252252+ err_free_dev:253253+ input_free_device(tgfx->dev[i]);254254+ err_unreg_devs:255255 while (--i >= 0)256256- input_unregister_device(tgfx->dev[i]);256256+ if (tgfx->dev[i])257257+ input_unregister_device(tgfx->dev[i]);257258 err_free_tgfx:258259 kfree(tgfx);259260 err_unreg_pardev:···267262 return ERR_PTR(err);268263}269264270270-static void __exit tgfx_remove(struct tgfx *tgfx)265265+static void tgfx_remove(struct tgfx *tgfx)271266{272267 int i;273268···305300306301 if (err) {307302 while (--i >= 0)308308- tgfx_remove(tgfx_base[i]);303303+ if (tgfx_base[i])304304+ tgfx_remove(tgfx_base[i]);309305 return err;310306 }311307
+2-2
drivers/input/joystick/twidjoy.c
···265265 * The functions for inserting/removing us as a module.266266 */267267268268-int __init twidjoy_init(void)268268+static int __init twidjoy_init(void)269269{270270 serio_register_driver(&twidjoy_drv);271271 return 0;272272}273273274274-void __exit twidjoy_exit(void)274274+static void __exit twidjoy_exit(void)275275{276276 serio_unregister_driver(&twidjoy_drv);277277}
+12
drivers/input/misc/Kconfig
···5050 To compile this driver as a module, choose M here: the module will5151 be called wistron_btns.52525353+config INPUT_IXP4XX_BEEPER5454+ tristate "IXP4XX Beeper support"5555+ depends on ARCH_IXP4XX5656+ help5757+ If you say yes here, you can connect a beeper to the5858+ ixp4xx gpio pins. This is used by the LinkSys NSLU2.5959+6060+ If unsure, say Y.6161+6262+ To compile this driver as a module, choose M here: the6363+ module will be called ixp4xx-beeper.6464+5365config INPUT_UINPUT5466 tristate "User level driver support"5567 help
···356356 kfree(mousedev);357357}358358359359-static int mixdev_release(void)359359+static void mixdev_release(void)360360{361361 struct input_handle *handle;362362···370370 mousedev_free(mousedev);371371 }372372 }373373-374374- return 0;375373}376374377375static int mousedev_release(struct inode * inode, struct file * file)···382384383385 if (!--list->mousedev->open) {384386 if (list->mousedev->minor == MOUSEDEV_MIX)385385- return mixdev_release();386386-387387- if (!mousedev_mix.open) {387387+ mixdev_release();388388+ else if (!mousedev_mix.open) {388389 if (list->mousedev->exist)389390 input_close_device(&list->mousedev->handle);390391 else
+1-1
drivers/input/touchscreen/mk712.c
···154154 spin_unlock_irqrestore(&mk712_lock, flags);155155}156156157157-int __init mk712_init(void)157157+static int __init mk712_init(void)158158{159159 int err;160160