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
This commit is contained in:
commit
9e441639d1
|
@ -114,6 +114,9 @@ ALPS Absolute Mode - Protocol Version 2
|
||||||
byte 4: 0 y6 y5 y4 y3 y2 y1 y0
|
byte 4: 0 y6 y5 y4 y3 y2 y1 y0
|
||||||
byte 5: 0 z6 z5 z4 z3 z2 z1 z0
|
byte 5: 0 z6 z5 z4 z3 z2 z1 z0
|
||||||
|
|
||||||
|
Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for
|
||||||
|
the DualPoint Stick.
|
||||||
|
|
||||||
Dualpoint device -- interleaved packet format
|
Dualpoint device -- interleaved packet format
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
|
|
||||||
|
@ -127,6 +130,11 @@ Dualpoint device -- interleaved packet format
|
||||||
byte 7: 0 y6 y5 y4 y3 y2 y1 y0
|
byte 7: 0 y6 y5 y4 y3 y2 y1 y0
|
||||||
byte 8: 0 z6 z5 z4 z3 z2 z1 z0
|
byte 8: 0 z6 z5 z4 z3 z2 z1 z0
|
||||||
|
|
||||||
|
Devices which use the interleaving format normally send standard PS/2 mouse
|
||||||
|
packets for the DualPoint Stick + ALPS Absolute Mode packets for the
|
||||||
|
touchpad, switching to the interleaved packet format when both the stick and
|
||||||
|
the touchpad are used at the same time.
|
||||||
|
|
||||||
ALPS Absolute Mode - Protocol Version 3
|
ALPS Absolute Mode - Protocol Version 3
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -1154,10 +1154,28 @@ out:
|
||||||
mutex_unlock(&alps_mutex);
|
mutex_unlock(&alps_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void alps_report_bare_ps2_packet(struct input_dev *dev,
|
static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
|
||||||
unsigned char packet[],
|
unsigned char packet[],
|
||||||
bool report_buttons)
|
bool report_buttons)
|
||||||
{
|
{
|
||||||
|
struct alps_data *priv = psmouse->private;
|
||||||
|
struct input_dev *dev;
|
||||||
|
|
||||||
|
/* Figure out which device to use to report the bare packet */
|
||||||
|
if (priv->proto_version == ALPS_PROTO_V2 &&
|
||||||
|
(priv->flags & ALPS_DUALPOINT)) {
|
||||||
|
/* On V2 devices the DualPoint Stick reports bare packets */
|
||||||
|
dev = priv->dev2;
|
||||||
|
} else if (unlikely(IS_ERR_OR_NULL(priv->dev3))) {
|
||||||
|
/* Register dev3 mouse if we received PS/2 packet first time */
|
||||||
|
if (!IS_ERR(priv->dev3))
|
||||||
|
psmouse_queue_work(psmouse, &priv->dev3_register_work,
|
||||||
|
0);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
dev = priv->dev3;
|
||||||
|
}
|
||||||
|
|
||||||
if (report_buttons)
|
if (report_buttons)
|
||||||
alps_report_buttons(dev, NULL,
|
alps_report_buttons(dev, NULL,
|
||||||
packet[0] & 1, packet[0] & 2, packet[0] & 4);
|
packet[0] & 1, packet[0] & 2, packet[0] & 4);
|
||||||
|
@ -1232,8 +1250,8 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse)
|
||||||
* de-synchronization.
|
* de-synchronization.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
alps_report_bare_ps2_packet(priv->dev2,
|
alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3],
|
||||||
&psmouse->packet[3], false);
|
false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Continue with the standard ALPS protocol handling,
|
* Continue with the standard ALPS protocol handling,
|
||||||
|
@ -1289,18 +1307,9 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)
|
||||||
* properly we only do this if the device is fully synchronized.
|
* properly we only do this if the device is fully synchronized.
|
||||||
*/
|
*/
|
||||||
if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) {
|
if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) {
|
||||||
|
|
||||||
/* Register dev3 mouse if we received PS/2 packet first time */
|
|
||||||
if (unlikely(!priv->dev3))
|
|
||||||
psmouse_queue_work(psmouse,
|
|
||||||
&priv->dev3_register_work, 0);
|
|
||||||
|
|
||||||
if (psmouse->pktcnt == 3) {
|
if (psmouse->pktcnt == 3) {
|
||||||
/* Once dev3 mouse device is registered report data */
|
alps_report_bare_ps2_packet(psmouse, psmouse->packet,
|
||||||
if (likely(!IS_ERR_OR_NULL(priv->dev3)))
|
true);
|
||||||
alps_report_bare_ps2_packet(priv->dev3,
|
|
||||||
psmouse->packet,
|
|
||||||
true);
|
|
||||||
return PSMOUSE_FULL_PACKET;
|
return PSMOUSE_FULL_PACKET;
|
||||||
}
|
}
|
||||||
return PSMOUSE_GOOD_DATA;
|
return PSMOUSE_GOOD_DATA;
|
||||||
|
|
Loading…
Reference in New Issue