Message ID | 20150820213526.GA10980@localhost (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Dmitry, On Thu, Aug 20, 2015 at 11:35 PM, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > On Thu, Aug 20, 2015 at 10:50:27PM +0200, Gabor Balla wrote: [...] >> At some point a new PS/2 mode was introduced by Synaptics, called EWmode. This >> can be enabled by setting bit 2 of the mode byte. But previously this bit was >> used for 'Disable Gesture', whatever that stands for, and it was reused for >> selecting EWmode. Now if plain Wmode is selected, with bit 0 of the mode byte, >> than disable gesture is on by default and bit 2 selects EWmode instead. >> >> Reference: >> http://www.synaptics.com/sites/default/files/511-000275-01_RevB.pdf [...] >> A quick fix follows: [...] > > It looks like the patch "direction" is reverted. Also, the presence of > extended capabilities is not the indication that gesture mode should not > be used: in relative mode bit 2 disables gesture reporting, in absolute > mode it enables Extended W-mode. > > Does the patch below also work for you? If I'm not mistaken, the function of bit 2 depends on the state of W mode rather than absolute vs relative mode. From page 40 of the PDF: "If the Wmode bit is not set (0), then Gesture is reported and bit 2 refers to DisGest. (..) When this bit is 1, the Relative mode mouse packet reports the true physical button states, and the Absolute mode packet’s Gesture bit always reports as zero." So it still has a meaning in absolute mode, when Wmode is disabled. I've tried the patch, it works, but I don't believe it's correct. Sorry for the reversed patch, I'm not really experienced with making patches. Regards, Gabor -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 28daca1..97c5dde 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -519,12 +519,15 @@ static int synaptics_set_mode(struct psmouse *psmouse) struct synaptics_data *priv = psmouse->private; priv->mode = 0; + if (priv->absolute_mode) priv->mode |= SYN_BIT_ABSOLUTE_MODE; - if (priv->disable_gesture) + else if (priv->disable_gesture) priv->mode |= SYN_BIT_DISABLE_GESTURE; + if (psmouse->rate >= 80) priv->mode |= SYN_BIT_HIGH_RATE; + if (SYN_CAP_EXTENDED(priv->capabilities)) priv->mode |= SYN_BIT_W_MODE; @@ -1482,7 +1485,7 @@ static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) } priv->absolute_mode = absolute_mode; - if (SYN_ID_DISGEST_SUPPORTED(priv->identity)) + if (!absolute_mode && SYN_ID_DISGEST_SUPPORTED(priv->identity)) priv->disable_gesture = true; /*