diff mbox

Input: psmouse - reset device during probe

Message ID 20170605202752.8061-1-drake@endlessm.com (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Drake June 5, 2017, 8:27 p.m. UTC
New Acer laptops (Aspire A315-31 and several others) have an EC which
expects the PS/2 reset command to happen during boot.

On Linux, that means that currently the touchpad is unresponsive until
suspend/resume, when psmouse_reconnect() resets the device.

We observe that Windows sends a PS/2 reset command during boot.
Make Linux do the same here, making the touchpad usable on these
new products.

Signed-off-by: Daniel Drake <drake@endlessm.com>
---
 drivers/input/mouse/psmouse-base.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Pali Rohár June 8, 2017, 7:32 p.m. UTC | #1
On Po 5. Jún 2017 22:27 Daniel Drake wrote:
> New Acer laptops (Aspire A315-31 and several others) have an EC which
> expects the PS/2 reset command to happen during boot.
> 
> On Linux, that means that currently the touchpad is unresponsive until
> suspend/resume, when psmouse_reconnect() resets the device.
> 
> We observe that Windows sends a PS/2 reset command during boot.
> Make Linux do the same here, making the touchpad usable on these
> new products.
> 
> Signed-off-by: Daniel Drake <drake@endlessm.com>
> ---
>  drivers/input/mouse/psmouse-base.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/input/mouse/psmouse-base.c
> b/drivers/input/mouse/psmouse-base.c index f73b47b8c578..8f3c903db7b9
> 100644 --- a/drivers/input/mouse/psmouse-base.c
> +++ b/drivers/input/mouse/psmouse-base.c
> @@ -1591,6 +1591,12 @@ static int psmouse_connect(struct serio *serio,
> struct serio_driver *drv)
>  psmouse->resync_time = parent ? 0 : psmouse_resync_time;
>  psmouse->smartscroll = psmouse_smartscroll;
>  
> +	/* Reset the device, even though we would ordinarily expect it to
> +	 * already be in the reset state. This matches Windows behaviour,
> +	 * which some ECs require.
> +	 */
> +	psmouse_reset(psmouse);
> +
>  psmouse_switch_protocol(psmouse, NULL);
>  
>  if (!psmouse->protocol->smbus_companion) {

This patch will slow down enumeration and initalization of *all* PS/2 mouses.

I guess if there are some problematic machines, it could be hooked...
Daniel Drake June 8, 2017, 8:18 p.m. UTC | #2
On Thu, Jun 8, 2017 at 1:32 PM, Pali Rohár <pali.rohar@gmail.com> wrote:
> This patch will slow down enumeration and initalization of *all* PS/2 mouses.

I know it's not ideal. but do you think anyone will be able to notice
the difference in initialization time?

Daniel
--
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
Pali Rohár June 8, 2017, 8:27 p.m. UTC | #3
On Thursday 08 June 2017 22:18:36 Daniel Drake wrote:
> On Thu, Jun 8, 2017 at 1:32 PM, Pali Rohár <pali.rohar@gmail.com>
> wrote:
> > This patch will slow down enumeration and initalization of *all*
> > PS/2 mouses.
> 
> I know it's not ideal. but do you think anyone will be able to notice
> the difference in initialization time?

In past I was working on fixing detection of ALPS trackstick and Dmitry 
refused to add another unconditional reset during probe. That problem 
was fixed by calling reset routine only for ALPS devices and after 
detection that it is ALPS...

So I think Dmitry would complain about this unconditional reset for all 
PS/2 devices again.
diff mbox

Patch

diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index f73b47b8c578..8f3c903db7b9 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -1591,6 +1591,12 @@  static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
 	psmouse->resync_time = parent ? 0 : psmouse_resync_time;
 	psmouse->smartscroll = psmouse_smartscroll;
 
+	/* Reset the device, even though we would ordinarily expect it to
+	 * already be in the reset state. This matches Windows behaviour,
+	 * which some ECs require.
+	 */
+	psmouse_reset(psmouse);
+
 	psmouse_switch_protocol(psmouse, NULL);
 
 	if (!psmouse->protocol->smbus_companion) {