Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: synaptics-rmi4 - add parameters for dribble packets and palm detect gesture

The rmi_f11 driver currently disables dribble packets and the palm detect
gesture for all devices. This patch creates a parameter in the 2d sensor
platform data for controlling this functionality on a per device basis.

For more information on dribble packets:
Commit 05ba999fcabb ("HID: rmi: disable dribble packets on Synaptics
touchpads")

For more information on the palm detect gesture:
Commit f097deef59a6 ("HID: rmi: disable palm detect gesture when present")

Signed-off-by: Andrew Duggan <aduggan@synaptics.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Andrew Duggan and committed by
Dmitry Torokhov
2775e523 6d0dbeae

+46 -15
+2
drivers/input/rmi4/rmi_2d_sensor.h
··· 67 67 u8 report_rel; 68 68 u8 x_mm; 69 69 u8 y_mm; 70 + enum rmi_reg_state dribble; 71 + enum rmi_reg_state palm_detect; 70 72 }; 71 73 72 74 int rmi_2d_sensor_of_probe(struct device *dev,
+3 -3
drivers/input/rmi4/rmi_f01.c
··· 327 327 } 328 328 329 329 switch (pdata->power_management.nosleep) { 330 - case RMI_F01_NOSLEEP_DEFAULT: 330 + case RMI_REG_STATE_DEFAULT: 331 331 break; 332 - case RMI_F01_NOSLEEP_OFF: 332 + case RMI_REG_STATE_OFF: 333 333 f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT; 334 334 break; 335 - case RMI_F01_NOSLEEP_ON: 335 + case RMI_REG_STATE_ON: 336 336 f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT; 337 337 break; 338 338 }
+28 -4
drivers/input/rmi4/rmi_f11.c
··· 1142 1142 sensor->topbuttonpad = f11->sensor_pdata.topbuttonpad; 1143 1143 sensor->kernel_tracking = f11->sensor_pdata.kernel_tracking; 1144 1144 sensor->dmax = f11->sensor_pdata.dmax; 1145 + sensor->dribble = f11->sensor_pdata.dribble; 1146 + sensor->palm_detect = f11->sensor_pdata.palm_detect; 1145 1147 1146 1148 if (f11->sens_query.has_physical_props) { 1147 1149 sensor->x_mm = f11->sens_query.x_sensor_size_mm; ··· 1211 1209 ctrl->ctrl0_11[RMI_F11_DELTA_Y_THRESHOLD] = 1212 1210 sensor->axis_align.delta_y_threshold; 1213 1211 1214 - if (f11->sens_query.has_dribble) 1215 - ctrl->ctrl0_11[0] = ctrl->ctrl0_11[0] & ~BIT(6); 1212 + if (f11->sens_query.has_dribble) { 1213 + switch (sensor->dribble) { 1214 + case RMI_REG_STATE_OFF: 1215 + ctrl->ctrl0_11[0] &= ~BIT(6); 1216 + break; 1217 + case RMI_REG_STATE_ON: 1218 + ctrl->ctrl0_11[0] |= BIT(6); 1219 + break; 1220 + case RMI_REG_STATE_DEFAULT: 1221 + default: 1222 + break; 1223 + } 1224 + } 1216 1225 1217 - if (f11->sens_query.has_palm_det) 1218 - ctrl->ctrl0_11[11] = ctrl->ctrl0_11[11] & ~BIT(0); 1226 + if (f11->sens_query.has_palm_det) { 1227 + switch (sensor->palm_detect) { 1228 + case RMI_REG_STATE_OFF: 1229 + ctrl->ctrl0_11[11] &= ~BIT(0); 1230 + break; 1231 + case RMI_REG_STATE_ON: 1232 + ctrl->ctrl0_11[11] |= BIT(0); 1233 + break; 1234 + case RMI_REG_STATE_DEFAULT: 1235 + default: 1236 + break; 1237 + } 1238 + } 1219 1239 1220 1240 rc = f11_write_control_regs(fn, &f11->sens_query, 1221 1241 &f11->dev_controls, fn->fd.query_base_addr);
+13 -8
include/linux/rmi.h
··· 99 99 bool topbuttonpad; 100 100 bool kernel_tracking; 101 101 int dmax; 102 + int dribble; 103 + int palm_detect; 102 104 }; 103 105 104 106 /** ··· 118 116 bool disable; 119 117 }; 120 118 121 - /** 122 - * struct rmi_f01_power - override default power management settings. 123 - * 119 + 120 + /* 121 + * Set the state of a register 122 + * DEFAULT - use the default value set by the firmware config 123 + * OFF - explicitly disable the register 124 + * ON - explicitly enable the register 124 125 */ 125 - enum rmi_f01_nosleep { 126 - RMI_F01_NOSLEEP_DEFAULT = 0, 127 - RMI_F01_NOSLEEP_OFF = 1, 128 - RMI_F01_NOSLEEP_ON = 2 126 + enum rmi_reg_state { 127 + RMI_REG_STATE_DEFAULT = 0, 128 + RMI_REG_STATE_OFF = 1, 129 + RMI_REG_STATE_ON = 2 129 130 }; 130 131 131 132 /** ··· 148 143 * when the touch sensor is in doze mode, in units of 10ms. 149 144 */ 150 145 struct rmi_f01_power_management { 151 - enum rmi_f01_nosleep nosleep; 146 + enum rmi_reg_state nosleep; 152 147 u8 wakeup_threshold; 153 148 u8 doze_holdoff; 154 149 u8 doze_interval;