Lines Matching +full:multi +full:- +full:ported

1 // SPDX-License-Identifier: GPL-2.0-only
6 * Added support for pass-through port. Special thanks to Peter Berg Larsen
10 * Ported to 2.5 input device infrastructure.
13 * start merging tpconfig and gpm code to a xfree-input module
17 * Copyright (c) 1998-2000 Bruce Kalk <[email protected]>
18 * code for the special synaptics commands (from the tpconfig-source)
61 * value which are actually negative values truncated to the 13-bit
63 * than 8184 (i.e. -8), so we treat all values greater than 8176 as
84 error = ps2_sliced_command(&psmouse->ps2dev, mode); in synaptics_mode_cmd()
89 error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE); in synaptics_mode_cmd()
98 struct ps2dev *ps2dev = &psmouse->ps2dev; in synaptics_detect()
108 return -ENODEV; in synaptics_detect()
111 psmouse->vendor = "Synaptics"; in synaptics_detect()
112 psmouse->name = "TouchPad"; in synaptics_detect()
175 "LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */
181 "LEN0097", /* X280 -> ALPS trackpoint */
194 "SYN3221", /* HP 15-ay000 */
195 "SYN323d", /* HP Spectre X360 13-w013dx */
196 "SYN3257", /* HP Envy 13-ad105ng */
213 error = ps2_sliced_command(&psmouse->ps2dev, cmd); in synaptics_send_cmd()
217 error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO); in synaptics_send_cmd()
249 error = synaptics_query_int(psmouse, SYN_QUE_IDENTIFY, &info->identity); in synaptics_identify()
253 return SYN_ID_IS_SYNAPTICS(info->identity) ? 0 : -ENXIO; in synaptics_identify()
257 * Read the model-id bytes from the touchpad
263 return synaptics_query_int(psmouse, SYN_QUE_MODEL, &info->model_id); in synaptics_model_id()
273 &info->firmware_id); in synaptics_firmware_id()
287 if (SYN_ID_FULL(info->identity) < 0x705) in synaptics_query_modes()
294 info->board_id = ((bid[0] & 0xfc) << 6) | bid[1]; in synaptics_query_modes()
298 &info->ext_cap_10); in synaptics_query_modes()
304 * Read the capability-bits from the touchpad
313 &info->capabilities); in synaptics_capability()
317 info->ext_cap = info->ext_cap_0c = 0; in synaptics_capability()
322 if (SYN_ID_FULL(info->identity) < 0x705 && in synaptics_capability()
323 SYN_CAP_SUBMODEL_ID(info->capabilities) != 0x47) { in synaptics_capability()
324 return -ENXIO; in synaptics_capability()
330 if (!SYN_CAP_EXTENDED(info->capabilities)) in synaptics_capability()
331 info->capabilities = 0; in synaptics_capability()
333 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 1) { in synaptics_capability()
335 &info->ext_cap); in synaptics_capability()
344 if (SYN_CAP_MULTI_BUTTON_NO(info->ext_cap) > 8) in synaptics_capability()
345 info->ext_cap &= ~SYN_CAP_MB_MASK; in synaptics_capability()
349 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 4) { in synaptics_capability()
351 &info->ext_cap_0c); in synaptics_capability()
370 if (SYN_ID_MAJOR(info->identity) < 4) in synaptics_resolution()
376 info->x_res = resp[0]; /* x resolution in units/mm */ in synaptics_resolution()
377 info->y_res = resp[2]; /* y resolution in units/mm */ in synaptics_resolution()
381 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 5 && in synaptics_resolution()
382 SYN_CAP_MAX_DIMENSIONS(info->ext_cap_0c)) { in synaptics_resolution()
389 info->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1); in synaptics_resolution()
390 info->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3); in synaptics_resolution()
393 info->x_max, info->y_max); in synaptics_resolution()
397 if (SYN_CAP_MIN_DIMENSIONS(info->ext_cap_0c) && in synaptics_resolution()
398 (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 7 || in synaptics_resolution()
404 SYN_ID_FULL(info->identity) == 0x801)) { in synaptics_resolution()
411 info->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1); in synaptics_resolution()
412 info->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3); in synaptics_resolution()
415 info->x_min, info->y_min); in synaptics_resolution()
523 return YMAX_NOMINAL + YMIN_NOMINAL - y; in synaptics_invert_y()
540 info->board_id < min_max_pnpid_table[i].board_id.min) in synaptics_apply_quirks()
544 info->board_id > min_max_pnpid_table[i].board_id.max) in synaptics_apply_quirks()
547 info->x_min = min_max_pnpid_table[i].x_min; in synaptics_apply_quirks()
548 info->x_max = min_max_pnpid_table[i].x_max; in synaptics_apply_quirks()
549 info->y_min = min_max_pnpid_table[i].y_min; in synaptics_apply_quirks()
550 info->y_max = min_max_pnpid_table[i].y_max; in synaptics_apply_quirks()
553 info->x_min, info->x_max, in synaptics_apply_quirks()
554 info->y_min, info->y_max); in synaptics_apply_quirks()
561 return (SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) || in synaptics_has_agm()
562 SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c)); in synaptics_has_agm()
570 error = ps2_sliced_command(&psmouse->ps2dev, SYN_QUE_MODEL); in synaptics_set_advanced_gesture_mode()
574 error = ps2_command(&psmouse->ps2dev, &param, PSMOUSE_CMD_SETRATE); in synaptics_set_advanced_gesture_mode()
583 struct synaptics_data *priv = psmouse->private; in synaptics_set_mode()
586 priv->mode = 0; in synaptics_set_mode()
587 if (priv->absolute_mode) in synaptics_set_mode()
588 priv->mode |= SYN_BIT_ABSOLUTE_MODE; in synaptics_set_mode()
589 if (priv->disable_gesture) in synaptics_set_mode()
590 priv->mode |= SYN_BIT_DISABLE_GESTURE; in synaptics_set_mode()
591 if (psmouse->rate >= 80) in synaptics_set_mode()
592 priv->mode |= SYN_BIT_HIGH_RATE; in synaptics_set_mode()
593 if (SYN_CAP_EXTENDED(priv->info.capabilities)) in synaptics_set_mode()
594 priv->mode |= SYN_BIT_W_MODE; in synaptics_set_mode()
596 error = synaptics_mode_cmd(psmouse, priv->mode); in synaptics_set_mode()
600 if (priv->absolute_mode && synaptics_has_agm(priv)) { in synaptics_set_mode()
615 struct synaptics_data *priv = psmouse->private; in synaptics_set_rate()
618 priv->mode |= SYN_BIT_HIGH_RATE; in synaptics_set_rate()
619 psmouse->rate = 80; in synaptics_set_rate()
621 priv->mode &= ~SYN_BIT_HIGH_RATE; in synaptics_set_rate()
622 psmouse->rate = 40; in synaptics_set_rate()
625 synaptics_mode_cmd(psmouse, priv->mode); in synaptics_set_rate()
629 * Synaptics pass-through PS/2 port support
633 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_write()
634 u8 rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */ in synaptics_pt_write()
637 error = ps2_sliced_command(&parent->ps2dev, c); in synaptics_pt_write()
641 error = ps2_command(&parent->ps2dev, &rate_param, PSMOUSE_CMD_SETRATE); in synaptics_pt_write()
650 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_start()
651 struct synaptics_data *priv = parent->private; in synaptics_pt_start()
653 guard(serio_pause_rx)(parent->ps2dev.serio); in synaptics_pt_start()
654 priv->pt_port = serio; in synaptics_pt_start()
661 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_stop()
662 struct synaptics_data *priv = parent->private; in synaptics_pt_stop()
664 guard(serio_pause_rx)(parent->ps2dev.serio); in synaptics_pt_stop()
665 priv->pt_port = NULL; in synaptics_pt_stop()
670 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_open()
671 struct synaptics_data *priv = parent->private; in synaptics_pt_open()
673 guard(serio_pause_rx)(parent->ps2dev.serio); in synaptics_pt_open()
674 priv->pt_port_open = true; in synaptics_pt_open()
681 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_close()
682 struct synaptics_data *priv = parent->private; in synaptics_pt_close()
684 guard(serio_pause_rx)(parent->ps2dev.serio); in synaptics_pt_close()
685 priv->pt_port_open = false; in synaptics_pt_close()
697 ptport = priv->pt_port; in synaptics_pass_pt_packet()
703 if (priv->pt_port_open) { in synaptics_pass_pt_packet()
706 if (child->state == PSMOUSE_ACTIVATED) { in synaptics_pass_pt_packet()
709 if (child->pktsize == 4) in synaptics_pass_pt_packet()
717 struct synaptics_data *priv = psmouse->private; in synaptics_pt_activate()
718 struct psmouse *child = psmouse_from_serio(priv->pt_port); in synaptics_pt_activate()
722 if (child->pktsize == 4) in synaptics_pt_activate()
723 priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT; in synaptics_pt_activate()
725 priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT; in synaptics_pt_activate()
727 if (synaptics_mode_cmd(psmouse, priv->mode)) in synaptics_pt_activate()
740 "not enough memory for pass-through port\n"); in synaptics_pt_create()
744 serio->id.type = SERIO_PS_PSTHRU; in synaptics_pt_create()
745 strscpy(serio->name, "Synaptics pass-through", sizeof(serio->name)); in synaptics_pt_create()
746 strscpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->phys)); in synaptics_pt_create()
747 serio->write = synaptics_pt_write; in synaptics_pt_create()
748 serio->start = synaptics_pt_start; in synaptics_pt_create()
749 serio->stop = synaptics_pt_stop; in synaptics_pt_create()
750 serio->open = synaptics_pt_open; in synaptics_pt_create()
751 serio->close = synaptics_pt_close; in synaptics_pt_create()
752 serio->parent = psmouse->ps2dev.serio; in synaptics_pt_create()
754 psmouse->pt_activate = synaptics_pt_activate; in synaptics_pt_create()
757 serio->name, psmouse->phys); in synaptics_pt_create()
769 struct synaptics_hw_state *agm = &priv->agm; in synaptics_parse_agm()
776 agm->w = hw->w; in synaptics_parse_agm()
777 agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1; in synaptics_parse_agm()
778 agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1; in synaptics_parse_agm()
779 agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1; in synaptics_parse_agm()
783 /* AGM-CONTACT packet: we are only interested in the count */ in synaptics_parse_agm()
784 priv->agm_count = buf[1]; in synaptics_parse_agm()
797 (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) + 1) >> 1; in synaptics_parse_ext_buttons()
798 unsigned int ext_mask = GENMASK(ext_bits - 1, 0); in synaptics_parse_ext_buttons()
800 hw->ext_buttons = buf[4] & ext_mask; in synaptics_parse_ext_buttons()
801 hw->ext_buttons |= (buf[5] & ext_mask) << ext_bits; in synaptics_parse_ext_buttons()
810 if (SYN_MODEL_NEWABS(priv->info.model_id)) { in synaptics_parse_hw_state()
811 hw->w = (((buf[0] & 0x30) >> 2) | in synaptics_parse_hw_state()
815 if (synaptics_has_agm(priv) && hw->w == 2) { in synaptics_parse_hw_state()
820 hw->x = (((buf[3] & 0x10) << 8) | in synaptics_parse_hw_state()
823 hw->y = (((buf[3] & 0x20) << 7) | in synaptics_parse_hw_state()
826 hw->z = buf[2]; in synaptics_parse_hw_state()
828 hw->left = (buf[0] & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
829 hw->right = (buf[0] & 0x02) ? 1 : 0; in synaptics_parse_hw_state()
831 if (priv->is_forcepad) { in synaptics_parse_hw_state()
839 * out multi-finger gestures. in synaptics_parse_hw_state()
841 if (hw->z == 0) { in synaptics_parse_hw_state()
843 priv->press = priv->report_press = false; in synaptics_parse_hw_state()
844 } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) { in synaptics_parse_hw_state()
846 * Single-finger touch with pressure above in synaptics_parse_hw_state()
853 if (!priv->press) { in synaptics_parse_hw_state()
854 priv->press_start = jiffies; in synaptics_parse_hw_state()
855 priv->press = true; in synaptics_parse_hw_state()
857 priv->press_start + in synaptics_parse_hw_state()
859 priv->report_press = true; in synaptics_parse_hw_state()
862 priv->press = false; in synaptics_parse_hw_state()
865 hw->left = priv->report_press; in synaptics_parse_hw_state()
867 } else if (SYN_CAP_CLICKPAD(priv->info.ext_cap_0c)) { in synaptics_parse_hw_state()
873 hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
875 } else if (SYN_CAP_MIDDLE_BUTTON(priv->info.capabilities)) { in synaptics_parse_hw_state()
876 hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
877 if (hw->w == 2) in synaptics_parse_hw_state()
878 hw->scroll = (s8)buf[1]; in synaptics_parse_hw_state()
881 if (SYN_CAP_FOUR_BUTTON(priv->info.capabilities)) { in synaptics_parse_hw_state()
882 hw->up = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
883 hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0; in synaptics_parse_hw_state()
886 if (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) > 0 && in synaptics_parse_hw_state()
891 hw->x = (((buf[1] & 0x1f) << 8) | buf[2]); in synaptics_parse_hw_state()
892 hw->y = (((buf[4] & 0x1f) << 8) | buf[5]); in synaptics_parse_hw_state()
894 hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F)); in synaptics_parse_hw_state()
895 hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1)); in synaptics_parse_hw_state()
897 hw->left = (buf[0] & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
898 hw->right = (buf[0] & 0x02) ? 1 : 0; in synaptics_parse_hw_state()
902 * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE in synaptics_parse_hw_state()
907 if (hw->x > X_MAX_POSITIVE) in synaptics_parse_hw_state()
908 hw->x -= 1 << ABS_POS_BITS; in synaptics_parse_hw_state()
909 else if (hw->x == X_MAX_POSITIVE) in synaptics_parse_hw_state()
910 hw->x = XMAX; in synaptics_parse_hw_state()
912 if (hw->y > Y_MAX_POSITIVE) in synaptics_parse_hw_state()
913 hw->y -= 1 << ABS_POS_BITS; in synaptics_parse_hw_state()
914 else if (hw->y == Y_MAX_POSITIVE) in synaptics_parse_hw_state()
915 hw->y = YMAX; in synaptics_parse_hw_state()
937 synaptics_report_semi_mt_slot(dev, 0, true, min(a->x, b->x), in synaptics_report_semi_mt_data()
938 min(a->y, b->y)); in synaptics_report_semi_mt_data()
939 synaptics_report_semi_mt_slot(dev, 1, true, max(a->x, b->x), in synaptics_report_semi_mt_data()
940 max(a->y, b->y)); in synaptics_report_semi_mt_data()
942 synaptics_report_semi_mt_slot(dev, 0, true, a->x, a->y); in synaptics_report_semi_mt_data()
953 struct input_dev *dev = psmouse->dev; in synaptics_report_ext_buttons()
954 struct synaptics_data *priv = psmouse->private; in synaptics_report_ext_buttons()
955 int ext_bits = (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) + 1) >> 1; in synaptics_report_ext_buttons()
958 if (!SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap)) in synaptics_report_ext_buttons()
962 if ((SYN_ID_FULL(priv->info.identity) == 0x801 || in synaptics_report_ext_buttons()
963 SYN_ID_FULL(priv->info.identity) == 0x802) && in synaptics_report_ext_buttons()
964 !((psmouse->packet[0] ^ psmouse->packet[3]) & 0x02)) in synaptics_report_ext_buttons()
967 if (!SYN_CAP_EXT_BUTTONS_STICK(priv->info.ext_cap_10)) { in synaptics_report_ext_buttons()
970 hw->ext_buttons & BIT(i)); in synaptics_report_ext_buttons()
972 hw->ext_buttons & BIT(i + ext_bits)); in synaptics_report_ext_buttons()
979 * physically wired to the touchpad. Re-route them through in synaptics_report_ext_buttons()
980 * the pass-through interface. in synaptics_report_ext_buttons()
982 if (priv->pt_port) { in synaptics_report_ext_buttons()
986 pt_buttons = SYN_EXT_BUTTON_STICK_L(hw->ext_buttons) | in synaptics_report_ext_buttons()
987 SYN_EXT_BUTTON_STICK_R(hw->ext_buttons) << 1 | in synaptics_report_ext_buttons()
988 SYN_EXT_BUTTON_STICK_M(hw->ext_buttons) << 2; in synaptics_report_ext_buttons()
990 serio_interrupt(priv->pt_port, in synaptics_report_ext_buttons()
992 serio_interrupt(priv->pt_port, pt_buttons, SERIO_OOB_DATA); in synaptics_report_ext_buttons()
999 struct input_dev *dev = psmouse->dev; in synaptics_report_buttons()
1000 struct synaptics_data *priv = psmouse->private; in synaptics_report_buttons()
1002 input_report_key(dev, BTN_LEFT, hw->left); in synaptics_report_buttons()
1003 input_report_key(dev, BTN_RIGHT, hw->right); in synaptics_report_buttons()
1005 if (SYN_CAP_MIDDLE_BUTTON(priv->info.capabilities)) in synaptics_report_buttons()
1006 input_report_key(dev, BTN_MIDDLE, hw->middle); in synaptics_report_buttons()
1008 if (SYN_CAP_FOUR_BUTTON(priv->info.capabilities)) { in synaptics_report_buttons()
1009 input_report_key(dev, BTN_FORWARD, hw->up); in synaptics_report_buttons()
1010 input_report_key(dev, BTN_BACK, hw->down); in synaptics_report_buttons()
1020 struct input_dev *dev = psmouse->dev; in synaptics_report_mt_data()
1021 struct synaptics_data *priv = psmouse->private; in synaptics_report_mt_data()
1022 const struct synaptics_hw_state *hw[2] = { sgm, &priv->agm }; in synaptics_report_mt_data()
1029 pos[i].x = hw[i]->x; in synaptics_report_mt_data()
1030 pos[i].y = synaptics_invert_y(hw[i]->y); in synaptics_report_mt_data()
1033 input_mt_assign_slots(dev, slot, pos, nsemi, DMAX * priv->info.x_res); in synaptics_report_mt_data()
1040 input_report_abs(dev, ABS_MT_PRESSURE, hw[i]->z); in synaptics_report_mt_data()
1059 struct synaptics_data *priv = psmouse->private; in synaptics_image_sensor_process()
1065 if (sgm->z == 0) in synaptics_image_sensor_process()
1067 else if (sgm->w >= 4) in synaptics_image_sensor_process()
1069 else if (sgm->w == 0) in synaptics_image_sensor_process()
1071 else if (sgm->w == 1) in synaptics_image_sensor_process()
1072 num_fingers = priv->agm_count ? priv->agm_count : 3; in synaptics_image_sensor_process()
1082 if (SYN_CAP_MULTIFINGER(priv->info.capabilities)) in synaptics_has_multifinger()
1085 /* Advanced gesture mode also sends multi finger data */ in synaptics_has_multifinger()
1094 struct input_dev *dev = psmouse->dev; in synaptics_process_packet()
1095 struct synaptics_data *priv = psmouse->private; in synaptics_process_packet()
1096 struct synaptics_device_info *info = &priv->info; in synaptics_process_packet()
1101 if (synaptics_parse_hw_state(psmouse->packet, priv, &hw)) in synaptics_process_packet()
1104 if (SYN_CAP_IMAGE_SENSOR(info->ext_cap_0c)) { in synaptics_process_packet()
1110 priv->scroll += hw.scroll; in synaptics_process_packet()
1112 while (priv->scroll >= 4) { in synaptics_process_packet()
1117 priv->scroll -= 4; in synaptics_process_packet()
1119 while (priv->scroll <= -4) { in synaptics_process_packet()
1124 priv->scroll += 4; in synaptics_process_packet()
1132 if (SYN_CAP_EXTENDED(info->capabilities)) { in synaptics_process_packet()
1140 * SYN_MODEL_PEN(info->model_id): even if in synaptics_process_packet()
1146 if (SYN_CAP_PALMDETECT(info->capabilities)) in synaptics_process_packet()
1161 if (SYN_CAP_ADV_GESTURE(info->ext_cap_0c)) in synaptics_process_packet()
1162 synaptics_report_semi_mt_data(dev, &hw, &priv->agm, in synaptics_process_packet()
1167 * absolute -> relative conversion in synaptics_process_packet()
1178 if (SYN_CAP_PALMDETECT(info->capabilities)) in synaptics_process_packet()
1200 const u8 *packet = psmouse->packet; in synaptics_validate_byte()
1240 struct synaptics_data *priv = psmouse->private; in synaptics_process_byte()
1242 if (psmouse->pktcnt >= 6) { /* Full packet received */ in synaptics_process_byte()
1243 if (unlikely(priv->pkt_type == SYN_NEWABS)) in synaptics_process_byte()
1244 priv->pkt_type = synaptics_detect_pkt_type(psmouse); in synaptics_process_byte()
1246 if (SYN_CAP_PASS_THROUGH(priv->info.capabilities) && in synaptics_process_byte()
1247 synaptics_is_pt_packet(psmouse->packet)) { in synaptics_process_byte()
1248 synaptics_pass_pt_packet(priv, psmouse->packet); in synaptics_process_byte()
1256 return synaptics_validate_byte(psmouse, psmouse->pktcnt - 1, priv->pkt_type) ? in synaptics_process_byte()
1267 int x_min = info->x_min ?: XMIN_NOMINAL; in set_abs_position_params()
1268 int x_max = info->x_max ?: XMAX_NOMINAL; in set_abs_position_params()
1269 int y_min = info->y_min ?: YMIN_NOMINAL; in set_abs_position_params()
1270 int y_max = info->y_max ?: YMAX_NOMINAL; in set_abs_position_params()
1271 int fuzz = SYN_CAP_REDUCED_FILTERING(info->ext_cap_0c) ? in set_abs_position_params()
1276 input_abs_set_res(dev, x_code, info->x_res); in set_abs_position_params()
1277 input_abs_set_res(dev, y_code, info->y_res); in set_abs_position_params()
1283 struct input_dev *dev = psmouse->dev; in set_input_params()
1284 struct synaptics_device_info *info = &priv->info; in set_input_params()
1289 __clear_bit(EV_REL, dev->evbit); in set_input_params()
1290 bitmap_zero(dev->relbit, REL_CNT); in set_input_params()
1291 bitmap_zero(dev->keybit, KEY_CNT); in set_input_params()
1294 __set_bit(INPUT_PROP_POINTER, dev->propbit); in set_input_params()
1299 if (!SYN_CAP_CLICKPAD(info->ext_cap_0c)) { in set_input_params()
1301 if (SYN_CAP_MIDDLE_BUTTON(info->capabilities)) in set_input_params()
1305 if (!priv->absolute_mode) { in set_input_params()
1313 set_abs_position_params(dev, &priv->info, ABS_X, ABS_Y); in set_input_params()
1319 if (SYN_CAP_IMAGE_SENSOR(info->ext_cap_0c)) { in set_input_params()
1322 /* Image sensors can report per-contact pressure */ in set_input_params()
1333 } else if (SYN_CAP_ADV_GESTURE(info->ext_cap_0c)) { in set_input_params()
1337 * Profile sensor in CR-48 tracks contacts reasonably well, in set_input_params()
1338 * other non-image sensors with AGM use semi-mt. in set_input_params()
1349 * For semi-mt devices we send ABS_X/Y ourselves instead of in set_input_params()
1353 * position. Let's re-initialize ABS_X/Y here. in set_input_params()
1356 set_abs_position_params(dev, &priv->info, ABS_X, ABS_Y); in set_input_params()
1359 if (SYN_CAP_PALMDETECT(info->capabilities)) in set_input_params()
1370 if (SYN_CAP_FOUR_BUTTON(info->capabilities) || in set_input_params()
1371 SYN_CAP_MIDDLE_BUTTON(info->capabilities)) { in set_input_params()
1376 if (!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10)) in set_input_params()
1377 for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(info->ext_cap); i++) in set_input_params()
1380 if (SYN_CAP_CLICKPAD(info->ext_cap_0c)) { in set_input_params()
1381 __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); in set_input_params()
1383 !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10)) in set_input_params()
1384 __set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit); in set_input_params()
1393 struct synaptics_data *priv = psmouse->private; in synaptics_show_disable_gesture()
1395 return sprintf(buf, "%c\n", priv->disable_gesture ? '1' : '0'); in synaptics_show_disable_gesture()
1402 struct synaptics_data *priv = psmouse->private; in synaptics_set_disable_gesture()
1411 return -EINVAL; in synaptics_set_disable_gesture()
1413 if (value == priv->disable_gesture) in synaptics_set_disable_gesture()
1416 priv->disable_gesture = value; in synaptics_set_disable_gesture()
1418 priv->mode |= SYN_BIT_DISABLE_GESTURE; in synaptics_set_disable_gesture()
1420 priv->mode &= ~SYN_BIT_DISABLE_GESTURE; in synaptics_set_disable_gesture()
1422 if (synaptics_mode_cmd(psmouse, priv->mode)) in synaptics_set_disable_gesture()
1423 return -EIO; in synaptics_set_disable_gesture()
1434 struct synaptics_data *priv = psmouse->private; in synaptics_disconnect()
1442 if (!priv->absolute_mode && in synaptics_disconnect()
1443 SYN_ID_DISGEST_SUPPORTED(priv->info.identity)) in synaptics_disconnect()
1444 device_remove_file(&psmouse->ps2dev.serio->dev, in synaptics_disconnect()
1449 psmouse->private = NULL; in synaptics_disconnect()
1454 struct synaptics_data *priv = psmouse->private; in synaptics_reconnect()
1467 * to Synaptics-specific queries, so let's wait a in synaptics_reconnect()
1472 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID); in synaptics_reconnect()
1494 if (info.identity != priv->info.identity || in synaptics_reconnect()
1495 info.model_id != priv->info.model_id || in synaptics_reconnect()
1496 info.capabilities != priv->info.capabilities || in synaptics_reconnect()
1497 info.ext_cap != priv->info.ext_cap) { in synaptics_reconnect()
1499 "hardware appears to be different: id(%u-%u), model(%u-%u), caps(%x-%x), ext(%x-%x).\n", in synaptics_reconnect()
1500 priv->info.identity, info.identity, in synaptics_reconnect()
1501 priv->info.model_id, info.model_id, in synaptics_reconnect()
1502 priv->info.capabilities, info.capabilities, in synaptics_reconnect()
1503 priv->info.ext_cap, info.ext_cap); in synaptics_reconnect()
1504 return -ENXIO; in synaptics_reconnect()
1554 /* OLPC XO-1 or XO-1.5 */
1567 /* Cr-48 Chromebook (Codename Mario) */
1593 psmouse->private = priv = kzalloc(sizeof(*priv), GFP_KERNEL); in synaptics_init_ps2()
1595 return -ENOMEM; in synaptics_init_ps2()
1597 priv->info = *info; in synaptics_init_ps2()
1598 priv->absolute_mode = absolute_mode; in synaptics_init_ps2()
1599 if (SYN_ID_DISGEST_SUPPORTED(info->identity)) in synaptics_init_ps2()
1600 priv->disable_gesture = true; in synaptics_init_ps2()
1606 priv->is_forcepad = psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids); in synaptics_init_ps2()
1614 priv->pkt_type = SYN_MODEL_NEWABS(info->model_id) ? in synaptics_init_ps2()
1619 SYN_ID_MODEL(info->identity), in synaptics_init_ps2()
1620 SYN_ID_MAJOR(info->identity), SYN_ID_MINOR(info->identity), in synaptics_init_ps2()
1621 info->model_id, in synaptics_init_ps2()
1622 info->capabilities, info->ext_cap, info->ext_cap_0c, in synaptics_init_ps2()
1623 info->ext_cap_10, info->board_id, info->firmware_id); in synaptics_init_ps2()
1634 * input device->id.version and be visible to userspace. in synaptics_init_ps2()
1639 psmouse->model = ((info->model_id & 0x00ff0000) >> 8) | in synaptics_init_ps2()
1640 (info->model_id & 0x000000ff); in synaptics_init_ps2()
1643 psmouse->protocol_handler = synaptics_process_byte; in synaptics_init_ps2()
1644 psmouse->pktsize = 6; in synaptics_init_ps2()
1647 psmouse->protocol_handler = psmouse_process_byte; in synaptics_init_ps2()
1648 psmouse->pktsize = 3; in synaptics_init_ps2()
1651 psmouse->set_rate = synaptics_set_rate; in synaptics_init_ps2()
1652 psmouse->disconnect = synaptics_disconnect; in synaptics_init_ps2()
1653 psmouse->reconnect = synaptics_reconnect; in synaptics_init_ps2()
1654 psmouse->fast_reconnect = NULL; in synaptics_init_ps2()
1655 psmouse->cleanup = synaptics_reset; in synaptics_init_ps2()
1657 psmouse->resync_time = 0; in synaptics_init_ps2()
1659 if (SYN_CAP_PASS_THROUGH(info->capabilities)) in synaptics_init_ps2()
1667 if (psmouse->rate >= 80 && impaired_toshiba_kbc) { in synaptics_init_ps2()
1671 psmouse->rate = 40; in synaptics_init_ps2()
1674 if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(info->identity)) { in synaptics_init_ps2()
1675 err = device_create_file(&psmouse->ps2dev.serio->dev, in synaptics_init_ps2()
1753 return -ENOSYS; in synaptics_setup_ps2()
1766 SYNAPTICS_INTERTOUCH_NOT_SET = -1,
1782 !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10); in synaptics_create_intertouch()
1792 .buttonpad = SYN_CAP_CLICKPAD(info->ext_cap_0c), in synaptics_create_intertouch()
1794 !!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10), in synaptics_create_intertouch()
1808 * synaptics_setup_intertouch - called once the PS/2 devices are enumerated
1818 return -ENXIO; in synaptics_setup_intertouch()
1827 …"If i2c-hid and hid-rmi are not used, you might want to try setting psmouse.synaptics_intertouch t… in synaptics_setup_intertouch()
1828 psmouse->ps2dev.serio->firmware_id); in synaptics_setup_intertouch()
1830 return -ENXIO; in synaptics_setup_intertouch()
1838 if (error == -EAGAIN) in synaptics_setup_intertouch()
1863 return -ENXIO; in synaptics_init_smbus()
1875 return -ENOSYS; in synaptics_setup_intertouch()
1880 return -ENOSYS; in synaptics_init_smbus()
1933 return -ENOSYS; in synaptics_init()