aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorKevin Cernekee <cernekee@gmail.com>2013-02-14 01:22:08 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2013-02-14 12:18:01 -0500
commit24af5cb95f1b93c6c72a73113494ace4bcbee5a2 (patch)
tree4fbce336278f640e92f98b58ddb216bad0161cfe /drivers/input
parentb5d6b851eab7f346ea5e69f46247b363b32b3670 (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.c101
-rw-r--r--drivers/input/mouse/alps.h7
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
117static void alps_set_abs_params_st(struct alps_data *priv,
118 struct input_dev *dev1);
119static 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
698static 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
716static void alps_report_bare_ps2_packet(struct psmouse *psmouse, 703static 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)
814static void alps_flush_packet(unsigned long data) 801static 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
1433static int alps_hw_init(struct psmouse *psmouse) 1421static 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
1454static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv, 1443static 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
1529static void alps_disconnect(struct psmouse *psmouse) 1520static 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
1530static 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
1537static 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
1539int alps_init(struct psmouse *psmouse) 1553int 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];