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 <kall@compass.com>
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 */
193 "SYN3221", /* HP 15-ay000 */
194 "SYN323d", /* HP Spectre X360 13-w013dx */
195 "SYN3257", /* HP Envy 13-ad105ng */
212 error = ps2_sliced_command(&psmouse->ps2dev, cmd); in synaptics_send_cmd()
216 error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO); in synaptics_send_cmd()
248 error = synaptics_query_int(psmouse, SYN_QUE_IDENTIFY, &info->identity); in synaptics_identify()
252 return SYN_ID_IS_SYNAPTICS(info->identity) ? 0 : -ENXIO; in synaptics_identify()
256 * Read the model-id bytes from the touchpad
262 return synaptics_query_int(psmouse, SYN_QUE_MODEL, &info->model_id); in synaptics_model_id()
272 &info->firmware_id); in synaptics_firmware_id()
286 if (SYN_ID_FULL(info->identity) < 0x705) in synaptics_query_modes()
293 info->board_id = ((bid[0] & 0xfc) << 6) | bid[1]; in synaptics_query_modes()
297 &info->ext_cap_10); in synaptics_query_modes()
303 * Read the capability-bits from the touchpad
312 &info->capabilities); in synaptics_capability()
316 info->ext_cap = info->ext_cap_0c = 0; in synaptics_capability()
321 if (SYN_ID_FULL(info->identity) < 0x705 && in synaptics_capability()
322 SYN_CAP_SUBMODEL_ID(info->capabilities) != 0x47) { in synaptics_capability()
323 return -ENXIO; in synaptics_capability()
329 if (!SYN_CAP_EXTENDED(info->capabilities)) in synaptics_capability()
330 info->capabilities = 0; in synaptics_capability()
332 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 1) { in synaptics_capability()
334 &info->ext_cap); in synaptics_capability()
343 if (SYN_CAP_MULTI_BUTTON_NO(info->ext_cap) > 8) in synaptics_capability()
344 info->ext_cap &= ~SYN_CAP_MB_MASK; in synaptics_capability()
348 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 4) { in synaptics_capability()
350 &info->ext_cap_0c); in synaptics_capability()
369 if (SYN_ID_MAJOR(info->identity) < 4) in synaptics_resolution()
375 info->x_res = resp[0]; /* x resolution in units/mm */ in synaptics_resolution()
376 info->y_res = resp[2]; /* y resolution in units/mm */ in synaptics_resolution()
380 if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 5 && in synaptics_resolution()
381 SYN_CAP_MAX_DIMENSIONS(info->ext_cap_0c)) { in synaptics_resolution()
388 info->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1); in synaptics_resolution()
389 info->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3); in synaptics_resolution()
392 info->x_max, info->y_max); in synaptics_resolution()
396 if (SYN_CAP_MIN_DIMENSIONS(info->ext_cap_0c) && in synaptics_resolution()
397 (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 7 || in synaptics_resolution()
403 SYN_ID_FULL(info->identity) == 0x801)) { in synaptics_resolution()
410 info->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1); in synaptics_resolution()
411 info->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3); in synaptics_resolution()
414 info->x_min, info->y_min); in synaptics_resolution()
522 return YMAX_NOMINAL + YMIN_NOMINAL - y; in synaptics_invert_y()
539 info->board_id < min_max_pnpid_table[i].board_id.min) in synaptics_apply_quirks()
543 info->board_id > min_max_pnpid_table[i].board_id.max) in synaptics_apply_quirks()
546 info->x_min = min_max_pnpid_table[i].x_min; in synaptics_apply_quirks()
547 info->x_max = min_max_pnpid_table[i].x_max; in synaptics_apply_quirks()
548 info->y_min = min_max_pnpid_table[i].y_min; in synaptics_apply_quirks()
549 info->y_max = min_max_pnpid_table[i].y_max; in synaptics_apply_quirks()
552 info->x_min, info->x_max, in synaptics_apply_quirks()
553 info->y_min, info->y_max); in synaptics_apply_quirks()
560 return (SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) || in synaptics_has_agm()
561 SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c)); in synaptics_has_agm()
569 error = ps2_sliced_command(&psmouse->ps2dev, SYN_QUE_MODEL); in synaptics_set_advanced_gesture_mode()
573 error = ps2_command(&psmouse->ps2dev, ¶m, PSMOUSE_CMD_SETRATE); in synaptics_set_advanced_gesture_mode()
582 struct synaptics_data *priv = psmouse->private; in synaptics_set_mode()
585 priv->mode = 0; in synaptics_set_mode()
586 if (priv->absolute_mode) in synaptics_set_mode()
587 priv->mode |= SYN_BIT_ABSOLUTE_MODE; in synaptics_set_mode()
588 if (priv->disable_gesture) in synaptics_set_mode()
589 priv->mode |= SYN_BIT_DISABLE_GESTURE; in synaptics_set_mode()
590 if (psmouse->rate >= 80) in synaptics_set_mode()
591 priv->mode |= SYN_BIT_HIGH_RATE; in synaptics_set_mode()
592 if (SYN_CAP_EXTENDED(priv->info.capabilities)) in synaptics_set_mode()
593 priv->mode |= SYN_BIT_W_MODE; in synaptics_set_mode()
595 error = synaptics_mode_cmd(psmouse, priv->mode); in synaptics_set_mode()
599 if (priv->absolute_mode && synaptics_has_agm(priv)) { in synaptics_set_mode()
614 struct synaptics_data *priv = psmouse->private; in synaptics_set_rate()
617 priv->mode |= SYN_BIT_HIGH_RATE; in synaptics_set_rate()
618 psmouse->rate = 80; in synaptics_set_rate()
620 priv->mode &= ~SYN_BIT_HIGH_RATE; in synaptics_set_rate()
621 psmouse->rate = 40; in synaptics_set_rate()
624 synaptics_mode_cmd(psmouse, priv->mode); in synaptics_set_rate()
628 * Synaptics pass-through PS/2 port support
632 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_write()
633 u8 rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */ in synaptics_pt_write()
636 error = ps2_sliced_command(&parent->ps2dev, c); in synaptics_pt_write()
640 error = ps2_command(&parent->ps2dev, &rate_param, PSMOUSE_CMD_SETRATE); in synaptics_pt_write()
649 struct psmouse *parent = psmouse_from_serio(serio->parent); in synaptics_pt_start()
650 struct synaptics_data *priv = parent->private; in synaptics_pt_start()
652 serio_pause_rx(parent->ps2dev.serio); in synaptics_pt_start()
653 priv->pt_port = serio; in synaptics_pt_start()
654 serio_continue_rx(parent->ps2dev.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 serio_pause_rx(parent->ps2dev.serio); in synaptics_pt_stop()
665 priv->pt_port = NULL; in synaptics_pt_stop()
666 serio_continue_rx(parent->ps2dev.serio); in synaptics_pt_stop()
678 if (child && child->state == PSMOUSE_ACTIVATED) { in synaptics_pass_pt_packet()
682 if (child->pktsize == 4) in synaptics_pass_pt_packet()
691 struct synaptics_data *priv = psmouse->private; in synaptics_pt_activate()
692 struct psmouse *child = psmouse_from_serio(priv->pt_port); in synaptics_pt_activate()
696 if (child->pktsize == 4) in synaptics_pt_activate()
697 priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT; in synaptics_pt_activate()
699 priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT; in synaptics_pt_activate()
701 if (synaptics_mode_cmd(psmouse, priv->mode)) in synaptics_pt_activate()
714 "not enough memory for pass-through port\n"); in synaptics_pt_create()
718 serio->id.type = SERIO_PS_PSTHRU; in synaptics_pt_create()
719 strscpy(serio->name, "Synaptics pass-through", sizeof(serio->name)); in synaptics_pt_create()
720 strscpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->phys)); in synaptics_pt_create()
721 serio->write = synaptics_pt_write; in synaptics_pt_create()
722 serio->start = synaptics_pt_start; in synaptics_pt_create()
723 serio->stop = synaptics_pt_stop; in synaptics_pt_create()
724 serio->parent = psmouse->ps2dev.serio; in synaptics_pt_create()
726 psmouse->pt_activate = synaptics_pt_activate; in synaptics_pt_create()
729 serio->name, psmouse->phys); in synaptics_pt_create()
741 struct synaptics_hw_state *agm = &priv->agm; in synaptics_parse_agm()
748 agm->w = hw->w; in synaptics_parse_agm()
749 agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1; in synaptics_parse_agm()
750 agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1; in synaptics_parse_agm()
751 agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1; in synaptics_parse_agm()
755 /* AGM-CONTACT packet: we are only interested in the count */ in synaptics_parse_agm()
756 priv->agm_count = buf[1]; in synaptics_parse_agm()
769 (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) + 1) >> 1; in synaptics_parse_ext_buttons()
770 unsigned int ext_mask = GENMASK(ext_bits - 1, 0); in synaptics_parse_ext_buttons()
772 hw->ext_buttons = buf[4] & ext_mask; in synaptics_parse_ext_buttons()
773 hw->ext_buttons |= (buf[5] & ext_mask) << ext_bits; in synaptics_parse_ext_buttons()
782 if (SYN_MODEL_NEWABS(priv->info.model_id)) { in synaptics_parse_hw_state()
783 hw->w = (((buf[0] & 0x30) >> 2) | in synaptics_parse_hw_state()
787 if (synaptics_has_agm(priv) && hw->w == 2) { in synaptics_parse_hw_state()
792 hw->x = (((buf[3] & 0x10) << 8) | in synaptics_parse_hw_state()
795 hw->y = (((buf[3] & 0x20) << 7) | in synaptics_parse_hw_state()
798 hw->z = buf[2]; in synaptics_parse_hw_state()
800 hw->left = (buf[0] & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
801 hw->right = (buf[0] & 0x02) ? 1 : 0; in synaptics_parse_hw_state()
803 if (priv->is_forcepad) { in synaptics_parse_hw_state()
811 * out multi-finger gestures. in synaptics_parse_hw_state()
813 if (hw->z == 0) { in synaptics_parse_hw_state()
815 priv->press = priv->report_press = false; in synaptics_parse_hw_state()
816 } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) { in synaptics_parse_hw_state()
818 * Single-finger touch with pressure above in synaptics_parse_hw_state()
825 if (!priv->press) { in synaptics_parse_hw_state()
826 priv->press_start = jiffies; in synaptics_parse_hw_state()
827 priv->press = true; in synaptics_parse_hw_state()
829 priv->press_start + in synaptics_parse_hw_state()
831 priv->report_press = true; in synaptics_parse_hw_state()
834 priv->press = false; in synaptics_parse_hw_state()
837 hw->left = priv->report_press; in synaptics_parse_hw_state()
839 } else if (SYN_CAP_CLICKPAD(priv->info.ext_cap_0c)) { in synaptics_parse_hw_state()
845 hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
847 } else if (SYN_CAP_MIDDLE_BUTTON(priv->info.capabilities)) { in synaptics_parse_hw_state()
848 hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
849 if (hw->w == 2) in synaptics_parse_hw_state()
850 hw->scroll = (s8)buf[1]; in synaptics_parse_hw_state()
853 if (SYN_CAP_FOUR_BUTTON(priv->info.capabilities)) { in synaptics_parse_hw_state()
854 hw->up = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
855 hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0; in synaptics_parse_hw_state()
858 if (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) > 0 && in synaptics_parse_hw_state()
863 hw->x = (((buf[1] & 0x1f) << 8) | buf[2]); in synaptics_parse_hw_state()
864 hw->y = (((buf[4] & 0x1f) << 8) | buf[5]); in synaptics_parse_hw_state()
866 hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F)); in synaptics_parse_hw_state()
867 hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1)); in synaptics_parse_hw_state()
869 hw->left = (buf[0] & 0x01) ? 1 : 0; in synaptics_parse_hw_state()
870 hw->right = (buf[0] & 0x02) ? 1 : 0; in synaptics_parse_hw_state()
874 * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE in synaptics_parse_hw_state()
879 if (hw->x > X_MAX_POSITIVE) in synaptics_parse_hw_state()
880 hw->x -= 1 << ABS_POS_BITS; in synaptics_parse_hw_state()
881 else if (hw->x == X_MAX_POSITIVE) in synaptics_parse_hw_state()
882 hw->x = XMAX; in synaptics_parse_hw_state()
884 if (hw->y > Y_MAX_POSITIVE) in synaptics_parse_hw_state()
885 hw->y -= 1 << ABS_POS_BITS; in synaptics_parse_hw_state()
886 else if (hw->y == Y_MAX_POSITIVE) in synaptics_parse_hw_state()
887 hw->y = YMAX; in synaptics_parse_hw_state()
909 synaptics_report_semi_mt_slot(dev, 0, true, min(a->x, b->x), in synaptics_report_semi_mt_data()
910 min(a->y, b->y)); in synaptics_report_semi_mt_data()
911 synaptics_report_semi_mt_slot(dev, 1, true, max(a->x, b->x), in synaptics_report_semi_mt_data()
912 max(a->y, b->y)); in synaptics_report_semi_mt_data()
914 synaptics_report_semi_mt_slot(dev, 0, true, a->x, a->y); in synaptics_report_semi_mt_data()
925 struct input_dev *dev = psmouse->dev; in synaptics_report_ext_buttons()
926 struct synaptics_data *priv = psmouse->private; in synaptics_report_ext_buttons()
927 int ext_bits = (SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap) + 1) >> 1; in synaptics_report_ext_buttons()
930 if (!SYN_CAP_MULTI_BUTTON_NO(priv->info.ext_cap)) in synaptics_report_ext_buttons()
934 if ((SYN_ID_FULL(priv->info.identity) == 0x801 || in synaptics_report_ext_buttons()
935 SYN_ID_FULL(priv->info.identity) == 0x802) && in synaptics_report_ext_buttons()
936 !((psmouse->packet[0] ^ psmouse->packet[3]) & 0x02)) in synaptics_report_ext_buttons()
939 if (!SYN_CAP_EXT_BUTTONS_STICK(priv->info.ext_cap_10)) { in synaptics_report_ext_buttons()
942 hw->ext_buttons & BIT(i)); in synaptics_report_ext_buttons()
944 hw->ext_buttons & BIT(i + ext_bits)); in synaptics_report_ext_buttons()
951 * physically wired to the touchpad. Re-route them through in synaptics_report_ext_buttons()
952 * the pass-through interface. in synaptics_report_ext_buttons()
954 if (priv->pt_port) { in synaptics_report_ext_buttons()
958 pt_buttons = SYN_EXT_BUTTON_STICK_L(hw->ext_buttons) | in synaptics_report_ext_buttons()
959 SYN_EXT_BUTTON_STICK_R(hw->ext_buttons) << 1 | in synaptics_report_ext_buttons()
960 SYN_EXT_BUTTON_STICK_M(hw->ext_buttons) << 2; in synaptics_report_ext_buttons()
962 serio_interrupt(priv->pt_port, in synaptics_report_ext_buttons()
964 serio_interrupt(priv->pt_port, pt_buttons, SERIO_OOB_DATA); in synaptics_report_ext_buttons()
971 struct input_dev *dev = psmouse->dev; in synaptics_report_buttons()
972 struct synaptics_data *priv = psmouse->private; in synaptics_report_buttons()
974 input_report_key(dev, BTN_LEFT, hw->left); in synaptics_report_buttons()
975 input_report_key(dev, BTN_RIGHT, hw->right); in synaptics_report_buttons()
977 if (SYN_CAP_MIDDLE_BUTTON(priv->info.capabilities)) in synaptics_report_buttons()
978 input_report_key(dev, BTN_MIDDLE, hw->middle); in synaptics_report_buttons()
980 if (SYN_CAP_FOUR_BUTTON(priv->info.capabilities)) { in synaptics_report_buttons()
981 input_report_key(dev, BTN_FORWARD, hw->up); in synaptics_report_buttons()
982 input_report_key(dev, BTN_BACK, hw->down); in synaptics_report_buttons()
992 struct input_dev *dev = psmouse->dev; in synaptics_report_mt_data()
993 struct synaptics_data *priv = psmouse->private; in synaptics_report_mt_data()
994 const struct synaptics_hw_state *hw[2] = { sgm, &priv->agm }; in synaptics_report_mt_data()
1001 pos[i].x = hw[i]->x; in synaptics_report_mt_data()
1002 pos[i].y = synaptics_invert_y(hw[i]->y); in synaptics_report_mt_data()
1005 input_mt_assign_slots(dev, slot, pos, nsemi, DMAX * priv->info.x_res); in synaptics_report_mt_data()
1012 input_report_abs(dev, ABS_MT_PRESSURE, hw[i]->z); in synaptics_report_mt_data()
1031 struct synaptics_data *priv = psmouse->private; in synaptics_image_sensor_process()
1037 if (sgm->z == 0) in synaptics_image_sensor_process()
1039 else if (sgm->w >= 4) in synaptics_image_sensor_process()
1041 else if (sgm->w == 0) in synaptics_image_sensor_process()
1043 else if (sgm->w == 1) in synaptics_image_sensor_process()
1044 num_fingers = priv->agm_count ? priv->agm_count : 3; in synaptics_image_sensor_process()
1054 if (SYN_CAP_MULTIFINGER(priv->info.capabilities)) in synaptics_has_multifinger()
1057 /* Advanced gesture mode also sends multi finger data */ in synaptics_has_multifinger()
1066 struct input_dev *dev = psmouse->dev; in synaptics_process_packet()
1067 struct synaptics_data *priv = psmouse->private; in synaptics_process_packet()
1068 struct synaptics_device_info *info = &priv->info; in synaptics_process_packet()
1073 if (synaptics_parse_hw_state(psmouse->packet, priv, &hw)) in synaptics_process_packet()
1076 if (SYN_CAP_IMAGE_SENSOR(info->ext_cap_0c)) { in synaptics_process_packet()
1082 priv->scroll += hw.scroll; in synaptics_process_packet()
1084 while (priv->scroll >= 4) { in synaptics_process_packet()
1089 priv->scroll -= 4; in synaptics_process_packet()
1091 while (priv->scroll <= -4) { in synaptics_process_packet()
1096 priv->scroll += 4; in synaptics_process_packet()
1104 if (SYN_CAP_EXTENDED(info->capabilities)) { in synaptics_process_packet()
1112 * SYN_MODEL_PEN(info->model_id): even if in synaptics_process_packet()
1118 if (SYN_CAP_PALMDETECT(info->capabilities)) in synaptics_process_packet()
1133 if (SYN_CAP_ADV_GESTURE(info->ext_cap_0c)) in synaptics_process_packet()
1134 synaptics_report_semi_mt_data(dev, &hw, &priv->agm, in synaptics_process_packet()
1139 * absolute -> relative conversion in synaptics_process_packet()
1150 if (SYN_CAP_PALMDETECT(info->capabilities)) in synaptics_process_packet()
1172 const u8 *packet = psmouse->packet; in synaptics_validate_byte()
1212 struct synaptics_data *priv = psmouse->private; in synaptics_process_byte()
1214 if (psmouse->pktcnt >= 6) { /* Full packet received */ in synaptics_process_byte()
1215 if (unlikely(priv->pkt_type == SYN_NEWABS)) in synaptics_process_byte()
1216 priv->pkt_type = synaptics_detect_pkt_type(psmouse); in synaptics_process_byte()
1218 if (SYN_CAP_PASS_THROUGH(priv->info.capabilities) && in synaptics_process_byte()
1219 synaptics_is_pt_packet(psmouse->packet)) { in synaptics_process_byte()
1220 if (priv->pt_port) in synaptics_process_byte()
1221 synaptics_pass_pt_packet(priv->pt_port, in synaptics_process_byte()
1222 psmouse->packet); in synaptics_process_byte()
1229 return synaptics_validate_byte(psmouse, psmouse->pktcnt - 1, priv->pkt_type) ? in synaptics_process_byte()
1240 int x_min = info->x_min ?: XMIN_NOMINAL; in set_abs_position_params()
1241 int x_max = info->x_max ?: XMAX_NOMINAL; in set_abs_position_params()
1242 int y_min = info->y_min ?: YMIN_NOMINAL; in set_abs_position_params()
1243 int y_max = info->y_max ?: YMAX_NOMINAL; in set_abs_position_params()
1244 int fuzz = SYN_CAP_REDUCED_FILTERING(info->ext_cap_0c) ? in set_abs_position_params()
1249 input_abs_set_res(dev, x_code, info->x_res); in set_abs_position_params()
1250 input_abs_set_res(dev, y_code, info->y_res); in set_abs_position_params()
1256 struct input_dev *dev = psmouse->dev; in set_input_params()
1257 struct synaptics_device_info *info = &priv->info; in set_input_params()
1262 __clear_bit(EV_REL, dev->evbit); in set_input_params()
1263 bitmap_zero(dev->relbit, REL_CNT); in set_input_params()
1264 bitmap_zero(dev->keybit, KEY_CNT); in set_input_params()
1267 __set_bit(INPUT_PROP_POINTER, dev->propbit); in set_input_params()
1272 if (!SYN_CAP_CLICKPAD(info->ext_cap_0c)) { in set_input_params()
1274 if (SYN_CAP_MIDDLE_BUTTON(info->capabilities)) in set_input_params()
1278 if (!priv->absolute_mode) { in set_input_params()
1286 set_abs_position_params(dev, &priv->info, ABS_X, ABS_Y); in set_input_params()
1292 if (SYN_CAP_IMAGE_SENSOR(info->ext_cap_0c)) { in set_input_params()
1295 /* Image sensors can report per-contact pressure */ in set_input_params()
1306 } else if (SYN_CAP_ADV_GESTURE(info->ext_cap_0c)) { in set_input_params()
1310 * Profile sensor in CR-48 tracks contacts reasonably well, in set_input_params()
1311 * other non-image sensors with AGM use semi-mt. in set_input_params()
1322 * For semi-mt devices we send ABS_X/Y ourselves instead of in set_input_params()
1326 * position. Let's re-initialize ABS_X/Y here. in set_input_params()
1329 set_abs_position_params(dev, &priv->info, ABS_X, ABS_Y); in set_input_params()
1332 if (SYN_CAP_PALMDETECT(info->capabilities)) in set_input_params()
1343 if (SYN_CAP_FOUR_BUTTON(info->capabilities) || in set_input_params()
1344 SYN_CAP_MIDDLE_BUTTON(info->capabilities)) { in set_input_params()
1349 if (!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10)) in set_input_params()
1350 for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(info->ext_cap); i++) in set_input_params()
1353 if (SYN_CAP_CLICKPAD(info->ext_cap_0c)) { in set_input_params()
1354 __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); in set_input_params()
1356 !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10)) in set_input_params()
1357 __set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit); in set_input_params()
1366 struct synaptics_data *priv = psmouse->private; in synaptics_show_disable_gesture()
1368 return sprintf(buf, "%c\n", priv->disable_gesture ? '1' : '0'); in synaptics_show_disable_gesture()
1375 struct synaptics_data *priv = psmouse->private; in synaptics_set_disable_gesture()
1384 return -EINVAL; in synaptics_set_disable_gesture()
1386 if (value == priv->disable_gesture) in synaptics_set_disable_gesture()
1389 priv->disable_gesture = value; in synaptics_set_disable_gesture()
1391 priv->mode |= SYN_BIT_DISABLE_GESTURE; in synaptics_set_disable_gesture()
1393 priv->mode &= ~SYN_BIT_DISABLE_GESTURE; in synaptics_set_disable_gesture()
1395 if (synaptics_mode_cmd(psmouse, priv->mode)) in synaptics_set_disable_gesture()
1396 return -EIO; in synaptics_set_disable_gesture()
1407 struct synaptics_data *priv = psmouse->private; in synaptics_disconnect()
1415 if (!priv->absolute_mode && in synaptics_disconnect()
1416 SYN_ID_DISGEST_SUPPORTED(priv->info.identity)) in synaptics_disconnect()
1417 device_remove_file(&psmouse->ps2dev.serio->dev, in synaptics_disconnect()
1422 psmouse->private = NULL; in synaptics_disconnect()
1427 struct synaptics_data *priv = psmouse->private; in synaptics_reconnect()
1440 * to Synaptics-specific queries, so let's wait a in synaptics_reconnect()
1445 ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID); in synaptics_reconnect()
1467 if (info.identity != priv->info.identity || in synaptics_reconnect()
1468 info.model_id != priv->info.model_id || in synaptics_reconnect()
1469 info.capabilities != priv->info.capabilities || in synaptics_reconnect()
1470 info.ext_cap != priv->info.ext_cap) { in synaptics_reconnect()
1472 "hardware appears to be different: id(%u-%u), model(%u-%u), caps(%x-%x), ext(%x-%x).\n", in synaptics_reconnect()
1473 priv->info.identity, info.identity, in synaptics_reconnect()
1474 priv->info.model_id, info.model_id, in synaptics_reconnect()
1475 priv->info.capabilities, info.capabilities, in synaptics_reconnect()
1476 priv->info.ext_cap, info.ext_cap); in synaptics_reconnect()
1477 return -ENXIO; in synaptics_reconnect()
1527 /* OLPC XO-1 or XO-1.5 */
1540 /* Cr-48 Chromebook (Codename Mario) */
1566 psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL); in synaptics_init_ps2()
1568 return -ENOMEM; in synaptics_init_ps2()
1570 priv->info = *info; in synaptics_init_ps2()
1571 priv->absolute_mode = absolute_mode; in synaptics_init_ps2()
1572 if (SYN_ID_DISGEST_SUPPORTED(info->identity)) in synaptics_init_ps2()
1573 priv->disable_gesture = true; in synaptics_init_ps2()
1579 priv->is_forcepad = psmouse_matches_pnp_id(psmouse, forcepad_pnp_ids); in synaptics_init_ps2()
1587 priv->pkt_type = SYN_MODEL_NEWABS(info->model_id) ? in synaptics_init_ps2()
1592 SYN_ID_MODEL(info->identity), in synaptics_init_ps2()
1593 SYN_ID_MAJOR(info->identity), SYN_ID_MINOR(info->identity), in synaptics_init_ps2()
1594 info->model_id, in synaptics_init_ps2()
1595 info->capabilities, info->ext_cap, info->ext_cap_0c, in synaptics_init_ps2()
1596 info->ext_cap_10, info->board_id, info->firmware_id); in synaptics_init_ps2()
1607 * input device->id.version and be visible to userspace. in synaptics_init_ps2()
1612 psmouse->model = ((info->model_id & 0x00ff0000) >> 8) | in synaptics_init_ps2()
1613 (info->model_id & 0x000000ff); in synaptics_init_ps2()
1616 psmouse->protocol_handler = synaptics_process_byte; in synaptics_init_ps2()
1617 psmouse->pktsize = 6; in synaptics_init_ps2()
1620 psmouse->protocol_handler = psmouse_process_byte; in synaptics_init_ps2()
1621 psmouse->pktsize = 3; in synaptics_init_ps2()
1624 psmouse->set_rate = synaptics_set_rate; in synaptics_init_ps2()
1625 psmouse->disconnect = synaptics_disconnect; in synaptics_init_ps2()
1626 psmouse->reconnect = synaptics_reconnect; in synaptics_init_ps2()
1627 psmouse->fast_reconnect = NULL; in synaptics_init_ps2()
1628 psmouse->cleanup = synaptics_reset; in synaptics_init_ps2()
1630 psmouse->resync_time = 0; in synaptics_init_ps2()
1632 if (SYN_CAP_PASS_THROUGH(info->capabilities)) in synaptics_init_ps2()
1640 if (psmouse->rate >= 80 && impaired_toshiba_kbc) { in synaptics_init_ps2()
1644 psmouse->rate = 40; in synaptics_init_ps2()
1647 if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(info->identity)) { in synaptics_init_ps2()
1648 err = device_create_file(&psmouse->ps2dev.serio->dev, in synaptics_init_ps2()
1726 return -ENOSYS; in synaptics_setup_ps2()
1739 SYNAPTICS_INTERTOUCH_NOT_SET = -1,
1755 !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10); in synaptics_create_intertouch()
1765 .buttonpad = SYN_CAP_CLICKPAD(info->ext_cap_0c), in synaptics_create_intertouch()
1767 !!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10), in synaptics_create_intertouch()
1781 * synaptics_setup_intertouch - called once the PS/2 devices are enumerated
1791 return -ENXIO; in synaptics_setup_intertouch()
1800 …"If i2c-hid and hid-rmi are not used, you might want to try setting psmouse.synaptics_intertouch t… in synaptics_setup_intertouch()
1801 psmouse->ps2dev.serio->firmware_id); in synaptics_setup_intertouch()
1803 return -ENXIO; in synaptics_setup_intertouch()
1811 if (error == -EAGAIN) in synaptics_setup_intertouch()
1836 return -ENXIO; in synaptics_init_smbus()
1848 return -ENOSYS; in synaptics_setup_intertouch()
1853 return -ENOSYS; in synaptics_init_smbus()
1906 return -ENOSYS; in synaptics_init()