Patch "Input: ALPS - fix two-finger scroll breakage in right side on ALPS touchpad" has been added to the 4.12-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
Input: ALPS - fix two-finger scroll breakage in right side on ALPS touchpad
to the 4.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
input-alps-fix-two-finger-scroll-breakage-in-right-side-on-alps-touchpad.patch
and it can be found in the queue-4.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4a646580f793d19717f7e034c8d473b509c27d49Mon Sep 17 00:00:00 2001
From: Masaki Ota <[email protected]>
Date: Thu, 24 Aug 2017 15:44:36 -0700
Subject: Input: ALPS - fix two-finger scroll breakage in right side on ALPS touchpad
From: Masaki Ota <[email protected]>
commit 4a646580f793d19717f7e034c8d473b509c27d49 upstream.
Fixed the issue that two finger scroll does not work correctly on V8 protocol. The cause is that V8 protocol X-coordinate decode is wrong at SS4 PLUS device. I added SS4 PLUS X decode definition.
Mote notes:
the problem manifests itself by the commit e7348396c6d5 ("Input: ALPS
- fix V8+ protocol handling (73 03 28)"), where a fix for the V8+ protocol was applied. Although the culprit must have been present beforehand, the two-finger scroll worked casually even with the wrongly reported values by some reason. It got broken by the commit above just because it changed x_max value, and this made libinput correctly figuring the MT events. Since the X coord is reported as falsely doubled, the events on the right-half side go outside the boundary, thus they are no longer handled. This resulted as a broken two-finger scroll.
One finger event is decoded differently, and it didn't suffer from this problem. The problem was only about MT events. --tiwai
--- drivers/input/mouse/alps.c | 41 +++++++++++++++++++++++++++++++---------- drivers/input/mouse/alps.h | 8 ++++++++ 2 files changed, 39 insertions(+), 10 deletions(-)
drivers/input/mouse/alps.c +31 -10
@@ -1215,14 +1215,24 @@ static int alps_decode_ss4_v2(struct alpcase SS4_PACKET_ID_TWO :if (priv->flags &ALPS_BUTTONPAD ) { - f->mt[0 ].x =SS4_BTL_MF_X_V2 (p,0 ); +if (IS_SS4PLUS_DEV (priv->dev_id)) { + f->mt[0 ].x =SS4_PLUS_BTL_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_PLUS_BTL_MF_X_V2 (p,1 ); + }else { + f->mt[0 ].x =SS4_BTL_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_BTL_MF_X_V2 (p,1 ); + } f->mt[0 ].y =SS4_BTL_MF_Y_V2 (p,0 ); - f->mt[1 ].x =SS4_BTL_MF_X_V2 (p,1 ); f->mt[1 ].y =SS4_BTL_MF_Y_V2 (p,1 ); }else { - f->mt[0 ].x =SS4_STD_MF_X_V2 (p,0 ); +if (IS_SS4PLUS_DEV (priv->dev_id)) { + f->mt[0 ].x =SS4_PLUS_STD_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_PLUS_STD_MF_X_V2 (p,1 ); + }else { + f->mt[0 ].x =SS4_STD_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_STD_MF_X_V2 (p,1 ); + } f->mt[0 ].y =SS4_STD_MF_Y_V2 (p,0 ); - f->mt[1 ].x =SS4_STD_MF_X_V2 (p,1 ); f->mt[1 ].y =SS4_STD_MF_Y_V2 (p,1 ); } f->pressure =SS4_MF_Z_V2 (p,0 ) ?0x30 :0 ;
@@ -1239,16 +1249,27 @@ static int alps_decode_ss4_v2(struct alpcase SS4_PACKET_ID_MULTI :if (priv->flags &ALPS_BUTTONPAD ) { - f->mt[2 ].x =SS4_BTL_MF_X_V2 (p,0 ); +if (IS_SS4PLUS_DEV (priv->dev_id)) { + f->mt[0 ].x =SS4_PLUS_BTL_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_PLUS_BTL_MF_X_V2 (p,1 ); + }else { + f->mt[2 ].x =SS4_BTL_MF_X_V2 (p,0 ); + f->mt[3 ].x =SS4_BTL_MF_X_V2 (p,1 ); + } + f->mt[2 ].y =SS4_BTL_MF_Y_V2 (p,0 ); - f->mt[3 ].x =SS4_BTL_MF_X_V2 (p,1 ); f->mt[3 ].y =SS4_BTL_MF_Y_V2 (p,1 ); no_data_x =SS4_MFPACKET_NO_AX_BL ; no_data_y =SS4_MFPACKET_NO_AY_BL ; }else { - f->mt[2 ].x =SS4_STD_MF_X_V2 (p,0 ); +if (IS_SS4PLUS_DEV (priv->dev_id)) { + f->mt[0 ].x =SS4_PLUS_STD_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_PLUS_STD_MF_X_V2 (p,1 ); + }else { + f->mt[0 ].x =SS4_STD_MF_X_V2 (p,0 ); + f->mt[1 ].x =SS4_STD_MF_X_V2 (p,1 ); + } f->mt[2 ].y =SS4_STD_MF_Y_V2 (p,0 ); - f->mt[3 ].x =SS4_STD_MF_X_V2 (p,1 ); f->mt[3 ].y =SS4_STD_MF_Y_V2 (p,1 ); no_data_x =SS4_MFPACKET_NO_AX ; no_data_y =SS4_MFPACKET_NO_AY ;
@@ -2541,8 +2562,8 @@ static int alps_set_defaults_ss4_v2(strumemset (otp,0 ,sizeof (otp)); -if (alps_get_otp_values_ss4_v2 (psmouse,0 , &otp[0 ][0 ]) || -alps_get_otp_values_ss4_v2 (psmouse,1 , &otp[1 ][0 ])) +if (alps_get_otp_values_ss4_v2 (psmouse,1 , &otp[1 ][0 ]) || +alps_get_otp_values_ss4_v2 (psmouse,0 , &otp[0 ][0 ]))return -1 ;alps_update_device_area_ss4_v2 (otp, priv);
drivers/input/mouse/alps.h +8 -0
@@ -100,6 +100,10 @@ enum SS4_PACKET_ID { ((_b[1 + _i * 3] << 5) & 0x1F00) \ ) +#define SS4_PLUS_STD_MF_X_V2 (_b, _i) (((_b[0 + (_i) * 3] << 4) & 0x0070) | \ + ((_b[1 + (_i) * 3] << 4) & 0x0F80) \ + ) +#define SS4_STD_MF_Y_V2 (_b, _i) (((_b[1 + (_i) * 3] << 3) & 0x0010) | \ ((_b[2 + (_i) * 3] << 5) & 0x01E0) | \ ((_b[2 + (_i) * 3] << 4) & 0x0E00) \
@@ -109,6 +113,10 @@ enum SS4_PACKET_ID { ((_b[0 + (_i) * 3] >> 3) & 0x0010) \ ) +#define SS4_PLUS_BTL_MF_X_V2 (_b, _i) (SS4_PLUS_STD_MF_X_V2(_b, _i) | \ + ((_b[0 + (_i) * 3] >> 4) & 0x0008) \ + ) +#define SS4_BTL_MF_Y_V2 (_b, _i) (SS4_STD_MF_Y_V2(_b, _i) | \ ((_b[0 + (_i) * 3] >> 3) & 0x0008) \ )
Patches currently in stable-queue which might be from [email protected] are
queue-4.12/input-alps-fix-two-finger-scroll-breakage-in-right-side-on-alps-touchpad.patch