Patch "Input: ALPS - fix V8+ protocol handling (73 03 28)" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
Input: ALPS - fix V8+ protocol handling (73 03 28)
to the 4.9-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-v8-protocol-handling-73-03-28.patch
and it can be found in the queue-4.9 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
e7348396c6d51b57c95c6646c390cd078e038e19Mon Sep 17 00:00:00 2001
From: Masaki Ota <[email protected]>
Date: Fri, 17 Mar 2017 14:10:57 -0700
Subject: Input: ALPS - fix V8+ protocol handling (73 03 28)
From: Masaki Ota <[email protected]>
commit e7348396c6d51b57c95c6646c390cd078e038e19 upstream.
Devices identified as E7="73 03 28" use slightly modified version of V8 protocol, with lower count per electrode, different offsets, and different feature bits in OTP data.
--- drivers/input/mouse/alps.c | 68 +++++++++++++++++++++++++++++++++------------ drivers/input/mouse/alps.h | 11 +++++++ 2 files changed, 62 insertions(+), 17 deletions(-)
drivers/input/mouse/alps.c +51 -17
@@ -2461,14 +2461,34 @@ static int alps_update_device_area_ss4_vint num_y_electrode;int x_pitch, y_pitch, x_phys, y_phys; - num_x_electrode =SS4_NUMSENSOR_XOFFSET + (otp[1 ][0 ] &0x0F ); - num_y_electrode =SS4_NUMSENSOR_YOFFSET + ((otp[1 ][0 ] >>4 ) &0x0F ); +if (IS_SS4PLUS_DEV (priv->dev_id)) { + num_x_electrode = +SS4PLUS_NUMSENSOR_XOFFSET + (otp[0 ][2 ] &0x0F ); + num_y_electrode = +SS4PLUS_NUMSENSOR_YOFFSET + ((otp[0 ][2 ] >>4 ) &0x0F ); + + priv->x_max = + (num_x_electrode -1 ) *SS4PLUS_COUNT_PER_ELECTRODE ; + priv->y_max = + (num_y_electrode -1 ) *SS4PLUS_COUNT_PER_ELECTRODE ; + + x_pitch = (otp[0 ][1 ] &0x0F ) +SS4PLUS_MIN_PITCH_MM ; + y_pitch = ((otp[0 ][1 ] >>4 ) &0x0F ) +SS4PLUS_MIN_PITCH_MM ; + + }else { + num_x_electrode = +SS4_NUMSENSOR_XOFFSET + (otp[1 ][0 ] &0x0F ); + num_y_electrode = +SS4_NUMSENSOR_YOFFSET + ((otp[1 ][0 ] >>4 ) &0x0F ); + + priv->x_max = + (num_x_electrode -1 ) *SS4_COUNT_PER_ELECTRODE ; + priv->y_max = + (num_y_electrode -1 ) *SS4_COUNT_PER_ELECTRODE ; - priv->x_max = (num_x_electrode -1 ) *SS4_COUNT_PER_ELECTRODE ; - priv->y_max = (num_y_electrode -1 ) *SS4_COUNT_PER_ELECTRODE ; - - x_pitch = ((otp[1 ][2 ] >>2 ) &0x07 ) +SS4_MIN_PITCH_MM ; - y_pitch = ((otp[1 ][2 ] >>5 ) &0x07 ) +SS4_MIN_PITCH_MM ; + x_pitch = ((otp[1 ][2 ] >>2 ) &0x07 ) +SS4_MIN_PITCH_MM ; + y_pitch = ((otp[1 ][2 ] >>5 ) &0x07 ) +SS4_MIN_PITCH_MM ; + } x_phys = x_pitch * (num_x_electrode -1 );/* In 0.1 mm units */ y_phys = y_pitch * (num_y_electrode -1 );/* In 0.1 mm units */
@@ -2484,7 +2504,10 @@ static int alps_update_btn_info_ss4_v2(u {unsigned char is_btnless; - is_btnless = (otp[1 ][1 ] >>3 ) &0x01 ; +if (IS_SS4PLUS_DEV (priv->dev_id)) + is_btnless = (otp[1 ][0 ] >>1 ) &0x01 ; +else + is_btnless = (otp[1 ][1 ] >>3 ) &0x01 ;if (is_btnless) priv->flags |=ALPS_BUTTONPAD ;
@@ -2492,6 +2515,21 @@ static int alps_update_btn_info_ss4_v2(ureturn 0 ; } +static int alps_update_dual_info_ss4_v2 (unsigned char otp[][4 ], +struct alps_data *priv) +{ +bool is_dual = false; + +if (IS_SS4PLUS_DEV (priv->dev_id)) + is_dual = (otp[0 ][0 ] >>4 ) &0x01 ; + +if (is_dual) + priv->flags |=ALPS_DUALPOINT | +ALPS_DUALPOINT_WITH_PRESSURE ; + +return 0 ; +} +static int alps_set_defaults_ss4_v2 (struct psmouse *psmouse,struct alps_data *priv) {
@@ -2507,6 +2545,8 @@ static int alps_set_defaults_ss4_v2(strualps_update_btn_info_ss4_v2 (otp, priv); +alps_update_dual_info_ss4_v2 (otp, priv); +return 0 ; }
@@ -2752,10 +2792,6 @@ static int alps_set_protocol(struct psmoif (alps_set_defaults_ss4_v2 (psmouse, priv))return -EIO ; -if (priv->fw_ver[1 ] ==0x1 ) - priv->flags |=ALPS_DUALPOINT | -ALPS_DUALPOINT_WITH_PRESSURE ; -break ; }
@@ -2826,10 +2862,7 @@ static int alps_identify(struct psmouse ec[2] >= 0x90 && ec[2] <= 0x9d) { protocol = &alps_v3_protocol_data; } else if (e7[0] == 0x73 && e7[1] == 0x03 && - e7[2] == 0x14 && ec[1] == 0x02) { - protocol = &alps_v8_protocol_data; - } else if (e7[0] == 0x73 && e7[1] == 0x03 && - e7[2] == 0x28 && ec[1] == 0x01) { + (e7[2] == 0x14 || e7[2] == 0x28)) { protocol = &alps_v8_protocol_data; } else { psmouse_dbg(psmouse,
@@ -2839,7 +2872,8 @@ static int alps_identify(struct psmouse }if (priv) { -/* Save the Firmware version */ +/* Save Device ID and Firmware version */ +memcpy (priv->dev_id, e7,3 );memcpy (priv->fw_ver, ec,3 ); error =alps_set_protocol (psmouse, priv, protocol);if (error)
drivers/input/mouse/alps.h +11 -0
@@ -54,6 +54,16 @@ enum SS4_PACKET_ID {#define SS4_MASK_NORMAL_BUTTONS 0x07 +#define SS4PLUS_COUNT_PER_ELECTRODE 128 +#define SS4PLUS_NUMSENSOR_XOFFSET 16 +#define SS4PLUS_NUMSENSOR_YOFFSET 5 +#define SS4PLUS_MIN_PITCH_MM 37 + +#define IS_SS4PLUS_DEV (_b) (((_b[0]) == 0x73) && \ + ((_b[1]) == 0x03) && \ + ((_b[2]) == 0x28) \ + ) +#define SS4_1F_X_V2 (_b) ((_b[0] & 0x0007) | \ ((_b[1] << 3) & 0x0078) | \ ((_b[1] << 2) & 0x0380) | \
@@ -263,6 +273,7 @@ struct alps_data {int addr_command;u16 proto_version;u8 byte0, mask0; +u8 dev_id[3 ];u8 fw_ver[3 ];int flags;int x_max;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/input-alps-fix-v8-protocol-handling-73-03-28.patch queue-4.9/input-alps-fix-trackstick-button-handling-on-v8-devices.patch