diff options
| author | Kevin Cernekee <cernekee@gmail.com> | 2013-02-14 01:19:01 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-02-14 12:17:52 -0500 |
| commit | 24ba9707829818daab711eed7e41313d5e56d0b4 (patch) | |
| tree | d0b765cca4a754b8f5c53f4dfddc91a092540d5a /drivers/input | |
| parent | 2e992cc030d8e4e42632bcc9e16605e629886778 (diff) | |
Input: ALPS - introduce helper function for repeated commands
Several ALPS driver init sequences repeat a command three times, then
issue PSMOUSE_CMD_GETINFO to read the result. Move this into a helper
function to simplify the code.
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 | 71 |
1 files changed, 30 insertions, 41 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index c473549c33bd..1ca854b0b012 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
| @@ -964,24 +964,42 @@ static int alps_command_mode_write_reg(struct psmouse *psmouse, int addr, | |||
| 964 | return __alps_command_mode_write_reg(psmouse, value); | 964 | return __alps_command_mode_write_reg(psmouse, value); |
| 965 | } | 965 | } |
| 966 | 966 | ||
| 967 | static int alps_rpt_cmd(struct psmouse *psmouse, int init_command, | ||
| 968 | int repeated_command, unsigned char *param) | ||
| 969 | { | ||
| 970 | struct ps2dev *ps2dev = &psmouse->ps2dev; | ||
| 971 | |||
| 972 | param[0] = 0; | ||
| 973 | if (init_command && ps2_command(ps2dev, param, init_command)) | ||
| 974 | return -EIO; | ||
| 975 | |||
| 976 | if (ps2_command(ps2dev, NULL, repeated_command) || | ||
| 977 | ps2_command(ps2dev, NULL, repeated_command) || | ||
| 978 | ps2_command(ps2dev, NULL, repeated_command)) | ||
| 979 | return -EIO; | ||
| 980 | |||
| 981 | param[0] = param[1] = param[2] = 0xff; | ||
| 982 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) | ||
| 983 | return -EIO; | ||
| 984 | |||
| 985 | psmouse_dbg(psmouse, "%2.2X report: %2.2x %2.2x %2.2x\n", | ||
| 986 | repeated_command, param[0], param[1], param[2]); | ||
| 987 | return 0; | ||
| 988 | } | ||
| 989 | |||
| 967 | static int alps_enter_command_mode(struct psmouse *psmouse, | 990 | static int alps_enter_command_mode(struct psmouse *psmouse, |
| 968 | unsigned char *resp) | 991 | unsigned char *resp) |
| 969 | { | 992 | { |
| 970 | unsigned char param[4]; | 993 | unsigned char param[4]; |
| 971 | struct ps2dev *ps2dev = &psmouse->ps2dev; | ||
| 972 | 994 | ||
| 973 | if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) || | 995 | if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_RESET_WRAP, param)) { |
| 974 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) || | ||
| 975 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) || | ||
| 976 | ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) { | ||
| 977 | psmouse_err(psmouse, "failed to enter command mode\n"); | 996 | psmouse_err(psmouse, "failed to enter command mode\n"); |
| 978 | return -1; | 997 | return -1; |
| 979 | } | 998 | } |
| 980 | 999 | ||
| 981 | if (param[0] != 0x88 && param[1] != 0x07) { | 1000 | if (param[0] != 0x88 && param[1] != 0x07) { |
| 982 | psmouse_dbg(psmouse, | 1001 | psmouse_dbg(psmouse, |
| 983 | "unknown response while entering command mode: %2.2x %2.2x %2.2x\n", | 1002 | "unknown response while entering command mode\n"); |
| 984 | param[0], param[1], param[2]); | ||
| 985 | return -1; | 1003 | return -1; |
| 986 | } | 1004 | } |
| 987 | 1005 | ||
| @@ -1041,18 +1059,10 @@ static int alps_absolute_mode_v1_v2(struct psmouse *psmouse) | |||
| 1041 | 1059 | ||
| 1042 | static int alps_get_status(struct psmouse *psmouse, char *param) | 1060 | static int alps_get_status(struct psmouse *psmouse, char *param) |
| 1043 | { | 1061 | { |
| 1044 | struct ps2dev *ps2dev = &psmouse->ps2dev; | ||
| 1045 | |||
| 1046 | /* Get status: 0xF5 0xF5 0xF5 0xE9 */ | 1062 | /* Get status: 0xF5 0xF5 0xF5 0xE9 */ |
| 1047 | if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || | 1063 | if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_DISABLE, param)) |
| 1048 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || | ||
| 1049 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || | ||
| 1050 | ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) | ||
| 1051 | return -1; | 1064 | return -1; |
| 1052 | 1065 | ||
| 1053 | psmouse_dbg(psmouse, "Status: %2.2x %2.2x %2.2x", | ||
| 1054 | param[0], param[1], param[2]); | ||
| 1055 | |||
| 1056 | return 0; | 1066 | return 0; |
| 1057 | } | 1067 | } |
| 1058 | 1068 | ||
| @@ -1443,7 +1453,6 @@ static int alps_hw_init(struct psmouse *psmouse) | |||
| 1443 | 1453 | ||
| 1444 | static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version) | 1454 | static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int *version) |
| 1445 | { | 1455 | { |
| 1446 | struct ps2dev *ps2dev = &psmouse->ps2dev; | ||
| 1447 | static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 }; | 1456 | static const unsigned char rates[] = { 0, 10, 20, 40, 60, 80, 100, 200 }; |
| 1448 | unsigned char param[4]; | 1457 | unsigned char param[4]; |
| 1449 | const struct alps_model_info *model = NULL; | 1458 | const struct alps_model_info *model = NULL; |
| @@ -1455,20 +1464,10 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
| 1455 | * The bits 0-2 of the first byte will be 1s if some buttons are | 1464 | * The bits 0-2 of the first byte will be 1s if some buttons are |
| 1456 | * pressed. | 1465 | * pressed. |
| 1457 | */ | 1466 | */ |
| 1458 | param[0] = 0; | 1467 | if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, PSMOUSE_CMD_SETSCALE11, |
| 1459 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) || | 1468 | param)) |
| 1460 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || | ||
| 1461 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || | ||
| 1462 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) | ||
| 1463 | return NULL; | ||
| 1464 | |||
| 1465 | param[0] = param[1] = param[2] = 0xff; | ||
| 1466 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) | ||
| 1467 | return NULL; | 1469 | return NULL; |
| 1468 | 1470 | ||
| 1469 | psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x", | ||
| 1470 | param[0], param[1], param[2]); | ||
| 1471 | |||
| 1472 | if ((param[0] & 0xf8) != 0 || param[1] != 0 || | 1471 | if ((param[0] & 0xf8) != 0 || param[1] != 0 || |
| 1473 | (param[2] != 10 && param[2] != 100)) | 1472 | (param[2] != 10 && param[2] != 100)) |
| 1474 | return NULL; | 1473 | return NULL; |
| @@ -1477,20 +1476,10 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
| 1477 | * Now try "E7 report". Allowed responses are in | 1476 | * Now try "E7 report". Allowed responses are in |
| 1478 | * alps_model_data[].signature | 1477 | * alps_model_data[].signature |
| 1479 | */ | 1478 | */ |
| 1480 | param[0] = 0; | 1479 | if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, PSMOUSE_CMD_SETSCALE21, |
| 1481 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) || | 1480 | param)) |
| 1482 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || | ||
| 1483 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || | ||
| 1484 | ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21)) | ||
| 1485 | return NULL; | ||
| 1486 | |||
| 1487 | param[0] = param[1] = param[2] = 0xff; | ||
| 1488 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) | ||
| 1489 | return NULL; | 1481 | return NULL; |
| 1490 | 1482 | ||
| 1491 | psmouse_dbg(psmouse, "E7 report: %2.2x %2.2x %2.2x", | ||
| 1492 | param[0], param[1], param[2]); | ||
| 1493 | |||
| 1494 | if (version) { | 1483 | if (version) { |
| 1495 | for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++) | 1484 | for (i = 0; i < ARRAY_SIZE(rates) && param[2] != rates[i]; i++) |
| 1496 | /* empty */; | 1485 | /* empty */; |
