Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input

+555 -276
+46 -42
drivers/input/joystick/a3d.c
··· 57 57 struct a3d { 58 58 struct gameport *gameport; 59 59 struct gameport *adc; 60 - struct input_dev dev; 60 + struct input_dev *dev; 61 61 int axes[4]; 62 62 int buttons; 63 63 int mode; ··· 115 115 116 116 static void a3d_read(struct a3d *a3d, unsigned char *data) 117 117 { 118 - struct input_dev *dev = &a3d->dev; 118 + struct input_dev *dev = a3d->dev; 119 119 120 120 switch (a3d->mode) { 121 121 ··· 265 265 static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) 266 266 { 267 267 struct a3d *a3d; 268 + struct input_dev *input_dev; 268 269 struct gameport *adc; 269 270 unsigned char data[A3D_MAX_LENGTH]; 270 271 int i; 271 272 int err; 272 273 273 - if (!(a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL))) 274 - return -ENOMEM; 274 + a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL); 275 + input_dev = input_allocate_device(); 276 + if (!a3d || !input_dev) { 277 + err = -ENOMEM; 278 + goto fail1; 279 + } 275 280 281 + a3d->dev = input_dev; 276 282 a3d->gameport = gameport; 277 283 278 284 gameport_set_drvdata(gameport, a3d); ··· 308 302 309 303 sprintf(a3d->phys, "%s/input0", gameport->phys); 310 304 305 + input_dev->name = a3d_names[a3d->mode]; 306 + input_dev->phys = a3d->phys; 307 + input_dev->id.bustype = BUS_GAMEPORT; 308 + input_dev->id.vendor = GAMEPORT_ID_VENDOR_MADCATZ; 309 + input_dev->id.product = a3d->mode; 310 + input_dev->id.version = 0x0100; 311 + input_dev->cdev.dev = &gameport->dev; 312 + input_dev->private = a3d; 313 + input_dev->open = a3d_open; 314 + input_dev->close = a3d_close; 315 + 311 316 if (a3d->mode == A3D_MODE_PXL) { 312 317 313 318 int axes[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER }; 314 319 315 320 a3d->length = 33; 316 321 317 - init_input_dev(&a3d->dev); 318 - 319 - a3d->dev.evbit[0] |= BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL); 320 - a3d->dev.relbit[0] |= BIT(REL_X) | BIT(REL_Y); 321 - a3d->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_THROTTLE) | BIT(ABS_RUDDER) 322 - | BIT(ABS_HAT0X) | BIT(ABS_HAT0Y) | BIT(ABS_HAT1X) | BIT(ABS_HAT1Y); 323 - 324 - a3d->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE) 325 - | BIT(BTN_SIDE) | BIT(BTN_EXTRA); 326 - 327 - a3d->dev.keybit[LONG(BTN_JOYSTICK)] |= BIT(BTN_TRIGGER) | BIT(BTN_THUMB) | BIT(BTN_TOP) | BIT(BTN_PINKIE); 322 + input_dev->evbit[0] |= BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL); 323 + input_dev->relbit[0] |= BIT(REL_X) | BIT(REL_Y); 324 + input_dev->absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_THROTTLE) | BIT(ABS_RUDDER) 325 + | BIT(ABS_HAT0X) | BIT(ABS_HAT0Y) | BIT(ABS_HAT1X) | BIT(ABS_HAT1Y); 326 + input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE) 327 + | BIT(BTN_SIDE) | BIT(BTN_EXTRA); 328 + input_dev->keybit[LONG(BTN_JOYSTICK)] |= BIT(BTN_TRIGGER) | BIT(BTN_THUMB) | BIT(BTN_TOP) 329 + | BIT(BTN_PINKIE); 328 330 329 331 a3d_read(a3d, data); 330 332 331 333 for (i = 0; i < 4; i++) { 332 334 if (i < 2) 333 - input_set_abs_params(&a3d->dev, axes[i], 48, a3d->dev.abs[axes[i]] * 2 - 48, 0, 8); 335 + input_set_abs_params(input_dev, axes[i], 48, input_dev->abs[axes[i]] * 2 - 48, 0, 8); 334 336 else 335 - input_set_abs_params(&a3d->dev, axes[i], 2, 253, 0, 0); 336 - input_set_abs_params(&a3d->dev, ABS_HAT0X + i, -1, 1, 0, 0); 337 + input_set_abs_params(input_dev, axes[i], 2, 253, 0, 0); 338 + input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); 337 339 } 338 340 339 341 } else { 340 342 a3d->length = 29; 341 343 342 - init_input_dev(&a3d->dev); 343 - 344 - a3d->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_REL); 345 - a3d->dev.relbit[0] |= BIT(REL_X) | BIT(REL_Y); 346 - a3d->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE); 344 + input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_REL); 345 + input_dev->relbit[0] |= BIT(REL_X) | BIT(REL_Y); 346 + input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE); 347 347 348 348 a3d_read(a3d, data); 349 349 ··· 370 358 } 371 359 } 372 360 373 - a3d->dev.private = a3d; 374 - a3d->dev.open = a3d_open; 375 - a3d->dev.close = a3d_close; 376 - 377 - a3d->dev.name = a3d_names[a3d->mode]; 378 - a3d->dev.phys = a3d->phys; 379 - a3d->dev.id.bustype = BUS_GAMEPORT; 380 - a3d->dev.id.vendor = GAMEPORT_ID_VENDOR_MADCATZ; 381 - a3d->dev.id.product = a3d->mode; 382 - a3d->dev.id.version = 0x0100; 383 - 384 - input_register_device(&a3d->dev); 385 - printk(KERN_INFO "input: %s on %s\n", a3d_names[a3d->mode], a3d->phys); 361 + err = input_register_device(a3d->dev); 362 + if (err) 363 + goto fail3; 386 364 387 365 return 0; 388 366 389 - fail2: gameport_close(gameport); 390 - fail1: gameport_set_drvdata(gameport, NULL); 367 + fail3: if (a3d->adc) 368 + gameport_unregister_port(a3d->adc); 369 + fail2: gameport_close(gameport); 370 + fail1: gameport_set_drvdata(gameport, NULL); 371 + input_free_device(input_dev); 391 372 kfree(a3d); 392 373 return err; 393 374 } ··· 389 384 { 390 385 struct a3d *a3d = gameport_get_drvdata(gameport); 391 386 392 - input_unregister_device(&a3d->dev); 393 - if (a3d->adc) { 387 + input_unregister_device(a3d->dev); 388 + if (a3d->adc) 394 389 gameport_unregister_port(a3d->adc); 395 - a3d->adc = NULL; 396 - } 397 390 gameport_close(gameport); 398 391 gameport_set_drvdata(gameport, NULL); 399 392 kfree(a3d); ··· 400 397 static struct gameport_driver a3d_drv = { 401 398 .driver = { 402 399 .name = "adc", 400 + .owner = THIS_MODULE, 403 401 }, 404 402 .description = DRIVER_DESC, 405 403 .connect = a3d_connect,
+46 -39
drivers/input/joystick/db9.c
··· 275 275 /* 276 276 * db9_saturn_report() analyzes packet and reports. 277 277 */ 278 - static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *dev, int n, int max_pads) 278 + static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *devs[], int n, int max_pads) 279 279 { 280 + struct input_dev *dev; 280 281 int tmp, i, j; 281 282 282 283 tmp = (id == 0x41) ? 60 : 10; 283 - for (j = 0; (j < tmp) && (n < max_pads); j += 10, n++) { 284 + for (j = 0; j < tmp && n < max_pads; j += 10, n++) { 285 + dev = devs[n]; 284 286 switch (data[j]) { 285 287 case 0x16: /* multi controller (analog 4 axis) */ 286 - input_report_abs(dev + n, db9_abs[5], data[j + 6]); 288 + input_report_abs(dev, db9_abs[5], data[j + 6]); 287 289 case 0x15: /* mission stick (analog 3 axis) */ 288 - input_report_abs(dev + n, db9_abs[3], data[j + 4]); 289 - input_report_abs(dev + n, db9_abs[4], data[j + 5]); 290 + input_report_abs(dev, db9_abs[3], data[j + 4]); 291 + input_report_abs(dev, db9_abs[4], data[j + 5]); 290 292 case 0x13: /* racing controller (analog 1 axis) */ 291 - input_report_abs(dev + n, db9_abs[2], data[j + 3]); 293 + input_report_abs(dev, db9_abs[2], data[j + 3]); 292 294 case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */ 293 295 case 0x02: /* digital pad (digital 2 axis + buttons) */ 294 - input_report_abs(dev + n, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); 295 - input_report_abs(dev + n, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); 296 + input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); 297 + input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); 296 298 for (i = 0; i < 9; i++) 297 - input_report_key(dev + n, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); 299 + input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); 298 300 break; 299 301 case 0x19: /* mission stick x2 (analog 6 axis + buttons) */ 300 - input_report_abs(dev + n, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); 301 - input_report_abs(dev + n, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); 302 + input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); 303 + input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); 302 304 for (i = 0; i < 9; i++) 303 - input_report_key(dev + n, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); 304 - input_report_abs(dev + n, db9_abs[2], data[j + 3]); 305 - input_report_abs(dev + n, db9_abs[3], data[j + 4]); 306 - input_report_abs(dev + n, db9_abs[4], data[j + 5]); 305 + input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); 306 + input_report_abs(dev, db9_abs[2], data[j + 3]); 307 + input_report_abs(dev, db9_abs[3], data[j + 4]); 308 + input_report_abs(dev, db9_abs[4], data[j + 5]); 307 309 /* 308 - input_report_abs(dev + n, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1)); 309 - input_report_abs(dev + n, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1)); 310 + input_report_abs(dev, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1)); 311 + input_report_abs(dev, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1)); 310 312 */ 311 - input_report_abs(dev + n, db9_abs[6], data[j + 7]); 312 - input_report_abs(dev + n, db9_abs[7], data[j + 8]); 313 - input_report_abs(dev + n, db9_abs[5], data[j + 9]); 313 + input_report_abs(dev, db9_abs[6], data[j + 7]); 314 + input_report_abs(dev, db9_abs[7], data[j + 8]); 315 + input_report_abs(dev, db9_abs[5], data[j + 9]); 314 316 break; 315 317 case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */ 316 - input_report_key(dev + n, BTN_A, data[j + 3] & 0x80); 317 - input_report_abs(dev + n, db9_abs[2], data[j + 3] & 0x7f); 318 + input_report_key(dev, BTN_A, data[j + 3] & 0x80); 319 + input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f); 318 320 break; 319 321 case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */ 320 - input_report_key(dev + n, BTN_START, data[j + 1] & 0x08); 321 - input_report_key(dev + n, BTN_A, data[j + 1] & 0x04); 322 - input_report_key(dev + n, BTN_C, data[j + 1] & 0x02); 323 - input_report_key(dev + n, BTN_B, data[j + 1] & 0x01); 324 - input_report_abs(dev + n, db9_abs[2], data[j + 2] ^ 0x80); 325 - input_report_abs(dev + n, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */ 322 + input_report_key(dev, BTN_START, data[j + 1] & 0x08); 323 + input_report_key(dev, BTN_A, data[j + 1] & 0x04); 324 + input_report_key(dev, BTN_C, data[j + 1] & 0x02); 325 + input_report_key(dev, BTN_B, data[j + 1] & 0x01); 326 + input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80); 327 + input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */ 326 328 break; 327 329 case 0xff: 328 330 default: /* no pad */ 329 - input_report_abs(dev + n, db9_abs[0], 0); 330 - input_report_abs(dev + n, db9_abs[1], 0); 331 + input_report_abs(dev, db9_abs[0], 0); 332 + input_report_abs(dev, db9_abs[1], 0); 331 333 for (i = 0; i < 9; i++) 332 - input_report_key(dev + n, db9_cd32_btn[i], 0); 334 + input_report_key(dev, db9_cd32_btn[i], 0); 333 335 break; 334 336 } 335 337 } 336 338 return n; 337 339 } 338 340 339 - static int db9_saturn(int mode, struct parport *port, struct input_dev *dev) 341 + static int db9_saturn(int mode, struct parport *port, struct input_dev *devs[]) 340 342 { 341 343 unsigned char id, data[60]; 342 344 int type, n, max_pads; ··· 363 361 max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES); 364 362 for (tmp = 0, i = 0; i < n; i++) { 365 363 id = db9_saturn_read_packet(port, data, type + i, 1); 366 - tmp = db9_saturn_report(id, data, dev, tmp, max_pads); 364 + tmp = db9_saturn_report(id, data, devs, tmp, max_pads); 367 365 } 368 366 return 0; 369 367 } ··· 491 489 case DB9_SATURN_DPP: 492 490 case DB9_SATURN_DPP_2: 493 491 494 - db9_saturn(db9->mode, port, dev); 492 + db9_saturn(db9->mode, port, db9->dev); 495 493 break; 496 494 497 495 case DB9_CD32_PAD: ··· 616 614 if (!input_dev) { 617 615 printk(KERN_ERR "db9.c: Not enough memory for input device\n"); 618 616 err = -ENOMEM; 619 - goto err_free_devs; 617 + goto err_unreg_devs; 620 618 } 621 619 622 620 sprintf(db9->phys[i], "%s/input%d", db9->pd->port->name, i); ··· 642 640 input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0); 643 641 } 644 642 645 - input_register_device(input_dev); 643 + err = input_register_device(input_dev); 644 + if (err) 645 + goto err_free_dev; 646 646 } 647 647 648 648 parport_put_port(pp); 649 649 return db9; 650 650 651 - err_free_devs: 651 + err_free_dev: 652 + input_free_device(db9->dev[i]); 653 + err_unreg_devs: 652 654 while (--i >= 0) 653 655 input_unregister_device(db9->dev[i]); 654 656 kfree(db9); ··· 664 658 return ERR_PTR(err); 665 659 } 666 660 667 - static void __exit db9_remove(struct db9 *db9) 661 + static void db9_remove(struct db9 *db9) 668 662 { 669 663 int i; 670 664 ··· 702 696 703 697 if (err) { 704 698 while (--i >= 0) 705 - db9_remove(db9_base[i]); 699 + if (db9_base[i]) 700 + db9_remove(db9_base[i]); 706 701 return err; 707 702 } 708 703
+216 -165
drivers/input/joystick/gamecon.c
··· 159 159 160 160 } 161 161 162 + static void gc_n64_process_packet(struct gc *gc) 163 + { 164 + unsigned char data[GC_N64_LENGTH]; 165 + signed char axes[2]; 166 + struct input_dev *dev; 167 + int i, j, s; 168 + 169 + gc_n64_read_packet(gc, data); 170 + 171 + for (i = 0; i < GC_MAX_DEVICES; i++) { 172 + 173 + dev = gc->dev[i]; 174 + if (!dev) 175 + continue; 176 + 177 + s = gc_status_bit[i]; 178 + 179 + if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { 180 + 181 + axes[0] = axes[1] = 0; 182 + 183 + for (j = 0; j < 8; j++) { 184 + if (data[23 - j] & s) 185 + axes[0] |= 1 << j; 186 + if (data[31 - j] & s) 187 + axes[1] |= 1 << j; 188 + } 189 + 190 + input_report_abs(dev, ABS_X, axes[0]); 191 + input_report_abs(dev, ABS_Y, -axes[1]); 192 + 193 + input_report_abs(dev, ABS_HAT0X, !(s & data[6]) - !(s & data[7])); 194 + input_report_abs(dev, ABS_HAT0Y, !(s & data[4]) - !(s & data[5])); 195 + 196 + for (j = 0; j < 10; j++) 197 + input_report_key(dev, gc_n64_btn[j], s & data[gc_n64_bytes[j]]); 198 + 199 + input_sync(dev); 200 + } 201 + } 202 + } 203 + 162 204 /* 163 205 * NES/SNES support. 164 206 */ ··· 240 198 } 241 199 } 242 200 201 + static void gc_nes_process_packet(struct gc *gc) 202 + { 203 + unsigned char data[GC_SNES_LENGTH]; 204 + struct input_dev *dev; 205 + int i, j, s; 206 + 207 + gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data); 208 + 209 + for (i = 0; i < GC_MAX_DEVICES; i++) { 210 + 211 + dev = gc->dev[i]; 212 + if (!dev) 213 + continue; 214 + 215 + s = gc_status_bit[i]; 216 + 217 + if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) { 218 + input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); 219 + input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); 220 + } 221 + 222 + if (s & gc->pads[GC_NES]) 223 + for (j = 0; j < 4; j++) 224 + input_report_key(dev, gc_snes_btn[j], s & data[gc_nes_bytes[j]]); 225 + 226 + if (s & gc->pads[GC_SNES]) 227 + for (j = 0; j < 8; j++) 228 + input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]); 229 + 230 + input_sync(dev); 231 + } 232 + } 233 + 243 234 /* 244 235 * Multisystem joystick support 245 236 */ ··· 291 216 for (i = 0; i < length; i++) { 292 217 parport_write_data(gc->pd->port, ~(1 << i)); 293 218 data[i] = parport_read_status(gc->pd->port) ^ 0x7f; 219 + } 220 + } 221 + 222 + static void gc_multi_process_packet(struct gc *gc) 223 + { 224 + unsigned char data[GC_MULTI2_LENGTH]; 225 + struct input_dev *dev; 226 + int i, s; 227 + 228 + gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data); 229 + 230 + for (i = 0; i < GC_MAX_DEVICES; i++) { 231 + 232 + dev = gc->dev[i]; 233 + if (!dev) 234 + continue; 235 + 236 + s = gc_status_bit[i]; 237 + 238 + if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { 239 + input_report_abs(dev, ABS_X, !(s & data[2]) - !(s & data[3])); 240 + input_report_abs(dev, ABS_Y, !(s & data[0]) - !(s & data[1])); 241 + input_report_key(dev, BTN_TRIGGER, s & data[4]); 242 + } 243 + 244 + if (s & gc->pads[GC_MULTI2]) 245 + input_report_key(dev, BTN_THUMB, s & data[5]); 246 + 247 + input_sync(dev); 294 248 } 295 249 } 296 250 ··· 367 263 * the psx pad. 368 264 */ 369 265 370 - static void gc_psx_command(struct gc *gc, int b, unsigned char data[5]) 266 + static void gc_psx_command(struct gc *gc, int b, unsigned char data[GC_MAX_DEVICES]) 371 267 { 372 268 int i, j, cmd, read; 373 - for (i = 0; i < 5; i++) 269 + 270 + for (i = 0; i < GC_MAX_DEVICES; i++) 374 271 data[i] = 0; 375 272 376 273 for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { ··· 379 274 parport_write_data(gc->pd->port, cmd | GC_PSX_POWER); 380 275 udelay(gc_psx_delay); 381 276 read = parport_read_status(gc->pd->port) ^ 0x80; 382 - for (j = 0; j < 5; j++) 277 + for (j = 0; j < GC_MAX_DEVICES; j++) 383 278 data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; 384 279 parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); 385 280 udelay(gc_psx_delay); ··· 391 286 * device identifier code. 392 287 */ 393 288 394 - static void gc_psx_read_packet(struct gc *gc, unsigned char data[5][GC_PSX_BYTES], unsigned char id[5]) 289 + static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], 290 + unsigned char id[GC_MAX_DEVICES]) 395 291 { 396 292 int i, j, max_len = 0; 397 293 unsigned long flags; 398 - unsigned char data2[5]; 294 + unsigned char data2[GC_MAX_DEVICES]; 399 295 400 296 parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); /* Select pad */ 401 297 udelay(gc_psx_delay); ··· 409 303 gc_psx_command(gc, 0x42, id); /* Get device ids */ 410 304 gc_psx_command(gc, 0, data2); /* Dump status */ 411 305 412 - for (i =0; i < 5; i++) /* Find the longest pad */ 306 + for (i =0; i < GC_MAX_DEVICES; i++) /* Find the longest pad */ 413 307 if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) 414 308 && (GC_PSX_LEN(id[i]) > max_len) 415 309 && (GC_PSX_LEN(id[i]) <= GC_PSX_BYTES)) ··· 417 311 418 312 for (i = 0; i < max_len; i++) { /* Read in all the data */ 419 313 gc_psx_command(gc, 0, data2); 420 - for (j = 0; j < 5; j++) 314 + for (j = 0; j < GC_MAX_DEVICES; j++) 421 315 data[j][i] = data2[j]; 422 316 } 423 317 ··· 425 319 426 320 parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); 427 321 428 - for(i = 0; i < 5; i++) /* Set id's to the real value */ 322 + for(i = 0; i < GC_MAX_DEVICES; i++) /* Set id's to the real value */ 429 323 id[i] = GC_PSX_ID(id[i]); 430 324 } 431 325 432 - /* 433 - * gc_timer() reads and analyzes console pads data. 434 - */ 326 + static void gc_psx_process_packet(struct gc *gc) 327 + { 328 + unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; 329 + unsigned char id[GC_MAX_DEVICES]; 330 + struct input_dev *dev; 331 + int i, j; 435 332 436 - #define GC_MAX_LENGTH GC_N64_LENGTH 333 + gc_psx_read_packet(gc, data, id); 334 + 335 + for (i = 0; i < GC_MAX_DEVICES; i++) { 336 + 337 + dev = gc->dev[i]; 338 + if (!dev) 339 + continue; 340 + 341 + switch (id[i]) { 342 + 343 + case GC_PSX_RUMBLE: 344 + 345 + input_report_key(dev, BTN_THUMBL, ~data[i][0] & 0x04); 346 + input_report_key(dev, BTN_THUMBR, ~data[i][0] & 0x02); 347 + 348 + case GC_PSX_NEGCON: 349 + case GC_PSX_ANALOG: 350 + 351 + if (gc->pads[GC_DDR] & gc_status_bit[i]) { 352 + for(j = 0; j < 4; j++) 353 + input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); 354 + } else { 355 + for (j = 0; j < 4; j++) 356 + input_report_abs(dev, gc_psx_abs[j + 2], data[i][j + 2]); 357 + 358 + input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); 359 + input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); 360 + } 361 + 362 + for (j = 0; j < 8; j++) 363 + input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); 364 + 365 + input_report_key(dev, BTN_START, ~data[i][0] & 0x08); 366 + input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); 367 + 368 + input_sync(dev); 369 + 370 + break; 371 + 372 + case GC_PSX_NORMAL: 373 + if (gc->pads[GC_DDR] & gc_status_bit[i]) { 374 + for(j = 0; j < 4; j++) 375 + input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); 376 + } else { 377 + input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); 378 + input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); 379 + 380 + /* for some reason if the extra axes are left unset they drift */ 381 + /* for (j = 0; j < 4; j++) 382 + input_report_abs(dev, gc_psx_abs[j + 2], 128); 383 + * This needs to be debugged properly, 384 + * maybe fuzz processing needs to be done in input_sync() 385 + * --vojtech 386 + */ 387 + } 388 + 389 + for (j = 0; j < 8; j++) 390 + input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); 391 + 392 + input_report_key(dev, BTN_START, ~data[i][0] & 0x08); 393 + input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); 394 + 395 + input_sync(dev); 396 + 397 + break; 398 + 399 + case 0: /* not a pad, ignore */ 400 + break; 401 + } 402 + } 403 + } 404 + 405 + /* 406 + * gc_timer() initiates reads of console pads data. 407 + */ 437 408 438 409 static void gc_timer(unsigned long private) 439 410 { 440 411 struct gc *gc = (void *) private; 441 - unsigned char data[GC_MAX_LENGTH]; 442 - unsigned char data_psx[5][GC_PSX_BYTES]; 443 - int i, j, s; 444 412 445 413 /* 446 414 * N64 pads - must be read first, any read confuses them for 200 us 447 415 */ 448 416 449 - if (gc->pads[GC_N64]) { 450 - 451 - gc_n64_read_packet(gc, data); 452 - 453 - for (i = 0; i < 5; i++) { 454 - 455 - s = gc_status_bit[i]; 456 - 457 - if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { 458 - 459 - signed char axes[2]; 460 - axes[0] = axes[1] = 0; 461 - 462 - for (j = 0; j < 8; j++) { 463 - if (data[23 - j] & s) axes[0] |= 1 << j; 464 - if (data[31 - j] & s) axes[1] |= 1 << j; 465 - } 466 - 467 - input_report_abs(gc->dev[i], ABS_X, axes[0]); 468 - input_report_abs(gc->dev[i], ABS_Y, -axes[1]); 469 - 470 - input_report_abs(gc->dev[i], ABS_HAT0X, !(s & data[6]) - !(s & data[7])); 471 - input_report_abs(gc->dev[i], ABS_HAT0Y, !(s & data[4]) - !(s & data[5])); 472 - 473 - for (j = 0; j < 10; j++) 474 - input_report_key(gc->dev[i], gc_n64_btn[j], s & data[gc_n64_bytes[j]]); 475 - 476 - input_sync(gc->dev[i]); 477 - } 478 - } 479 - } 417 + if (gc->pads[GC_N64]) 418 + gc_n64_process_packet(gc); 480 419 481 420 /* 482 421 * NES and SNES pads 483 422 */ 484 423 485 - if (gc->pads[GC_NES] || gc->pads[GC_SNES]) { 486 - 487 - gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data); 488 - 489 - for (i = 0; i < 5; i++) { 490 - 491 - s = gc_status_bit[i]; 492 - 493 - if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) { 494 - input_report_abs(gc->dev[i], ABS_X, !(s & data[6]) - !(s & data[7])); 495 - input_report_abs(gc->dev[i], ABS_Y, !(s & data[4]) - !(s & data[5])); 496 - } 497 - 498 - if (s & gc->pads[GC_NES]) 499 - for (j = 0; j < 4; j++) 500 - input_report_key(gc->dev[i], gc_snes_btn[j], s & data[gc_nes_bytes[j]]); 501 - 502 - if (s & gc->pads[GC_SNES]) 503 - for (j = 0; j < 8; j++) 504 - input_report_key(gc->dev[i], gc_snes_btn[j], s & data[gc_snes_bytes[j]]); 505 - 506 - input_sync(gc->dev[i]); 507 - } 508 - } 424 + if (gc->pads[GC_NES] || gc->pads[GC_SNES]) 425 + gc_nes_process_packet(gc); 509 426 510 427 /* 511 428 * Multi and Multi2 joysticks 512 429 */ 513 430 514 - if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) { 515 - 516 - gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data); 517 - 518 - for (i = 0; i < 5; i++) { 519 - 520 - s = gc_status_bit[i]; 521 - 522 - if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { 523 - input_report_abs(gc->dev[i], ABS_X, !(s & data[2]) - !(s & data[3])); 524 - input_report_abs(gc->dev[i], ABS_Y, !(s & data[0]) - !(s & data[1])); 525 - input_report_key(gc->dev[i], BTN_TRIGGER, s & data[4]); 526 - } 527 - 528 - if (s & gc->pads[GC_MULTI2]) 529 - input_report_key(gc->dev[i], BTN_THUMB, s & data[5]); 530 - 531 - input_sync(gc->dev[i]); 532 - } 533 - } 431 + if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) 432 + gc_multi_process_packet(gc); 534 433 535 434 /* 536 435 * PSX controllers 537 436 */ 538 437 539 - if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) { 540 - 541 - gc_psx_read_packet(gc, data_psx, data); 542 - 543 - for (i = 0; i < 5; i++) { 544 - switch (data[i]) { 545 - 546 - case GC_PSX_RUMBLE: 547 - 548 - input_report_key(gc->dev[i], BTN_THUMBL, ~data_psx[i][0] & 0x04); 549 - input_report_key(gc->dev[i], BTN_THUMBR, ~data_psx[i][0] & 0x02); 550 - 551 - case GC_PSX_NEGCON: 552 - case GC_PSX_ANALOG: 553 - 554 - if (gc->pads[GC_DDR] & gc_status_bit[i]) { 555 - for(j = 0; j < 4; j++) 556 - input_report_key(gc->dev[i], gc_psx_ddr_btn[j], ~data_psx[i][0] & (0x10 << j)); 557 - } else { 558 - for (j = 0; j < 4; j++) 559 - input_report_abs(gc->dev[i], gc_psx_abs[j+2], data_psx[i][j + 2]); 560 - 561 - input_report_abs(gc->dev[i], ABS_X, 128 + !(data_psx[i][0] & 0x20) * 127 - !(data_psx[i][0] & 0x80) * 128); 562 - input_report_abs(gc->dev[i], ABS_Y, 128 + !(data_psx[i][0] & 0x40) * 127 - !(data_psx[i][0] & 0x10) * 128); 563 - } 564 - 565 - for (j = 0; j < 8; j++) 566 - input_report_key(gc->dev[i], gc_psx_btn[j], ~data_psx[i][1] & (1 << j)); 567 - 568 - input_report_key(gc->dev[i], BTN_START, ~data_psx[i][0] & 0x08); 569 - input_report_key(gc->dev[i], BTN_SELECT, ~data_psx[i][0] & 0x01); 570 - 571 - input_sync(gc->dev[i]); 572 - 573 - break; 574 - 575 - case GC_PSX_NORMAL: 576 - if (gc->pads[GC_DDR] & gc_status_bit[i]) { 577 - for(j = 0; j < 4; j++) 578 - input_report_key(gc->dev[i], gc_psx_ddr_btn[j], ~data_psx[i][0] & (0x10 << j)); 579 - } else { 580 - input_report_abs(gc->dev[i], ABS_X, 128 + !(data_psx[i][0] & 0x20) * 127 - !(data_psx[i][0] & 0x80) * 128); 581 - input_report_abs(gc->dev[i], ABS_Y, 128 + !(data_psx[i][0] & 0x40) * 127 - !(data_psx[i][0] & 0x10) * 128); 582 - 583 - /* for some reason if the extra axes are left unset they drift */ 584 - /* for (j = 0; j < 4; j++) 585 - input_report_abs(gc->dev[i], gc_psx_abs[j+2], 128); 586 - * This needs to be debugged properly, 587 - * maybe fuzz processing needs to be done in input_sync() 588 - * --vojtech 589 - */ 590 - } 591 - 592 - for (j = 0; j < 8; j++) 593 - input_report_key(gc->dev[i], gc_psx_btn[j], ~data_psx[i][1] & (1 << j)); 594 - 595 - input_report_key(gc->dev[i], BTN_START, ~data_psx[i][0] & 0x08); 596 - input_report_key(gc->dev[i], BTN_SELECT, ~data_psx[i][0] & 0x01); 597 - 598 - input_sync(gc->dev[i]); 599 - 600 - break; 601 - 602 - case 0: /* not a pad, ignore */ 603 - break; 604 - } 605 - } 606 - } 438 + if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) 439 + gc_psx_process_packet(gc); 607 440 608 441 mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); 609 442 } ··· 699 654 gc->timer.data = (long) gc; 700 655 gc->timer.function = gc_timer; 701 656 702 - for (i = 0; i < n_pads; i++) { 657 + for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { 703 658 if (!pads[i]) 704 659 continue; 705 660 706 661 sprintf(gc->phys[i], "%s/input%d", gc->pd->port->name, i); 707 662 err = gc_setup_pad(gc, i, pads[i]); 708 663 if (err) 709 - goto err_free_devs; 664 + goto err_unreg_devs; 710 665 711 - input_register_device(gc->dev[i]); 666 + err = input_register_device(gc->dev[i]); 667 + if (err) 668 + goto err_free_dev; 712 669 } 713 670 714 671 if (!gc->pads[0]) { ··· 722 675 parport_put_port(pp); 723 676 return gc; 724 677 725 - err_free_devs: 678 + err_free_dev: 679 + input_free_device(gc->dev[i]); 680 + err_unreg_devs: 726 681 while (--i >= 0) 727 - input_unregister_device(gc->dev[i]); 682 + if (gc->dev[i]) 683 + input_unregister_device(gc->dev[i]); 728 684 err_free_gc: 729 685 kfree(gc); 730 686 err_unreg_pardev: ··· 738 688 return ERR_PTR(err); 739 689 } 740 690 741 - static void __exit gc_remove(struct gc *gc) 691 + static void gc_remove(struct gc *gc) 742 692 { 743 693 int i; 744 694 ··· 776 726 777 727 if (err) { 778 728 while (--i >= 0) 779 - gc_remove(gc_base[i]); 729 + if (gc_base[i]) 730 + gc_remove(gc_base[i]); 780 731 return err; 781 732 } 782 733
+9 -2
drivers/input/joystick/grip.c
··· 192 192 for (i = 0; i < 2; i++) { 193 193 194 194 dev = grip->dev[i]; 195 + if (!dev) 196 + continue; 197 + 195 198 grip->reads++; 196 199 197 200 switch (grip->mode[i]) { ··· 384 381 if (t > 0) 385 382 set_bit(t, input_dev->keybit); 386 383 387 - input_register_device(grip->dev[i]); 384 + err = input_register_device(grip->dev[i]); 385 + if (err) 386 + goto fail4; 388 387 } 389 388 390 389 return 0; 391 390 392 - fail3: for (i = 0; i < 2; i++) 391 + fail4: input_free_device(grip->dev[i]); 392 + fail3: while (--i >= 0) 393 393 if (grip->dev[i]) 394 394 input_unregister_device(grip->dev[i]); 395 395 fail2: gameport_close(gameport); ··· 417 411 static struct gameport_driver grip_drv = { 418 412 .driver = { 419 413 .name = "grip", 414 + .owner = THIS_MODULE, 420 415 }, 421 416 .description = DRIVER_DESC, 422 417 .connect = grip_connect,
+1 -1
drivers/input/joystick/iforce/iforce-main.c
··· 345 345 int i; 346 346 347 347 input_dev = input_allocate_device(); 348 - if (input_dev) 348 + if (!input_dev) 349 349 return -ENOMEM; 350 350 351 351 init_waitqueue_head(&iforce->wait);
+2 -2
drivers/input/joystick/iforce/iforce-packets.c
··· 167 167 iforce->expect_packet = 0; 168 168 iforce->ecmd = cmd; 169 169 memcpy(iforce->edata, data, IFORCE_MAX_LENGTH); 170 - wake_up(&iforce->wait); 171 170 } 172 171 #endif 172 + wake_up(&iforce->wait); 173 173 174 174 if (!iforce->type) { 175 175 being_used--; ··· 264 264 wait_event_interruptible_timeout(iforce->wait, 265 265 iforce->ctrl->status != -EINPROGRESS, HZ); 266 266 267 - if (iforce->ctrl->status != -EINPROGRESS) { 267 + if (iforce->ctrl->status) { 268 268 usb_unlink_urb(iforce->ctrl); 269 269 return -1; 270 270 }
-1
drivers/input/joystick/iforce/iforce-usb.c
··· 95 95 goto exit; 96 96 } 97 97 98 - wake_up(&iforce->wait); 99 98 iforce_process_packet(iforce, 100 99 (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1, regs); 101 100
+7 -3
drivers/input/joystick/sidewinder.c
··· 736 736 sprintf(sw->name, "Microsoft SideWinder %s", sw_name[sw->type]); 737 737 sprintf(sw->phys[i], "%s/input%d", gameport->phys, i); 738 738 739 - input_dev = input_allocate_device(); 739 + sw->dev[i] = input_dev = input_allocate_device(); 740 740 if (!input_dev) { 741 741 err = -ENOMEM; 742 742 goto fail3; ··· 771 771 772 772 dbg("%s%s [%d-bit id %d data %d]\n", sw->name, comment, m, l, k); 773 773 774 - input_register_device(sw->dev[i]); 774 + err = input_register_device(sw->dev[i]); 775 + if (err) 776 + goto fail4; 775 777 } 776 778 777 779 return 0; 778 780 779 - fail3: while (--i >= 0) 781 + fail4: input_free_device(sw->dev[i]); 782 + fail3: while (--i >= 0) 780 783 input_unregister_device(sw->dev[i]); 781 784 fail2: gameport_close(gameport); 782 785 fail1: gameport_set_drvdata(gameport, NULL); ··· 804 801 static struct gameport_driver sw_drv = { 805 802 .driver = { 806 803 .name = "sidewinder", 804 + .owner = THIS_MODULE, 807 805 }, 808 806 .description = DRIVER_DESC, 809 807 .connect = sw_connect,
+11 -4
drivers/input/joystick/tmdc.c
··· 284 284 struct tmdc_port *port; 285 285 struct input_dev *input_dev; 286 286 int i, j, b = 0; 287 + int err; 287 288 288 289 tmdc->port[idx] = port = kzalloc(sizeof (struct tmdc_port), GFP_KERNEL); 289 290 input_dev = input_allocate_device(); 290 291 if (!port || !input_dev) { 291 - kfree(port); 292 - input_free_device(input_dev); 293 - return -ENOMEM; 292 + err = -ENOMEM; 293 + goto fail; 294 294 } 295 295 296 296 port->mode = data[TMDC_BYTE_ID]; ··· 347 347 b += port->btnc[i]; 348 348 } 349 349 350 - input_register_device(port->dev); 350 + err = input_register_device(port->dev); 351 + if (err) 352 + goto fail; 351 353 352 354 return 0; 355 + 356 + fail: input_free_device(input_dev); 357 + kfree(port); 358 + return err; 353 359 } 354 360 355 361 /* ··· 430 424 static struct gameport_driver tmdc_drv = { 431 425 .driver = { 432 426 .name = "tmdc", 427 + .owner = THIS_MODULE, 433 428 }, 434 429 .description = DRIVER_DESC, 435 430 .connect = tmdc_connect,
+13 -7
drivers/input/joystick/turbografx.c
··· 204 204 if (n_buttons[i] > 6) { 205 205 printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); 206 206 err = -EINVAL; 207 - goto err_free_devs; 207 + goto err_unreg_devs; 208 208 } 209 209 210 210 tgfx->dev[i] = input_dev = input_allocate_device(); 211 211 if (!input_dev) { 212 212 printk(KERN_ERR "turbografx.c: Not enough memory for input device\n"); 213 213 err = -ENOMEM; 214 - goto err_free_devs; 214 + goto err_unreg_devs; 215 215 } 216 216 217 217 tgfx->sticks |= (1 << i); ··· 238 238 for (j = 0; j < n_buttons[i]; j++) 239 239 set_bit(tgfx_buttons[j], input_dev->keybit); 240 240 241 - input_register_device(tgfx->dev[i]); 241 + err = input_register_device(tgfx->dev[i]); 242 + if (err) 243 + goto err_free_dev; 242 244 } 243 245 244 246 if (!tgfx->sticks) { ··· 251 249 252 250 return tgfx; 253 251 254 - err_free_devs: 252 + err_free_dev: 253 + input_free_device(tgfx->dev[i]); 254 + err_unreg_devs: 255 255 while (--i >= 0) 256 - input_unregister_device(tgfx->dev[i]); 256 + if (tgfx->dev[i]) 257 + input_unregister_device(tgfx->dev[i]); 257 258 err_free_tgfx: 258 259 kfree(tgfx); 259 260 err_unreg_pardev: ··· 267 262 return ERR_PTR(err); 268 263 } 269 264 270 - static void __exit tgfx_remove(struct tgfx *tgfx) 265 + static void tgfx_remove(struct tgfx *tgfx) 271 266 { 272 267 int i; 273 268 ··· 305 300 306 301 if (err) { 307 302 while (--i >= 0) 308 - tgfx_remove(tgfx_base[i]); 303 + if (tgfx_base[i]) 304 + tgfx_remove(tgfx_base[i]); 309 305 return err; 310 306 } 311 307
+2 -2
drivers/input/joystick/twidjoy.c
··· 265 265 * The functions for inserting/removing us as a module. 266 266 */ 267 267 268 - int __init twidjoy_init(void) 268 + static int __init twidjoy_init(void) 269 269 { 270 270 serio_register_driver(&twidjoy_drv); 271 271 return 0; 272 272 } 273 273 274 - void __exit twidjoy_exit(void) 274 + static void __exit twidjoy_exit(void) 275 275 { 276 276 serio_unregister_driver(&twidjoy_drv); 277 277 }
+12
drivers/input/misc/Kconfig
··· 50 50 To compile this driver as a module, choose M here: the module will 51 51 be called wistron_btns. 52 52 53 + config INPUT_IXP4XX_BEEPER 54 + tristate "IXP4XX Beeper support" 55 + depends on ARCH_IXP4XX 56 + help 57 + If you say yes here, you can connect a beeper to the 58 + ixp4xx gpio pins. This is used by the LinkSys NSLU2. 59 + 60 + If unsure, say Y. 61 + 62 + To compile this driver as a module, choose M here: the 63 + module will be called ixp4xx-beeper. 64 + 53 65 config INPUT_UINPUT 54 66 tristate "User level driver support" 55 67 help
+1
drivers/input/misc/Makefile
··· 11 11 obj-$(CONFIG_INPUT_UINPUT) += uinput.o 12 12 obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o 13 13 obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o 14 + obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o
+183
drivers/input/misc/ixp4xx-beeper.c
··· 1 + /* 2 + * Generic IXP4xx beeper driver 3 + * 4 + * Copyright (C) 2005 Tower Technologies 5 + * 6 + * based on nslu2-io.c 7 + * Copyright (C) 2004 Karen Spearel 8 + * 9 + * Author: Alessandro Zummo <a.zummo@towertech.it> 10 + * Maintainers: http://www.nslu2-linux.org/ 11 + * 12 + * This program is free software; you can redistribute it and/or modify 13 + * it under the terms of the GNU General Public License version 2 as 14 + * published by the Free Software Foundation. 15 + * 16 + */ 17 + 18 + #include <linux/module.h> 19 + #include <linux/input.h> 20 + #include <linux/delay.h> 21 + #include <linux/platform_device.h> 22 + #include <asm/hardware.h> 23 + 24 + MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); 25 + MODULE_DESCRIPTION("ixp4xx beeper driver"); 26 + MODULE_LICENSE("GPL"); 27 + 28 + static DEFINE_SPINLOCK(beep_lock); 29 + 30 + static void ixp4xx_spkr_control(unsigned int pin, unsigned int count) 31 + { 32 + unsigned long flags; 33 + 34 + spin_lock_irqsave(&beep_lock, flags); 35 + 36 + if (count) { 37 + gpio_line_config(pin, IXP4XX_GPIO_OUT); 38 + gpio_line_set(pin, IXP4XX_GPIO_LOW); 39 + 40 + *IXP4XX_OSRT2 = (count & ~IXP4XX_OST_RELOAD_MASK) | IXP4XX_OST_ENABLE; 41 + } else { 42 + gpio_line_config(pin, IXP4XX_GPIO_IN); 43 + gpio_line_set(pin, IXP4XX_GPIO_HIGH); 44 + 45 + *IXP4XX_OSRT2 = 0; 46 + } 47 + 48 + spin_unlock_irqrestore(&beep_lock, flags); 49 + } 50 + 51 + static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) 52 + { 53 + unsigned int pin = (unsigned int) dev->private; 54 + unsigned int count = 0; 55 + 56 + if (type != EV_SND) 57 + return -1; 58 + 59 + switch (code) { 60 + case SND_BELL: 61 + if (value) 62 + value = 1000; 63 + case SND_TONE: 64 + break; 65 + default: 66 + return -1; 67 + } 68 + 69 + if (value > 20 && value < 32767) 70 + #ifndef FREQ 71 + count = (ixp4xx_get_board_tick_rate() / (value * 4)) - 1; 72 + #else 73 + count = (FREQ / (value * 4)) - 1; 74 + #endif 75 + 76 + ixp4xx_spkr_control(pin, count); 77 + 78 + return 0; 79 + } 80 + 81 + static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id, struct pt_regs *regs) 82 + { 83 + /* clear interrupt */ 84 + *IXP4XX_OSST = IXP4XX_OSST_TIMER_2_PEND; 85 + 86 + /* flip the beeper output */ 87 + *IXP4XX_GPIO_GPOUTR ^= (1 << (unsigned int) dev_id); 88 + 89 + return IRQ_HANDLED; 90 + } 91 + 92 + static int __devinit ixp4xx_spkr_probe(struct platform_device *dev) 93 + { 94 + struct input_dev *input_dev; 95 + int err; 96 + 97 + input_dev = input_allocate_device(); 98 + if (!input_dev) 99 + return -ENOMEM; 100 + 101 + input_dev->private = (void *) dev->id; 102 + input_dev->name = "ixp4xx beeper", 103 + input_dev->phys = "ixp4xx/gpio"; 104 + input_dev->id.bustype = BUS_HOST; 105 + input_dev->id.vendor = 0x001f; 106 + input_dev->id.product = 0x0001; 107 + input_dev->id.version = 0x0100; 108 + input_dev->cdev.dev = &dev->dev; 109 + 110 + input_dev->evbit[0] = BIT(EV_SND); 111 + input_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); 112 + input_dev->event = ixp4xx_spkr_event; 113 + 114 + err = request_irq(IRQ_IXP4XX_TIMER2, &ixp4xx_spkr_interrupt, 115 + SA_INTERRUPT | SA_TIMER, "ixp4xx-beeper", (void *) dev->id); 116 + if (err) 117 + goto err_free_device; 118 + 119 + err = input_register_device(input_dev); 120 + if (err) 121 + goto err_free_irq; 122 + 123 + platform_set_drvdata(dev, input_dev); 124 + 125 + return 0; 126 + 127 + err_free_irq: 128 + free_irq(IRQ_IXP4XX_TIMER2, dev); 129 + err_free_device: 130 + input_free_device(input_dev); 131 + 132 + return err; 133 + } 134 + 135 + static int __devexit ixp4xx_spkr_remove(struct platform_device *dev) 136 + { 137 + struct input_dev *input_dev = platform_get_drvdata(dev); 138 + unsigned int pin = (unsigned int) input_dev->private; 139 + 140 + input_unregister_device(input_dev); 141 + platform_set_drvdata(dev, NULL); 142 + 143 + /* turn the speaker off */ 144 + disable_irq(IRQ_IXP4XX_TIMER2); 145 + ixp4xx_spkr_control(pin, 0); 146 + 147 + free_irq(IRQ_IXP4XX_TIMER2, dev); 148 + 149 + return 0; 150 + } 151 + 152 + static void ixp4xx_spkr_shutdown(struct platform_device *dev) 153 + { 154 + struct input_dev *input_dev = platform_get_drvdata(dev); 155 + unsigned int pin = (unsigned int) input_dev->private; 156 + 157 + /* turn off the speaker */ 158 + disable_irq(IRQ_IXP4XX_TIMER2); 159 + ixp4xx_spkr_control(pin, 0); 160 + } 161 + 162 + static struct platform_driver ixp4xx_spkr_platform_driver = { 163 + .driver = { 164 + .name = "ixp4xx-beeper", 165 + .owner = THIS_MODULE, 166 + }, 167 + .probe = ixp4xx_spkr_probe, 168 + .remove = __devexit_p(ixp4xx_spkr_remove), 169 + .shutdown = ixp4xx_spkr_shutdown, 170 + }; 171 + 172 + static int __init ixp4xx_spkr_init(void) 173 + { 174 + return platform_driver_register(&ixp4xx_spkr_platform_driver); 175 + } 176 + 177 + static void __exit ixp4xx_spkr_exit(void) 178 + { 179 + platform_driver_unregister(&ixp4xx_spkr_platform_driver); 180 + } 181 + 182 + module_init(ixp4xx_spkr_init); 183 + module_exit(ixp4xx_spkr_exit);
+1
drivers/input/mouse/psmouse-base.c
··· 403 403 set_bit(REL_WHEEL, psmouse->dev->relbit); 404 404 405 405 psmouse->vendor = "Genius"; 406 + psmouse->name = "Mouse"; 406 407 psmouse->pktsize = 4; 407 408 } 408 409
+3 -6
drivers/input/mousedev.c
··· 356 356 kfree(mousedev); 357 357 } 358 358 359 - static int mixdev_release(void) 359 + static void mixdev_release(void) 360 360 { 361 361 struct input_handle *handle; 362 362 ··· 370 370 mousedev_free(mousedev); 371 371 } 372 372 } 373 - 374 - return 0; 375 373 } 376 374 377 375 static int mousedev_release(struct inode * inode, struct file * file) ··· 382 384 383 385 if (!--list->mousedev->open) { 384 386 if (list->mousedev->minor == MOUSEDEV_MIX) 385 - return mixdev_release(); 386 - 387 - if (!mousedev_mix.open) { 387 + mixdev_release(); 388 + else if (!mousedev_mix.open) { 388 389 if (list->mousedev->exist) 389 390 input_close_device(&list->mousedev->handle); 390 391 else
+1 -1
drivers/input/touchscreen/mk712.c
··· 154 154 spin_unlock_irqrestore(&mk712_lock, flags); 155 155 } 156 156 157 - int __init mk712_init(void) 157 + static int __init mk712_init(void) 158 158 { 159 159 int err; 160 160
+1 -1
drivers/usb/input/hiddev.c
··· 631 631 632 632 else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && 633 633 (uref_multi->num_values > HID_MAX_MULTI_USAGES || 634 - uref->usage_index + uref_multi->num_values >= field->report_count)) 634 + uref->usage_index + uref_multi->num_values > field->report_count)) 635 635 goto inval; 636 636 } 637 637