Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b97eb66 authored by Caleb Connolly's avatar Caleb Connolly Committed by Greg Kroah-Hartman
Browse files

Input: s6sy761 - fix coordinate read bit shift



commit 30b3f68715595dee7fe4d9bd91a2252c3becdf0a upstream.

The touch coordinate register contains the following:

        byte 3             byte 2             byte 1
+--------+--------+ +-----------------+ +-----------------+
|        |        | |                 | |                 |
| X[3:0] | Y[3:0] | |     Y[11:4]     | |     X[11:4]     |
|        |        | |                 | |                 |
+--------+--------+ +-----------------+ +-----------------+

Bytes 2 and 1 need to be shifted left by 4 bits, the least significant
nibble of each is stored in byte 3. Currently they are only
being shifted by 3 causing the reported coordinates to be incorrect.

This matches downstream examples, and has been confirmed on my
device (OnePlus 7 Pro).

Fixes: 0145a714 ("Input: add support for the Samsung S6SY761 touchscreen")
Signed-off-by: default avatarCaleb Connolly <caleb@connolly.tech>
Reviewed-by: default avatarAndi Shyti <andi@etezian.org>
Link: https://lore.kernel.org/r/20210305185710.225168-1-caleb@connolly.tech


Cc: stable@vger.kernel.org
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a7f17216
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -145,8 +145,8 @@ static void s6sy761_report_coordinates(struct s6sy761_data *sdata,
	u8 major = event[4];
	u8 major = event[4];
	u8 minor = event[5];
	u8 minor = event[5];
	u8 z = event[6] & S6SY761_MASK_Z;
	u8 z = event[6] & S6SY761_MASK_Z;
	u16 x = (event[1] << 3) | ((event[3] & S6SY761_MASK_X) >> 4);
	u16 x = (event[1] << 4) | ((event[3] & S6SY761_MASK_X) >> 4);
	u16 y = (event[2] << 3) | (event[3] & S6SY761_MASK_Y);
	u16 y = (event[2] << 4) | (event[3] & S6SY761_MASK_Y);


	input_mt_slot(sdata->input, tid);
	input_mt_slot(sdata->input, tid);