diff options
Diffstat (limited to 'drivers/input/mouse/alps.c')
-rw-r--r-- | drivers/input/mouse/alps.c | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index b20783f9748a..4acc7fd4cd0f 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -79,8 +79,8 @@ static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs) | |||
79 | { | 79 | { |
80 | struct alps_data *priv = psmouse->private; | 80 | struct alps_data *priv = psmouse->private; |
81 | unsigned char *packet = psmouse->packet; | 81 | unsigned char *packet = psmouse->packet; |
82 | struct input_dev *dev = &psmouse->dev; | 82 | struct input_dev *dev = psmouse->dev; |
83 | struct input_dev *dev2 = &priv->dev2; | 83 | struct input_dev *dev2 = priv->dev2; |
84 | int x, y, z, ges, fin, left, right, middle; | 84 | int x, y, z, ges, fin, left, right, middle; |
85 | int back = 0, forward = 0; | 85 | int back = 0, forward = 0; |
86 | 86 | ||
@@ -379,20 +379,24 @@ static int alps_reconnect(struct psmouse *psmouse) | |||
379 | static void alps_disconnect(struct psmouse *psmouse) | 379 | static void alps_disconnect(struct psmouse *psmouse) |
380 | { | 380 | { |
381 | struct alps_data *priv = psmouse->private; | 381 | struct alps_data *priv = psmouse->private; |
382 | |||
382 | psmouse_reset(psmouse); | 383 | psmouse_reset(psmouse); |
383 | input_unregister_device(&priv->dev2); | 384 | input_unregister_device(priv->dev2); |
384 | kfree(priv); | 385 | kfree(priv); |
385 | } | 386 | } |
386 | 387 | ||
387 | int alps_init(struct psmouse *psmouse) | 388 | int alps_init(struct psmouse *psmouse) |
388 | { | 389 | { |
389 | struct alps_data *priv; | 390 | struct alps_data *priv; |
391 | struct input_dev *dev1 = psmouse->dev, *dev2; | ||
390 | int version; | 392 | int version; |
391 | 393 | ||
392 | psmouse->private = priv = kmalloc(sizeof(struct alps_data), GFP_KERNEL); | 394 | psmouse->private = priv = kzalloc(sizeof(struct alps_data), GFP_KERNEL); |
393 | if (!priv) | 395 | dev2 = input_allocate_device(); |
396 | if (!priv || !dev2) | ||
394 | goto init_fail; | 397 | goto init_fail; |
395 | memset(priv, 0, sizeof(struct alps_data)); | 398 | |
399 | priv->dev2 = dev2; | ||
396 | 400 | ||
397 | if (!(priv->i = alps_get_model(psmouse, &version))) | 401 | if (!(priv->i = alps_get_model(psmouse, &version))) |
398 | goto init_fail; | 402 | goto init_fail; |
@@ -411,41 +415,39 @@ int alps_init(struct psmouse *psmouse) | |||
411 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) | 415 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) |
412 | goto init_fail; | 416 | goto init_fail; |
413 | 417 | ||
414 | psmouse->dev.evbit[LONG(EV_KEY)] |= BIT(EV_KEY); | 418 | dev1->evbit[LONG(EV_KEY)] |= BIT(EV_KEY); |
415 | psmouse->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH); | 419 | dev1->keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH); |
416 | psmouse->dev.keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER); | 420 | dev1->keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER); |
417 | psmouse->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | 421 | dev1->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); |
418 | 422 | ||
419 | psmouse->dev.evbit[LONG(EV_ABS)] |= BIT(EV_ABS); | 423 | dev1->evbit[LONG(EV_ABS)] |= BIT(EV_ABS); |
420 | input_set_abs_params(&psmouse->dev, ABS_X, 0, 1023, 0, 0); | 424 | input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0); |
421 | input_set_abs_params(&psmouse->dev, ABS_Y, 0, 767, 0, 0); | 425 | input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0); |
422 | input_set_abs_params(&psmouse->dev, ABS_PRESSURE, 0, 127, 0, 0); | 426 | input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); |
423 | 427 | ||
424 | if (priv->i->flags & ALPS_WHEEL) { | 428 | if (priv->i->flags & ALPS_WHEEL) { |
425 | psmouse->dev.evbit[LONG(EV_REL)] |= BIT(EV_REL); | 429 | dev1->evbit[LONG(EV_REL)] |= BIT(EV_REL); |
426 | psmouse->dev.relbit[LONG(REL_WHEEL)] |= BIT(REL_WHEEL); | 430 | dev1->relbit[LONG(REL_WHEEL)] |= BIT(REL_WHEEL); |
427 | } | 431 | } |
428 | 432 | ||
429 | if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { | 433 | if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { |
430 | psmouse->dev.keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD); | 434 | dev1->keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD); |
431 | psmouse->dev.keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK); | 435 | dev1->keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK); |
432 | } | 436 | } |
433 | 437 | ||
434 | sprintf(priv->phys, "%s/input1", psmouse->ps2dev.serio->phys); | 438 | sprintf(priv->phys, "%s/input1", psmouse->ps2dev.serio->phys); |
435 | priv->dev2.phys = priv->phys; | 439 | dev2->phys = priv->phys; |
436 | priv->dev2.name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse"; | 440 | dev2->name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse"; |
437 | priv->dev2.id.bustype = BUS_I8042; | 441 | dev2->id.bustype = BUS_I8042; |
438 | priv->dev2.id.vendor = 0x0002; | 442 | dev2->id.vendor = 0x0002; |
439 | priv->dev2.id.product = PSMOUSE_ALPS; | 443 | dev2->id.product = PSMOUSE_ALPS; |
440 | priv->dev2.id.version = 0x0000; | 444 | dev2->id.version = 0x0000; |
441 | |||
442 | priv->dev2.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
443 | priv->dev2.relbit[LONG(REL_X)] |= BIT(REL_X) | BIT(REL_Y); | ||
444 | priv->dev2.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
445 | 445 | ||
446 | input_register_device(&priv->dev2); | 446 | dev2->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
447 | dev2->relbit[LONG(REL_X)] |= BIT(REL_X) | BIT(REL_Y); | ||
448 | dev2->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
447 | 449 | ||
448 | printk(KERN_INFO "input: %s on %s\n", priv->dev2.name, psmouse->ps2dev.serio->phys); | 450 | input_register_device(priv->dev2); |
449 | 451 | ||
450 | psmouse->protocol_handler = alps_process_byte; | 452 | psmouse->protocol_handler = alps_process_byte; |
451 | psmouse->disconnect = alps_disconnect; | 453 | psmouse->disconnect = alps_disconnect; |
@@ -455,6 +457,7 @@ int alps_init(struct psmouse *psmouse) | |||
455 | return 0; | 457 | return 0; |
456 | 458 | ||
457 | init_fail: | 459 | init_fail: |
460 | input_free_device(dev2); | ||
458 | kfree(priv); | 461 | kfree(priv); |
459 | return -1; | 462 | return -1; |
460 | } | 463 | } |