diff options
author | Kevin Cernekee <cernekee@gmail.com> | 2013-02-14 01:22:08 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-02-14 12:18:01 -0500 |
commit | 24af5cb95f1b93c6c72a73113494ace4bcbee5a2 (patch) | |
tree | 4fbce336278f640e92f98b58ddb216bad0161cfe /drivers/input | |
parent | b5d6b851eab7f346ea5e69f46247b363b32b3670 (diff) |
Input: ALPS - use function pointers for different protocol handlers
In anticipation of adding more ALPS protocols and more per-device quirks,
use function pointers instead of switch statements to call functions that
differ from one device to the next.
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
Tested-by: Dave Turvene <dturvene@dahetral.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/mouse/alps.c | 101 | ||||
-rw-r--r-- | drivers/input/mouse/alps.h | 7 |
2 files changed, 54 insertions, 54 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index e6a27a5cbb1d..fe45687cf65a 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -114,6 +114,11 @@ static const struct alps_model_info alps_model_data[] = { | |||
114 | { { 0x73, 0x02, 0x64 }, 0x8a, ALPS_PROTO_V4, 0x8f, 0x8f, 0 }, | 114 | { { 0x73, 0x02, 0x64 }, 0x8a, ALPS_PROTO_V4, 0x8f, 0x8f, 0 }, |
115 | }; | 115 | }; |
116 | 116 | ||
117 | static void alps_set_abs_params_st(struct alps_data *priv, | ||
118 | struct input_dev *dev1); | ||
119 | static void alps_set_abs_params_mt(struct alps_data *priv, | ||
120 | struct input_dev *dev1); | ||
121 | |||
117 | /* | 122 | /* |
118 | * XXX - this entry is suspicious. First byte has zero lower nibble, | 123 | * XXX - this entry is suspicious. First byte has zero lower nibble, |
119 | * which is what a normal mouse would report. Also, the value 0x0e | 124 | * which is what a normal mouse would report. Also, the value 0x0e |
@@ -695,24 +700,6 @@ static void alps_process_packet_v4(struct psmouse *psmouse) | |||
695 | input_sync(dev); | 700 | input_sync(dev); |
696 | } | 701 | } |
697 | 702 | ||
698 | static void alps_process_packet(struct psmouse *psmouse) | ||
699 | { | ||
700 | struct alps_data *priv = psmouse->private; | ||
701 | |||
702 | switch (priv->proto_version) { | ||
703 | case ALPS_PROTO_V1: | ||
704 | case ALPS_PROTO_V2: | ||
705 | alps_process_packet_v1_v2(psmouse); | ||
706 | break; | ||
707 | case ALPS_PROTO_V3: | ||
708 | alps_process_packet_v3(psmouse); | ||
709 | break; | ||
710 | case ALPS_PROTO_V4: | ||
711 | alps_process_packet_v4(psmouse); | ||
712 | break; | ||
713 | } | ||
714 | } | ||
715 | |||
716 | static void alps_report_bare_ps2_packet(struct psmouse *psmouse, | 703 | static void alps_report_bare_ps2_packet(struct psmouse *psmouse, |
717 | unsigned char packet[], | 704 | unsigned char packet[], |
718 | bool report_buttons) | 705 | bool report_buttons) |
@@ -770,7 +757,7 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse) | |||
770 | return PSMOUSE_BAD_DATA; | 757 | return PSMOUSE_BAD_DATA; |
771 | } | 758 | } |
772 | 759 | ||
773 | alps_process_packet(psmouse); | 760 | priv->process_packet(psmouse); |
774 | 761 | ||
775 | /* Continue with the next packet */ | 762 | /* Continue with the next packet */ |
776 | psmouse->packet[0] = psmouse->packet[6]; | 763 | psmouse->packet[0] = psmouse->packet[6]; |
@@ -814,6 +801,7 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse) | |||
814 | static void alps_flush_packet(unsigned long data) | 801 | static void alps_flush_packet(unsigned long data) |
815 | { | 802 | { |
816 | struct psmouse *psmouse = (struct psmouse *)data; | 803 | struct psmouse *psmouse = (struct psmouse *)data; |
804 | struct alps_data *priv = psmouse->private; | ||
817 | 805 | ||
818 | serio_pause_rx(psmouse->ps2dev.serio); | 806 | serio_pause_rx(psmouse->ps2dev.serio); |
819 | 807 | ||
@@ -831,7 +819,7 @@ static void alps_flush_packet(unsigned long data) | |||
831 | "refusing packet %3ph (suspected interleaved ps/2)\n", | 819 | "refusing packet %3ph (suspected interleaved ps/2)\n", |
832 | psmouse->packet + 3); | 820 | psmouse->packet + 3); |
833 | } else { | 821 | } else { |
834 | alps_process_packet(psmouse); | 822 | priv->process_packet(psmouse); |
835 | } | 823 | } |
836 | psmouse->pktcnt = 0; | 824 | psmouse->pktcnt = 0; |
837 | } | 825 | } |
@@ -876,7 +864,7 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) | |||
876 | } | 864 | } |
877 | 865 | ||
878 | if (psmouse->pktcnt == psmouse->pktsize) { | 866 | if (psmouse->pktcnt == psmouse->pktsize) { |
879 | alps_process_packet(psmouse); | 867 | priv->process_packet(psmouse); |
880 | return PSMOUSE_FULL_PACKET; | 868 | return PSMOUSE_FULL_PACKET; |
881 | } | 869 | } |
882 | 870 | ||
@@ -1430,25 +1418,26 @@ error: | |||
1430 | return -1; | 1418 | return -1; |
1431 | } | 1419 | } |
1432 | 1420 | ||
1433 | static int alps_hw_init(struct psmouse *psmouse) | 1421 | static void alps_set_defaults(struct alps_data *priv) |
1434 | { | 1422 | { |
1435 | struct alps_data *priv = psmouse->private; | ||
1436 | int ret = -1; | ||
1437 | |||
1438 | switch (priv->proto_version) { | 1423 | switch (priv->proto_version) { |
1439 | case ALPS_PROTO_V1: | 1424 | case ALPS_PROTO_V1: |
1440 | case ALPS_PROTO_V2: | 1425 | case ALPS_PROTO_V2: |
1441 | ret = alps_hw_init_v1_v2(psmouse); | 1426 | priv->hw_init = alps_hw_init_v1_v2; |
1427 | priv->process_packet = alps_process_packet_v1_v2; | ||
1428 | priv->set_abs_params = alps_set_abs_params_st; | ||
1442 | break; | 1429 | break; |
1443 | case ALPS_PROTO_V3: | 1430 | case ALPS_PROTO_V3: |
1444 | ret = alps_hw_init_v3(psmouse); | 1431 | priv->hw_init = alps_hw_init_v3; |
1432 | priv->process_packet = alps_process_packet_v3; | ||
1433 | priv->set_abs_params = alps_set_abs_params_mt; | ||
1445 | break; | 1434 | break; |
1446 | case ALPS_PROTO_V4: | 1435 | case ALPS_PROTO_V4: |
1447 | ret = alps_hw_init_v4(psmouse); | 1436 | priv->hw_init = alps_hw_init_v4; |
1437 | priv->process_packet = alps_process_packet_v4; | ||
1438 | priv->set_abs_params = alps_set_abs_params_mt; | ||
1448 | break; | 1439 | break; |
1449 | } | 1440 | } |
1450 | |||
1451 | return ret; | ||
1452 | } | 1441 | } |
1453 | 1442 | ||
1454 | static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv, | 1443 | static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv, |
@@ -1465,6 +1454,8 @@ static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv, | |||
1465 | model->command_mode_resp == ec[2])) { | 1454 | model->command_mode_resp == ec[2])) { |
1466 | 1455 | ||
1467 | priv->proto_version = model->proto_version; | 1456 | priv->proto_version = model->proto_version; |
1457 | alps_set_defaults(priv); | ||
1458 | |||
1468 | priv->flags = model->flags; | 1459 | priv->flags = model->flags; |
1469 | priv->byte0 = model->byte0; | 1460 | priv->byte0 = model->byte0; |
1470 | priv->mask0 = model->mask0; | 1461 | priv->mask0 = model->mask0; |
@@ -1523,7 +1514,7 @@ static int alps_reconnect(struct psmouse *psmouse) | |||
1523 | if (alps_identify(psmouse, priv) < 0) | 1514 | if (alps_identify(psmouse, priv) < 0) |
1524 | return -1; | 1515 | return -1; |
1525 | 1516 | ||
1526 | return alps_hw_init(psmouse); | 1517 | return priv->hw_init(psmouse); |
1527 | } | 1518 | } |
1528 | 1519 | ||
1529 | static void alps_disconnect(struct psmouse *psmouse) | 1520 | static void alps_disconnect(struct psmouse *psmouse) |
@@ -1536,6 +1527,29 @@ static void alps_disconnect(struct psmouse *psmouse) | |||
1536 | kfree(priv); | 1527 | kfree(priv); |
1537 | } | 1528 | } |
1538 | 1529 | ||
1530 | static void alps_set_abs_params_st(struct alps_data *priv, | ||
1531 | struct input_dev *dev1) | ||
1532 | { | ||
1533 | input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0); | ||
1534 | input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0); | ||
1535 | } | ||
1536 | |||
1537 | static void alps_set_abs_params_mt(struct alps_data *priv, | ||
1538 | struct input_dev *dev1) | ||
1539 | { | ||
1540 | set_bit(INPUT_PROP_SEMI_MT, dev1->propbit); | ||
1541 | input_mt_init_slots(dev1, 2, 0); | ||
1542 | input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, ALPS_V3_X_MAX, 0, 0); | ||
1543 | input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, ALPS_V3_Y_MAX, 0, 0); | ||
1544 | |||
1545 | set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); | ||
1546 | set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); | ||
1547 | set_bit(BTN_TOOL_QUADTAP, dev1->keybit); | ||
1548 | |||
1549 | input_set_abs_params(dev1, ABS_X, 0, ALPS_V3_X_MAX, 0, 0); | ||
1550 | input_set_abs_params(dev1, ABS_Y, 0, ALPS_V3_Y_MAX, 0, 0); | ||
1551 | } | ||
1552 | |||
1539 | int alps_init(struct psmouse *psmouse) | 1553 | int alps_init(struct psmouse *psmouse) |
1540 | { | 1554 | { |
1541 | struct alps_data *priv; | 1555 | struct alps_data *priv; |
@@ -1556,7 +1570,7 @@ int alps_init(struct psmouse *psmouse) | |||
1556 | if (alps_identify(psmouse, priv) < 0) | 1570 | if (alps_identify(psmouse, priv) < 0) |
1557 | goto init_fail; | 1571 | goto init_fail; |
1558 | 1572 | ||
1559 | if (alps_hw_init(psmouse)) | 1573 | if (priv->hw_init(psmouse)) |
1560 | goto init_fail; | 1574 | goto init_fail; |
1561 | 1575 | ||
1562 | /* | 1576 | /* |
@@ -1578,28 +1592,7 @@ int alps_init(struct psmouse *psmouse) | |||
1578 | 1592 | ||
1579 | dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS); | 1593 | dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS); |
1580 | 1594 | ||
1581 | switch (priv->proto_version) { | 1595 | priv->set_abs_params(priv, dev1); |
1582 | case ALPS_PROTO_V1: | ||
1583 | case ALPS_PROTO_V2: | ||
1584 | input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0); | ||
1585 | input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0); | ||
1586 | break; | ||
1587 | case ALPS_PROTO_V3: | ||
1588 | case ALPS_PROTO_V4: | ||
1589 | set_bit(INPUT_PROP_SEMI_MT, dev1->propbit); | ||
1590 | input_mt_init_slots(dev1, 2, 0); | ||
1591 | input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, ALPS_V3_X_MAX, 0, 0); | ||
1592 | input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, ALPS_V3_Y_MAX, 0, 0); | ||
1593 | |||
1594 | set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); | ||
1595 | set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); | ||
1596 | set_bit(BTN_TOOL_QUADTAP, dev1->keybit); | ||
1597 | |||
1598 | input_set_abs_params(dev1, ABS_X, 0, ALPS_V3_X_MAX, 0, 0); | ||
1599 | input_set_abs_params(dev1, ABS_Y, 0, ALPS_V3_Y_MAX, 0, 0); | ||
1600 | break; | ||
1601 | } | ||
1602 | |||
1603 | input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); | 1596 | input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); |
1604 | 1597 | ||
1605 | if (priv->flags & ALPS_WHEEL) { | 1598 | if (priv->flags & ALPS_WHEEL) { |
diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h index a81b31830454..0934f8bf7d76 100644 --- a/drivers/input/mouse/alps.h +++ b/drivers/input/mouse/alps.h | |||
@@ -72,6 +72,9 @@ struct alps_nibble_commands { | |||
72 | * mask0, should match byte0. | 72 | * mask0, should match byte0. |
73 | * @mask0: The mask used to check the first byte of the report. | 73 | * @mask0: The mask used to check the first byte of the report. |
74 | * @flags: Additional device capabilities (passthrough port, trackstick, etc.). | 74 | * @flags: Additional device capabilities (passthrough port, trackstick, etc.). |
75 | * @hw_init: Protocol-specific hardware init function. | ||
76 | * @process_packet: Protocol-specific function to process a report packet. | ||
77 | * @set_abs_params: Protocol-specific function to configure the input_dev. | ||
75 | * @prev_fin: Finger bit from previous packet. | 78 | * @prev_fin: Finger bit from previous packet. |
76 | * @multi_packet: Multi-packet data in progress. | 79 | * @multi_packet: Multi-packet data in progress. |
77 | * @multi_data: Saved multi-packet data. | 80 | * @multi_data: Saved multi-packet data. |
@@ -94,6 +97,10 @@ struct alps_data { | |||
94 | unsigned char byte0, mask0; | 97 | unsigned char byte0, mask0; |
95 | unsigned char flags; | 98 | unsigned char flags; |
96 | 99 | ||
100 | int (*hw_init)(struct psmouse *psmouse); | ||
101 | void (*process_packet)(struct psmouse *psmouse); | ||
102 | void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1); | ||
103 | |||
97 | int prev_fin; | 104 | int prev_fin; |
98 | int multi_packet; | 105 | int multi_packet; |
99 | unsigned char multi_data[6]; | 106 | unsigned char multi_data[6]; |