|
@@ -535,16 +535,17 @@ static void synaptics_apply_quirks(struct psmouse *psmouse,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool synaptics_has_agm(struct synaptics_data *priv)
|
|
|
|
+{
|
|
|
|
+ return (SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
|
|
|
|
+ SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c));
|
|
|
|
+}
|
|
|
|
+
|
|
static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
|
|
static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
|
|
{
|
|
{
|
|
static u8 param = 0xc8;
|
|
static u8 param = 0xc8;
|
|
- struct synaptics_data *priv = psmouse->private;
|
|
|
|
int error;
|
|
int error;
|
|
|
|
|
|
- if (!(SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
|
|
|
|
- SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c)))
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
error = psmouse_sliced_command(psmouse, SYN_QUE_MODEL);
|
|
error = psmouse_sliced_command(psmouse, SYN_QUE_MODEL);
|
|
if (error)
|
|
if (error)
|
|
return error;
|
|
return error;
|
|
@@ -553,9 +554,6 @@ static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse)
|
|
if (error)
|
|
if (error)
|
|
return error;
|
|
return error;
|
|
|
|
|
|
- /* Advanced gesture mode also sends multi finger data */
|
|
|
|
- priv->info.capabilities |= BIT(1);
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -578,7 +576,7 @@ static int synaptics_set_mode(struct psmouse *psmouse)
|
|
if (error)
|
|
if (error)
|
|
return error;
|
|
return error;
|
|
|
|
|
|
- if (priv->absolute_mode) {
|
|
|
|
|
|
+ if (priv->absolute_mode && synaptics_has_agm(priv)) {
|
|
error = synaptics_set_advanced_gesture_mode(psmouse);
|
|
error = synaptics_set_advanced_gesture_mode(psmouse);
|
|
if (error) {
|
|
if (error) {
|
|
psmouse_err(psmouse,
|
|
psmouse_err(psmouse,
|
|
@@ -766,9 +764,7 @@ static int synaptics_parse_hw_state(const u8 buf[],
|
|
((buf[0] & 0x04) >> 1) |
|
|
((buf[0] & 0x04) >> 1) |
|
|
((buf[3] & 0x04) >> 2));
|
|
((buf[3] & 0x04) >> 2));
|
|
|
|
|
|
- if ((SYN_CAP_ADV_GESTURE(priv->info.ext_cap_0c) ||
|
|
|
|
- SYN_CAP_IMAGE_SENSOR(priv->info.ext_cap_0c)) &&
|
|
|
|
- hw->w == 2) {
|
|
|
|
|
|
+ if (synaptics_has_agm(priv) && hw->w == 2) {
|
|
synaptics_parse_agm(buf, priv, hw);
|
|
synaptics_parse_agm(buf, priv, hw);
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
@@ -1033,6 +1029,15 @@ static void synaptics_image_sensor_process(struct psmouse *psmouse,
|
|
synaptics_report_mt_data(psmouse, sgm, num_fingers);
|
|
synaptics_report_mt_data(psmouse, sgm, num_fingers);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool synaptics_has_multifinger(struct synaptics_data *priv)
|
|
|
|
+{
|
|
|
|
+ if (SYN_CAP_MULTIFINGER(priv->info.capabilities))
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ /* Advanced gesture mode also sends multi finger data */
|
|
|
|
+ return synaptics_has_agm(priv);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* called for each full received packet from the touchpad
|
|
* called for each full received packet from the touchpad
|
|
*/
|
|
*/
|
|
@@ -1079,7 +1084,7 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
|
if (SYN_CAP_EXTENDED(info->capabilities)) {
|
|
if (SYN_CAP_EXTENDED(info->capabilities)) {
|
|
switch (hw.w) {
|
|
switch (hw.w) {
|
|
case 0 ... 1:
|
|
case 0 ... 1:
|
|
- if (SYN_CAP_MULTIFINGER(info->capabilities))
|
|
|
|
|
|
+ if (synaptics_has_multifinger(priv))
|
|
num_fingers = hw.w + 2;
|
|
num_fingers = hw.w + 2;
|
|
break;
|
|
break;
|
|
case 2:
|
|
case 2:
|
|
@@ -1123,7 +1128,7 @@ static void synaptics_process_packet(struct psmouse *psmouse)
|
|
input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
|
|
input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
|
|
|
|
|
|
input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
|
|
input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
|
|
- if (SYN_CAP_MULTIFINGER(info->capabilities)) {
|
|
|
|
|
|
+ if (synaptics_has_multifinger(priv)) {
|
|
input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
|
|
input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
|
|
input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
|
|
input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3);
|
|
}
|
|
}
|
|
@@ -1283,7 +1288,7 @@ static void set_input_params(struct psmouse *psmouse,
|
|
__set_bit(BTN_TOUCH, dev->keybit);
|
|
__set_bit(BTN_TOUCH, dev->keybit);
|
|
__set_bit(BTN_TOOL_FINGER, dev->keybit);
|
|
__set_bit(BTN_TOOL_FINGER, dev->keybit);
|
|
|
|
|
|
- if (SYN_CAP_MULTIFINGER(info->capabilities)) {
|
|
|
|
|
|
+ if (synaptics_has_multifinger(priv)) {
|
|
__set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
|
|
__set_bit(BTN_TOOL_DOUBLETAP, dev->keybit);
|
|
__set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
|
|
__set_bit(BTN_TOOL_TRIPLETAP, dev->keybit);
|
|
}
|
|
}
|