Skip to content

Commit 9768935

Browse files
aduggan-synadtor
authored andcommitted
Input: synaptics-rmi4 - only read the F54 query registers which are used
The F54 driver is currently only using the first 6 bytes of F54 so there is no need to read all 27 bytes. Some Dell systems (Dell XP13 9333 and similar) have an issue with the touchpad or I2C bus when reading reports larger then 16 bytes. Reads larger then 16 bytes are reported in two HID reports. Something about the back to back reports seems to cause the next read to report incorrect data. This results in F30 failing to load and the click button failing to work. Previous issues with the I2C controller or touchpad were addressed in: commit 5b65c2a ("HID: rmi: check sanity of the incoming report") Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=195949 Signed-off-by: Andrew Duggan <aduggan@synaptics.com> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Reviewed-by: Nick Dyer <nick@shmanahar.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
1 parent 817ae46 commit 9768935

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

drivers/input/rmi4/rmi_f54.c

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@
3131
#define F54_GET_REPORT 1
3232
#define F54_FORCE_CAL 2
3333

34-
/* Fixed sizes of reports */
35-
#define F54_QUERY_LEN 27
36-
3734
/* F54 capabilities */
3835
#define F54_CAP_BASELINE (1 << 2)
3936
#define F54_CAP_IMAGE8 (1 << 3)
@@ -95,7 +92,6 @@ struct rmi_f54_reports {
9592
struct f54_data {
9693
struct rmi_function *fn;
9794

98-
u8 qry[F54_QUERY_LEN];
9995
u8 num_rx_electrodes;
10096
u8 num_tx_electrodes;
10197
u8 capabilities;
@@ -632,22 +628,23 @@ static int rmi_f54_detect(struct rmi_function *fn)
632628
{
633629
int error;
634630
struct f54_data *f54;
631+
u8 buf[6];
635632

636633
f54 = dev_get_drvdata(&fn->dev);
637634

638635
error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr,
639-
&f54->qry, sizeof(f54->qry));
636+
buf, sizeof(buf));
640637
if (error) {
641638
dev_err(&fn->dev, "%s: Failed to query F54 properties\n",
642639
__func__);
643640
return error;
644641
}
645642

646-
f54->num_rx_electrodes = f54->qry[0];
647-
f54->num_tx_electrodes = f54->qry[1];
648-
f54->capabilities = f54->qry[2];
649-
f54->clock_rate = f54->qry[3] | (f54->qry[4] << 8);
650-
f54->family = f54->qry[5];
643+
f54->num_rx_electrodes = buf[0];
644+
f54->num_tx_electrodes = buf[1];
645+
f54->capabilities = buf[2];
646+
f54->clock_rate = buf[3] | (buf[4] << 8);
647+
f54->family = buf[5];
651648

652649
rmi_dbg(RMI_DEBUG_FN, &fn->dev, "F54 num_rx_electrodes: %d\n",
653650
f54->num_rx_electrodes);

0 commit comments

Comments
 (0)