@@ -647,11 +647,16 @@ static void synaptics_process_hw_state(struct synaptics_data *priv,
new_num_fingers = 1;
else if (sgm->w == 0)
new_num_fingers = 2;
- else if (sgm->w == 1)
- new_num_fingers = 3;
+ else if (sgm->w == 1) {
+ if (agm->finger_count > 3)
+ new_num_fingers = agm->finger_count;
+ else
+ new_num_fingers = 3;
+ }
if (new_num_fingers == 0) {
synaptics_update_slots(priv, 0, 0, 0);
+ synaptics_agm_finger_update(priv, 0, 0, 0);
goto process_mt_data_done;
}
@@ -661,6 +666,7 @@ static void synaptics_process_hw_state(struct synaptics_data *priv,
*/
if (priv->agm_pending && agm->z == 0) {
synaptics_update_slots(priv, 1, 0, 0);
+ synaptics_agm_finger_update(priv, 0, 0, 0);
goto process_mt_data_done;
}
@@ -720,6 +726,11 @@ static void synaptics_process_hw_state(struct synaptics_data *priv,
*/
synaptics_update_slots(priv, 0, 0, 0);
break;
+
+ case 4:
+ case 5:
+ synaptics_update_slots(priv, 1, agm->finger_sgm, 0);
+ break;
}
break;
@@ -761,6 +772,12 @@ static void synaptics_process_hw_state(struct synaptics_data *priv,
*/
synaptics_update_slots(priv, 0, 0, 0);
break;
+
+ case 4:
+ case 5:
+ synaptics_update_slots(priv, 2, agm->finger_sgm,
+ agm->finger_agm);
+ break;
}
break;
@@ -800,8 +817,20 @@ static void synaptics_process_hw_state(struct synaptics_data *priv,
slot_agm = slot_sgm + 2;
synaptics_update_slots(priv, 3, slot_sgm, slot_agm);
break;
+
+ case 4:
+ case 5:
+ synaptics_update_slots(priv, 3, agm->finger_sgm,
+ agm->finger_agm);
+ break;
}
break;
+
+ case 4:
+ case 5:
+ synaptics_update_slots(priv, agm->finger_count, agm->finger_sgm,
+ agm->finger_agm);
+ break;
}
process_mt_data_done: