All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] i8042: Also store the aux firmware id in multi-plexed aux ports
@ 2014-09-11  8:50 Hans de Goede
  2014-09-11  8:50 ` [PATCH 2/3] psmouse: Add psmouse_matches_pnp_id helper function Hans de Goede
  2014-09-11  8:50 ` [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads Hans de Goede
  0 siblings, 2 replies; 6+ messages in thread
From: Hans de Goede @ 2014-09-11  8:50 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Peter Hutterer, Benjamin Tissoires, linux-input, Hans de Goede

So that firmware-id matching can be used with multiplexed aux ports too.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/input/serio/i8042.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index 3807c3e..f5a98af 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -1254,6 +1254,8 @@ static int __init i8042_create_aux_port(int idx)
 	} else {
 		snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx);
 		snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, idx + 1);
+		strlcpy(serio->firmware_id, i8042_aux_firmware_id,
+			sizeof(serio->firmware_id));
 	}
 
 	port->serio = serio;
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] psmouse: Add psmouse_matches_pnp_id helper function
  2014-09-11  8:50 [PATCH 1/3] i8042: Also store the aux firmware id in multi-plexed aux ports Hans de Goede
@ 2014-09-11  8:50 ` Hans de Goede
  2014-09-11  8:50 ` [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads Hans de Goede
  1 sibling, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2014-09-11  8:50 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Peter Hutterer, Benjamin Tissoires, linux-input, Hans de Goede

The matches_pnp_id function from the synaptics driver is useful for other
drivers too. Make it a generic psmouse helper function.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/input/mouse/psmouse-base.c | 14 ++++++++++++++
 drivers/input/mouse/psmouse.h      |  1 +
 drivers/input/mouse/synaptics.c    | 17 +++--------------
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index b4e1f01..02e68c3 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -462,6 +462,20 @@ static int psmouse_poll(struct psmouse *psmouse)
 			   PSMOUSE_CMD_POLL | (psmouse->pktsize << 8));
 }
 
+/*
+ * psmouse_matches_pnp_id - check if psmouse matches one of the passed in ids.
+ */
+bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[])
+{
+	int i;
+
+	if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4))
+		for (i = 0; ids[i]; i++)
+			if (strstr(psmouse->ps2dev.serio->firmware_id, ids[i]))
+				return true;
+
+	return false;
+}
 
 /*
  * Genius NetMouse magic init.
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
index 2f0b39d..f4cf664 100644
--- a/drivers/input/mouse/psmouse.h
+++ b/drivers/input/mouse/psmouse.h
@@ -108,6 +108,7 @@ void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);
 psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse);
 int psmouse_activate(struct psmouse *psmouse);
 int psmouse_deactivate(struct psmouse *psmouse);
+bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[]);
 
 struct psmouse_attribute {
 	struct device_attribute dattr;
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
index e8573c6..854caca 100644
--- a/drivers/input/mouse/synaptics.c
+++ b/drivers/input/mouse/synaptics.c
@@ -185,18 +185,6 @@ static const char * const topbuttonpad_pnp_ids[] = {
 	NULL
 };
 
-static bool matches_pnp_id(struct psmouse *psmouse, const char * const ids[])
-{
-	int i;
-
-	if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4))
-		for (i = 0; ids[i]; i++)
-			if (strstr(psmouse->ps2dev.serio->firmware_id, ids[i]))
-				return true;
-
-	return false;
-}
-
 /*****************************************************************************
  *	Synaptics communications functions
  ****************************************************************************/
@@ -362,7 +350,8 @@ static int synaptics_resolution(struct psmouse *psmouse)
 	}
 
 	for (i = 0; min_max_pnpid_table[i].pnp_ids; i++) {
-		if (matches_pnp_id(psmouse, min_max_pnpid_table[i].pnp_ids)) {
+		if (psmouse_matches_pnp_id(psmouse,
+					   min_max_pnpid_table[i].pnp_ids)) {
 			priv->x_min = min_max_pnpid_table[i].x_min;
 			priv->x_max = min_max_pnpid_table[i].x_max;
 			priv->y_min = min_max_pnpid_table[i].y_min;
@@ -1456,7 +1445,7 @@ static void set_input_params(struct psmouse *psmouse,
 
 	if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
 		__set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
-		if (matches_pnp_id(psmouse, topbuttonpad_pnp_ids))
+		if (psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids))
 			__set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit);
 		/* Clickpads report only left button */
 		__clear_bit(BTN_RIGHT, dev->keybit);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads
  2014-09-11  8:50 [PATCH 1/3] i8042: Also store the aux firmware id in multi-plexed aux ports Hans de Goede
  2014-09-11  8:50 ` [PATCH 2/3] psmouse: Add psmouse_matches_pnp_id helper function Hans de Goede
@ 2014-09-11  8:50 ` Hans de Goede
  2014-09-11 17:26   ` Dmitry Torokhov
  1 sibling, 1 reply; 6+ messages in thread
From: Hans de Goede @ 2014-09-11  8:50 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Peter Hutterer, Benjamin Tissoires, linux-input, Hans de Goede

The Asus X450 and X550 laptops use a PS/2 touchpad from a new manufacturer
called FocalTech:

https://bugzilla.kernel.org/show_bug.cgi?id=77391
https://bugzilla.redhat.com/show_bug.cgi?id=1110011

The protocol for these devices is not known at this time, but even without
knowing the protocol they need some special handling. They get upset by some
of our other PS/2 device probing, and once upset generate random mouse events
making things unusable even with an external mouse.

This patch adds detection of these devices based on their pnp ids, and when
they are detected, treats them as a bare ps/2 mouse. Doing things this way
they at least work in their ps/2 mouse emulation mode.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/input/mouse/Makefile       |  2 +-
 drivers/input/mouse/focaltech.c    | 44 ++++++++++++++++++++++++++++++++++++++
 drivers/input/mouse/focaltech.h    | 21 ++++++++++++++++++
 drivers/input/mouse/psmouse-base.c | 10 +++++++++
 4 files changed, 76 insertions(+), 1 deletion(-)
 create mode 100644 drivers/input/mouse/focaltech.c
 create mode 100644 drivers/input/mouse/focaltech.h

diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
index c25efdb..dda507f 100644
--- a/drivers/input/mouse/Makefile
+++ b/drivers/input/mouse/Makefile
@@ -23,7 +23,7 @@ obj-$(CONFIG_MOUSE_SYNAPTICS_I2C)	+= synaptics_i2c.o
 obj-$(CONFIG_MOUSE_SYNAPTICS_USB)	+= synaptics_usb.o
 obj-$(CONFIG_MOUSE_VSXXXAA)		+= vsxxxaa.o
 
-psmouse-objs := psmouse-base.o synaptics.o
+psmouse-objs := psmouse-base.o synaptics.o focaltech.o
 
 psmouse-$(CONFIG_MOUSE_PS2_ALPS)	+= alps.o
 psmouse-$(CONFIG_MOUSE_PS2_ELANTECH)	+= elantech.o
diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
new file mode 100644
index 0000000..d83a235
--- /dev/null
+++ b/drivers/input/mouse/focaltech.c
@@ -0,0 +1,44 @@
+/*
+ * Focaltech TouchPad PS/2 mouse driver
+ *
+ * Copyright (c) 2014 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Red Hat authors:
+ *
+ * Hans de Goede <hdegoede@redhat.com>
+ */
+
+/*
+ * The Focaltech PS/2 touchpad protocol is unknown. This drivers deals with
+ * detection only, to avoid further detection attempts confusing the touchpad
+ * this way it at least works in PS/2 mouse compatibility mode.
+ */
+
+#include <linux/device.h>
+#include <linux/libps2.h>
+#include "psmouse.h"
+
+static const char * const focaltech_pnp_ids[] = {
+	"FLT0101",
+	"FLT0102",
+	"FLT0103",
+	NULL
+};
+
+int focaltech_detect(struct psmouse *psmouse, bool set_properties)
+{
+	if (!psmouse_matches_pnp_id(psmouse, focaltech_pnp_ids))
+		return -ENODEV;
+
+	if (set_properties) {
+		psmouse->vendor = "FocalTech";
+		psmouse->name = "FocalTech Touchpad in mouse emulation mode";
+	}
+
+	return 0;
+}
diff --git a/drivers/input/mouse/focaltech.h b/drivers/input/mouse/focaltech.h
new file mode 100644
index 0000000..0d0fc49
--- /dev/null
+++ b/drivers/input/mouse/focaltech.h
@@ -0,0 +1,21 @@
+/*
+ * Focaltech TouchPad PS/2 mouse driver
+ *
+ * Copyright (c) 2014 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Red Hat authors:
+ *
+ * Hans de Goede <hdegoede@redhat.com>
+ */
+
+#ifndef _FOCALTECH_H
+#define _FOCALTECH_H
+
+int focaltech_detect(struct psmouse *psmouse, bool set_properties);
+
+#endif
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index 02e68c3..2c8c8e2 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -35,6 +35,7 @@
 #include "elantech.h"
 #include "sentelic.h"
 #include "cypress_ps2.h"
+#include "focaltech.h"
 
 #define DRIVER_DESC	"PS/2 mouse driver"
 
@@ -722,6 +723,13 @@ static int psmouse_extensions(struct psmouse *psmouse,
 {
 	bool synaptics_hardware = false;
 
+/* Always check for focaltech, this is safe as it uses pnp-id matching */
+	if (psmouse_do_detect(focaltech_detect, psmouse, set_properties) == 0) {
+		/* Not supported yet, use bare protocol */
+		psmouse_max_proto = max_proto = PSMOUSE_PS2;
+		goto reset_to_defaults;
+	}
+
 /*
  * We always check for lifebook because it does not disturb mouse
  * (it only checks DMI information).
@@ -873,6 +881,8 @@ static int psmouse_extensions(struct psmouse *psmouse,
 		}
 	}
 
+reset_to_defaults:
+
 /*
  * Reset to defaults in case the device got confused by extended
  * protocol probes. Note that we follow up with full reset because
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads
  2014-09-11  8:50 ` [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads Hans de Goede
@ 2014-09-11 17:26   ` Dmitry Torokhov
  2014-09-11 17:31     ` Hans de Goede
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitry Torokhov @ 2014-09-11 17:26 UTC (permalink / raw)
  To: Hans de Goede; +Cc: Peter Hutterer, Benjamin Tissoires, linux-input

Hi Hans,

On Thu, Sep 11, 2014 at 10:50:47AM +0200, Hans de Goede wrote:
> @@ -722,6 +723,13 @@ static int psmouse_extensions(struct psmouse *psmouse,
>  {
>  	bool synaptics_hardware = false;
>  
> +/* Always check for focaltech, this is safe as it uses pnp-id matching */
> +	if (psmouse_do_detect(focaltech_detect, psmouse, set_properties) == 0) {
> +		/* Not supported yet, use bare protocol */
> +		psmouse_max_proto = max_proto = PSMOUSE_PS2;
> +		goto reset_to_defaults;

Why do we need to jump to a new label instead of simply saying

		return PSMOUSE_PS2;

> +	}
> +

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads
  2014-09-11 17:26   ` Dmitry Torokhov
@ 2014-09-11 17:31     ` Hans de Goede
  2014-09-12  6:14       ` Dmitry Torokhov
  0 siblings, 1 reply; 6+ messages in thread
From: Hans de Goede @ 2014-09-11 17:31 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Peter Hutterer, Benjamin Tissoires, linux-input

Hi,

On 09/11/2014 07:26 PM, Dmitry Torokhov wrote:
> Hi Hans,
> 
> On Thu, Sep 11, 2014 at 10:50:47AM +0200, Hans de Goede wrote:
>> @@ -722,6 +723,13 @@ static int psmouse_extensions(struct psmouse *psmouse,
>>  {
>>  	bool synaptics_hardware = false;
>>  
>> +/* Always check for focaltech, this is safe as it uses pnp-id matching */
>> +	if (psmouse_do_detect(focaltech_detect, psmouse, set_properties) == 0) {
>> +		/* Not supported yet, use bare protocol */
>> +		psmouse_max_proto = max_proto = PSMOUSE_PS2;
>> +		goto reset_to_defaults;
> 
> Why do we need to jump to a new label instead of simply saying

Once we had figured out that psmouse.proto=bare at least made this
touchpad work in mouse emulation mode, that is the first thing I did, but it
is not enough. We also need to set psmouse_max_proto to short-circuit
psmouse_initialize and do the reset.

I'm trying to get access to one of the affected laptops to see if we can
do better.

Regards,

Hans

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads
  2014-09-11 17:31     ` Hans de Goede
@ 2014-09-12  6:14       ` Dmitry Torokhov
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Torokhov @ 2014-09-12  6:14 UTC (permalink / raw)
  To: Hans de Goede; +Cc: Peter Hutterer, Benjamin Tissoires, linux-input

On Thu, Sep 11, 2014 at 07:31:13PM +0200, Hans de Goede wrote:
> Hi,
> 
> On 09/11/2014 07:26 PM, Dmitry Torokhov wrote:
> > Hi Hans,
> > 
> > On Thu, Sep 11, 2014 at 10:50:47AM +0200, Hans de Goede wrote:
> >> @@ -722,6 +723,13 @@ static int psmouse_extensions(struct psmouse *psmouse,
> >>  {
> >>  	bool synaptics_hardware = false;
> >>  
> >> +/* Always check for focaltech, this is safe as it uses pnp-id matching */
> >> +	if (psmouse_do_detect(focaltech_detect, psmouse, set_properties) == 0) {
> >> +		/* Not supported yet, use bare protocol */
> >> +		psmouse_max_proto = max_proto = PSMOUSE_PS2;
> >> +		goto reset_to_defaults;
> > 
> > Why do we need to jump to a new label instead of simply saying
> 
> Once we had figured out that psmouse.proto=bare at least made this
> touchpad work in mouse emulation mode, that is the first thing I did, but it
> is not enough. We also need to set psmouse_max_proto to short-circuit
> psmouse_initialize and do the reset.

I'd rather we did the reset in focal_init() then. We'll need it anyway
later.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-09-12  6:14 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-11  8:50 [PATCH 1/3] i8042: Also store the aux firmware id in multi-plexed aux ports Hans de Goede
2014-09-11  8:50 ` [PATCH 2/3] psmouse: Add psmouse_matches_pnp_id helper function Hans de Goede
2014-09-11  8:50 ` [PATCH 3/3] psmouse: Add support for detecting FocalTech PS/2 touchpads Hans de Goede
2014-09-11 17:26   ` Dmitry Torokhov
2014-09-11 17:31     ` Hans de Goede
2014-09-12  6:14       ` Dmitry Torokhov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.