@@ -104,6 +104,11 @@ static const struct alps_nibble_commands alps_v6_nibble_commands[] = {
#define ALPS_STICK_BITS 0x100 /* separate stick button bits */
#define ALPS_BUTTONPAD 0x200 /* device is a clickpad */
+/*
+ * Button-pad and some other SS4 V2 devices use an alternative position decoding
+*/
+#define ALPS_SS4_V2_ALT_DECODING 0x400
+
static const struct alps_model_info alps_model_data[] = {
{ { 0x32, 0x02, 0x14 }, 0x00, { ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT } }, /* Toshiba Salellite Pro M10 */
{ { 0x33, 0x02, 0x0a }, 0x00, { ALPS_PROTO_V1, 0x88, 0xf8, 0 } }, /* UMAX-530T */
@@ -1191,7 +1196,7 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
break;
case SS4_PACKET_ID_TWO:
- if (priv->flags & ALPS_BUTTONPAD) {
+ if (priv->flags & ALPS_SS4_V2_ALT_DECODING) {
f->mt[0].x = SS4_BTL_MF_X_V2(p, 0);
f->mt[0].y = SS4_BTL_MF_Y_V2(p, 0);
f->mt[1].x = SS4_BTL_MF_X_V2(p, 1);
@@ -1215,7 +1220,7 @@ static int alps_decode_ss4_v2(struct alps_fields *f,
break;
case SS4_PACKET_ID_MULTI:
- if (priv->flags & ALPS_BUTTONPAD) {
+ if (priv->flags & ALPS_SS4_V2_ALT_DECODING) {
f->mt[2].x = SS4_BTL_MF_X_V2(p, 0);
f->mt[2].y = SS4_BTL_MF_Y_V2(p, 0);
f->mt[3].x = SS4_BTL_MF_X_V2(p, 1);
@@ -2429,8 +2434,9 @@ static int alps_update_btn_info_ss4_v2(unsigned char otp[][4],
is_btnless = (otp[1][1] >> 3) & 0x01;
+ /* buttonless devices also use the alternative position decoding */
if (is_btnless)
- priv->flags |= ALPS_BUTTONPAD;
+ priv->flags |= ALPS_BUTTONPAD | ALPS_SS4_V2_ALT_DECODING;
return 0;
}