diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-03-11 10:49:37 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-03-11 10:49:37 -0400 |
| commit | 152fcb2784c9305e19e7caee2932b9e32b0a1d41 (patch) | |
| tree | a8fceed3656ea2e7ef6a3c2f5afb450cf7620bdd /drivers/input | |
| parent | f6161aa153581da4a3867a2d1a7caf4be19b6ec9 (diff) | |
| parent | 4b7d293c64fde133cc2b669d0d7637b8a4c6d62f (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input updates from Dmitry Torokhov:
"Except for the largish change to the ALPS driver adding "Dolphin V1"
support and Wacom getting a new signature of yet another device, the
rest are straightforward driver fixes."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
Input: mms114 - Fix regulator enable and disable paths
Input: ads7864 - check return value of regulator enable
Input: tc3589x-keypad - fix keymap size
Input: wacom - add support for 0x10d
Input: ALPS - update documentation for recent touchpad driver mods
Input: ALPS - add "Dolphin V1" touchpad support
Input: ALPS - remove unused argument to alps_enter_command_mode()
Input: cypress_ps2 - fix trackpadi found in Dell XPS12
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/keyboard/tc3589x-keypad.c | 8 | ||||
| -rw-r--r-- | drivers/input/mouse/alps.c | 85 | ||||
| -rw-r--r-- | drivers/input/mouse/alps.h | 1 | ||||
| -rw-r--r-- | drivers/input/mouse/cypress_ps2.c | 19 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.c | 4 | ||||
| -rw-r--r-- | drivers/input/touchscreen/ads7846.c | 7 | ||||
| -rw-r--r-- | drivers/input/touchscreen/mms114.c | 34 |
7 files changed, 125 insertions, 33 deletions
diff --git a/drivers/input/keyboard/tc3589x-keypad.c b/drivers/input/keyboard/tc3589x-keypad.c index 2fb0d76a04c4..208de7cbb7fa 100644 --- a/drivers/input/keyboard/tc3589x-keypad.c +++ b/drivers/input/keyboard/tc3589x-keypad.c | |||
| @@ -70,8 +70,6 @@ | |||
| 70 | #define TC3589x_EVT_INT_CLR 0x2 | 70 | #define TC3589x_EVT_INT_CLR 0x2 |
| 71 | #define TC3589x_KBD_INT_CLR 0x1 | 71 | #define TC3589x_KBD_INT_CLR 0x1 |
| 72 | 72 | ||
| 73 | #define TC3589x_KBD_KEYMAP_SIZE 64 | ||
| 74 | |||
| 75 | /** | 73 | /** |
| 76 | * struct tc_keypad - data structure used by keypad driver | 74 | * struct tc_keypad - data structure used by keypad driver |
| 77 | * @tc3589x: pointer to tc35893 | 75 | * @tc3589x: pointer to tc35893 |
| @@ -88,7 +86,7 @@ struct tc_keypad { | |||
| 88 | const struct tc3589x_keypad_platform_data *board; | 86 | const struct tc3589x_keypad_platform_data *board; |
| 89 | unsigned int krow; | 87 | unsigned int krow; |
| 90 | unsigned int kcol; | 88 | unsigned int kcol; |
| 91 | unsigned short keymap[TC3589x_KBD_KEYMAP_SIZE]; | 89 | unsigned short *keymap; |
| 92 | bool keypad_stopped; | 90 | bool keypad_stopped; |
| 93 | }; | 91 | }; |
| 94 | 92 | ||
| @@ -338,12 +336,14 @@ static int tc3589x_keypad_probe(struct platform_device *pdev) | |||
| 338 | 336 | ||
| 339 | error = matrix_keypad_build_keymap(plat->keymap_data, NULL, | 337 | error = matrix_keypad_build_keymap(plat->keymap_data, NULL, |
| 340 | TC3589x_MAX_KPROW, TC3589x_MAX_KPCOL, | 338 | TC3589x_MAX_KPROW, TC3589x_MAX_KPCOL, |
| 341 | keypad->keymap, input); | 339 | NULL, input); |
| 342 | if (error) { | 340 | if (error) { |
| 343 | dev_err(&pdev->dev, "Failed to build keymap\n"); | 341 | dev_err(&pdev->dev, "Failed to build keymap\n"); |
| 344 | goto err_free_mem; | 342 | goto err_free_mem; |
| 345 | } | 343 | } |
| 346 | 344 | ||
| 345 | keypad->keymap = input->keycode; | ||
| 346 | |||
| 347 | input_set_capability(input, EV_MSC, MSC_SCAN); | 347 | input_set_capability(input, EV_MSC, MSC_SCAN); |
| 348 | if (!plat->no_autorepeat) | 348 | if (!plat->no_autorepeat) |
| 349 | __set_bit(EV_REP, input->evbit); | 349 | __set_bit(EV_REP, input->evbit); |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 7b99fc7c9438..0238e0e14335 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
| @@ -490,6 +490,29 @@ static void alps_decode_rushmore(struct alps_fields *f, unsigned char *p) | |||
| 490 | f->y_map |= (p[5] & 0x20) << 6; | 490 | f->y_map |= (p[5] & 0x20) << 6; |
| 491 | } | 491 | } |
| 492 | 492 | ||
| 493 | static void alps_decode_dolphin(struct alps_fields *f, unsigned char *p) | ||
| 494 | { | ||
| 495 | f->first_mp = !!(p[0] & 0x02); | ||
| 496 | f->is_mp = !!(p[0] & 0x20); | ||
| 497 | |||
| 498 | f->fingers = ((p[0] & 0x6) >> 1 | | ||
| 499 | (p[0] & 0x10) >> 2); | ||
| 500 | f->x_map = ((p[2] & 0x60) >> 5) | | ||
| 501 | ((p[4] & 0x7f) << 2) | | ||
| 502 | ((p[5] & 0x7f) << 9) | | ||
| 503 | ((p[3] & 0x07) << 16) | | ||
| 504 | ((p[3] & 0x70) << 15) | | ||
| 505 | ((p[0] & 0x01) << 22); | ||
| 506 | f->y_map = (p[1] & 0x7f) | | ||
| 507 | ((p[2] & 0x1f) << 7); | ||
| 508 | |||
| 509 | f->x = ((p[1] & 0x7f) | ((p[4] & 0x0f) << 7)); | ||
| 510 | f->y = ((p[2] & 0x7f) | ((p[4] & 0xf0) << 3)); | ||
| 511 | f->z = (p[0] & 4) ? 0 : p[5] & 0x7f; | ||
| 512 | |||
| 513 | alps_decode_buttons_v3(f, p); | ||
| 514 | } | ||
| 515 | |||
| 493 | static void alps_process_touchpad_packet_v3(struct psmouse *psmouse) | 516 | static void alps_process_touchpad_packet_v3(struct psmouse *psmouse) |
| 494 | { | 517 | { |
| 495 | struct alps_data *priv = psmouse->private; | 518 | struct alps_data *priv = psmouse->private; |
| @@ -874,7 +897,8 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) | |||
| 874 | } | 897 | } |
| 875 | 898 | ||
| 876 | /* Bytes 2 - pktsize should have 0 in the highest bit */ | 899 | /* Bytes 2 - pktsize should have 0 in the highest bit */ |
| 877 | if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && | 900 | if (priv->proto_version != ALPS_PROTO_V5 && |
| 901 | psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && | ||
| 878 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { | 902 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { |
| 879 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", | 903 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", |
| 880 | psmouse->pktcnt - 1, | 904 | psmouse->pktcnt - 1, |
| @@ -994,8 +1018,7 @@ static int alps_rpt_cmd(struct psmouse *psmouse, int init_command, | |||
| 994 | return 0; | 1018 | return 0; |
| 995 | } | 1019 | } |
| 996 | 1020 | ||
| 997 | static int alps_enter_command_mode(struct psmouse *psmouse, | 1021 | static int alps_enter_command_mode(struct psmouse *psmouse) |
| 998 | unsigned char *resp) | ||
| 999 | { | 1022 | { |
| 1000 | unsigned char param[4]; | 1023 | unsigned char param[4]; |
| 1001 | 1024 | ||
| @@ -1004,14 +1027,12 @@ static int alps_enter_command_mode(struct psmouse *psmouse, | |||
| 1004 | return -1; | 1027 | return -1; |
| 1005 | } | 1028 | } |
| 1006 | 1029 | ||
| 1007 | if (param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) { | 1030 | if ((param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) && |
| 1031 | param[0] != 0x73) { | ||
| 1008 | psmouse_dbg(psmouse, | 1032 | psmouse_dbg(psmouse, |
| 1009 | "unknown response while entering command mode\n"); | 1033 | "unknown response while entering command mode\n"); |
| 1010 | return -1; | 1034 | return -1; |
| 1011 | } | 1035 | } |
| 1012 | |||
| 1013 | if (resp) | ||
| 1014 | *resp = param[2]; | ||
| 1015 | return 0; | 1036 | return 0; |
| 1016 | } | 1037 | } |
| 1017 | 1038 | ||
| @@ -1176,7 +1197,7 @@ static int alps_passthrough_mode_v3(struct psmouse *psmouse, | |||
| 1176 | { | 1197 | { |
| 1177 | int reg_val, ret = -1; | 1198 | int reg_val, ret = -1; |
| 1178 | 1199 | ||
| 1179 | if (alps_enter_command_mode(psmouse, NULL)) | 1200 | if (alps_enter_command_mode(psmouse)) |
| 1180 | return -1; | 1201 | return -1; |
| 1181 | 1202 | ||
| 1182 | reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x0008); | 1203 | reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x0008); |
| @@ -1216,7 +1237,7 @@ static int alps_probe_trackstick_v3(struct psmouse *psmouse, int reg_base) | |||
| 1216 | { | 1237 | { |
| 1217 | int ret = -EIO, reg_val; | 1238 | int ret = -EIO, reg_val; |
| 1218 | 1239 | ||
| 1219 | if (alps_enter_command_mode(psmouse, NULL)) | 1240 | if (alps_enter_command_mode(psmouse)) |
| 1220 | goto error; | 1241 | goto error; |
| 1221 | 1242 | ||
| 1222 | reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x08); | 1243 | reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x08); |
| @@ -1279,7 +1300,7 @@ static int alps_setup_trackstick_v3(struct psmouse *psmouse, int reg_base) | |||
| 1279 | * supported by this driver. If bit 1 isn't set the packet | 1300 | * supported by this driver. If bit 1 isn't set the packet |
| 1280 | * format is different. | 1301 | * format is different. |
| 1281 | */ | 1302 | */ |
| 1282 | if (alps_enter_command_mode(psmouse, NULL) || | 1303 | if (alps_enter_command_mode(psmouse) || |
| 1283 | alps_command_mode_write_reg(psmouse, | 1304 | alps_command_mode_write_reg(psmouse, |
| 1284 | reg_base + 0x08, 0x82) || | 1305 | reg_base + 0x08, 0x82) || |
| 1285 | alps_exit_command_mode(psmouse)) | 1306 | alps_exit_command_mode(psmouse)) |
| @@ -1306,7 +1327,7 @@ static int alps_hw_init_v3(struct psmouse *psmouse) | |||
| 1306 | alps_setup_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE) == -EIO) | 1327 | alps_setup_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE) == -EIO) |
| 1307 | goto error; | 1328 | goto error; |
| 1308 | 1329 | ||
| 1309 | if (alps_enter_command_mode(psmouse, NULL) || | 1330 | if (alps_enter_command_mode(psmouse) || |
| 1310 | alps_absolute_mode_v3(psmouse)) { | 1331 | alps_absolute_mode_v3(psmouse)) { |
| 1311 | psmouse_err(psmouse, "Failed to enter absolute mode\n"); | 1332 | psmouse_err(psmouse, "Failed to enter absolute mode\n"); |
| 1312 | goto error; | 1333 | goto error; |
| @@ -1381,7 +1402,7 @@ static int alps_hw_init_rushmore_v3(struct psmouse *psmouse) | |||
| 1381 | priv->flags &= ~ALPS_DUALPOINT; | 1402 | priv->flags &= ~ALPS_DUALPOINT; |
| 1382 | } | ||
