Skip to content

Commit 9e44163

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
Pull input fixes from Dmitry Torokhov: "Updates for the input subsystem - two more tweaks for ALPS driver to work out kinks after splitting the touchpad, trackstick, and potential external PS/2 mouse into separate input devices. Changes to support ALPS SS4 devices (protocol V8) will be coming in 4.1..." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: alps - document stick behavior for protocol V2 Input: alps - report V2 Dualpoint Stick events via the right evdev node Input: alps - report interleaved bare PS/2 packets via dev3
2 parents f8b3d8a + 58d8a3b commit 9e44163

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

Documentation/input/alps.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ ALPS Absolute Mode - Protocol Version 2
114114
byte 4: 0 y6 y5 y4 y3 y2 y1 y0
115115
byte 5: 0 z6 z5 z4 z3 z2 z1 z0
116116

117+
Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
118+
the DualPoint Stick.
119+
117120
Dualpoint device -- interleaved packet format
118121
---------------------------------------------
119122

@@ -127,6 +130,11 @@ Dualpoint device -- interleaved packet format
127130
byte 7: 0 y6 y5 y4 y3 y2 y1 y0
128131
byte 8: 0 z6 z5 z4 z3 z2 z1 z0
129132

133+
Devices which use the interleaving format normally send standard PS/2 mouse
134+
packets for the DualPoint Stick + ALPS Absolute Mode packets for the
135+
touchpad, switching to the interleaved packet format when both the stick and
136+
the touchpad are used at the same time.
137+
130138
ALPS Absolute Mode - Protocol Version 3
131139
---------------------------------------
132140

drivers/input/mouse/alps.c

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,10 +1154,28 @@ static void alps_register_bare_ps2_mouse(struct work_struct *work)
11541154
mutex_unlock(&alps_mutex);
11551155
}
11561156

1157-
static void alps_report_bare_ps2_packet(struct input_dev *dev,
1157+
static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
11581158
unsigned char packet[],
11591159
bool report_buttons)
11601160
{
1161+
struct alps_data *priv = psmouse->private;
1162+
struct input_dev *dev;
1163+
1164+
/* Figure out which device to use to report the bare packet */
1165+
if (priv->proto_version == ALPS_PROTO_V2 &&
1166+
(priv->flags & ALPS_DUALPOINT)) {
1167+
/* On V2 devices the DualPoint Stick reports bare packets */
1168+
dev = priv->dev2;
1169+
} else if (unlikely(IS_ERR_OR_NULL(priv->dev3))) {
1170+
/* Register dev3 mouse if we received PS/2 packet first time */
1171+
if (!IS_ERR(priv->dev3))
1172+
psmouse_queue_work(psmouse, &priv->dev3_register_work,
1173+
0);
1174+
return;
1175+
} else {
1176+
dev = priv->dev3;
1177+
}
1178+
11611179
if (report_buttons)
11621180
alps_report_buttons(dev, NULL,
11631181
packet[0] & 1, packet[0] & 2, packet[0] & 4);
@@ -1232,8 +1250,8 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
12321250
* de-synchronization.
12331251
*/
12341252

1235-
alps_report_bare_ps2_packet(priv->dev2,
1236-
&psmouse->packet[3], false);
1253+
alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3],
1254+
false);
12371255

12381256
/*
12391257
* Continue with the standard ALPS protocol handling,
@@ -1289,18 +1307,9 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
12891307
* properly we only do this if the device is fully synchronized.
12901308
*/
12911309
if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) {
1292-
1293-
/* Register dev3 mouse if we received PS/2 packet first time */
1294-
if (unlikely(!priv->dev3))
1295-
psmouse_queue_work(psmouse,
1296-
&priv->dev3_register_work, 0);
1297-
12981310
if (psmouse->pktcnt == 3) {
1299-
/* Once dev3 mouse device is registered report data */
1300-
if (likely(!IS_ERR_OR_NULL(priv->dev3)))
1301-
alps_report_bare_ps2_packet(priv->dev3,
1302-
psmouse->packet,
1303-
true);
1311+
alps_report_bare_ps2_packet(psmouse, psmouse->packet,
1312+
true);
13041313
return PSMOUSE_FULL_PACKET;
13051314
}
13061315
return PSMOUSE_GOOD_DATA;

0 commit comments

Comments
 (0)