diff mbox

[v3] synaptics: Add min/max quirk for ThinkPad T431s, L440, L540, S1 Yoga and X1

Message ID 1397734903-26088-2-git-send-email-hdegoede@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Hans de Goede April 17, 2014, 11:41 a.m. UTC
We expect that all the Haswell series will need such quirks, sigh.

The T431s seems to be T430 hardware in a T440s case, using the T440s touchpad,
with the same min/max issue.

The X1 Carbon 3rd generation name says 2nd while it is a 3rd generation.

The X1 and T431s share a PnPID with the T540p, but the reported ranges are
closer to those of the T440s.

HdG: Squashed 5 quirk patches into one. T431s + L440 + L540 are written by me,
S1 Yoga and X1 are written by Benjamin Tissoires.

Hdg: Standardized S1 Yoga and X1 values, Yoga uses the same touchpad as the
X240, X1 uses the same touchpad as the T440.

Cc: stable@vger.kernel.org
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/input/mouse/synaptics.c | 42 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

Comments

Dmitry Torokhov April 17, 2014, 3:35 p.m. UTC | #1
Hi Hans,

On Thu, Apr 17, 2014 at 01:41:43PM +0200, Hans de Goede wrote:
> We expect that all the Haswell series will need such quirks, sigh.

Given this statement do we really want this to be handled in kernel?
Maybe we simply want udev to fix up the limits with EVIOSABS(),
similarly to how we adjust keymaps for laptops?

Thanks.
Hans de Goede April 17, 2014, 3:53 p.m. UTC | #2
Hi,

On 04/17/2014 05:35 PM, Dmitry Torokhov wrote:
> Hi Hans,
> 
> On Thu, Apr 17, 2014 at 01:41:43PM +0200, Hans de Goede wrote:
>> We expect that all the Haswell series will need such quirks, sigh.
> 
> Given this statement do we really want this to be handled in kernel?

I know this answer won't make you happy, but short term: Yes, we are
getting many many bugreports about this, ie:

https://bugzilla.redhat.com/show_bug.cgi?id=1060885
https://bugzilla.redhat.com/show_bug.cgi?id=1068716
https://bugzilla.redhat.com/show_bug.cgi?id=1085582
https://bugzilla.redhat.com/show_bug.cgi?id=1085697
https://bugzilla.redhat.com/show_bug.cgi?id=1086227

And by extending the *already present* quirk table we can get this
issue resolved quickly, and also resolve it for people running
older kernels through the various stable series.

> Maybe we simply want udev to fix up the limits with EVIOSABS(),

Ah, I did not know that it is possible to fixup the min/max values
from user space, that is good to know.

> similarly to how we adjust keymaps for laptops?

We're currently looking into various ways to make this less painful,
specifically for most laptops the problem seems to be the min value
and not the max value. And the troublesome min value is the synaptics
driver default, not the one we get from the firmware. The problem is
we never ask the firmware because even though it has the "I can report
min values" capability bit, its "maximum understood request" number
is too low, so one of our 2 checks for getting the min value is
failing. If we remove that check some models do give us a proper
range (but not all, ie the T440s is still wrong).

We're currently trying to figure out if it will be safe for all models
to remove the "maximum understood request" number check. That should ie
remove the quirk for the x240 and possible others.

An other option to make this better is to switch the quirks to using
pnp-ids, ie the L440 and L540 share the same pnp-id. Once you've
merged the firmware_id patches I can take a shot at simplifying the
quirk table that way. Downside is that we then probably need to
put the firmware_id patches in the various stable kernels.

Note that even if we end up moving this to userspace, then we still
need the firmware_id, because I believe any userspace solution should
be using pnp-ids too.

TL;DR: It is complicated and for now we would like to continue with
the quirks as we've done sofar. We are aware that this is undesirable
from a maintenance pov and are looking into making this better.

Regards,

Hans
--
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
Dmitry Torokhov April 20, 2014, 5:32 a.m. UTC | #3
On Thu, Apr 17, 2014 at 05:53:10PM +0200, Hans de Goede wrote:
> Hi,
> 
> On 04/17/2014 05:35 PM, Dmitry Torokhov wrote:
> > Hi Hans,
> > 
> > On Thu, Apr 17, 2014 at 01:41:43PM +0200, Hans de Goede wrote:
> >> We expect that all the Haswell series will need such quirks, sigh.
> > 
> > Given this statement do we really want this to be handled in kernel?
> 
> I know this answer won't make you happy, but short term: Yes, we are
> getting many many bugreports about this, ie:
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=1060885
> https://bugzilla.redhat.com/show_bug.cgi?id=1068716
> https://bugzilla.redhat.com/show_bug.cgi?id=1085582
> https://bugzilla.redhat.com/show_bug.cgi?id=1085697
> https://bugzilla.redhat.com/show_bug.cgi?id=1086227
> 
> And by extending the *already present* quirk table we can get this
> issue resolved quickly, and also resolve it for people running
> older kernels through the various stable series.
> 
> > Maybe we simply want udev to fix up the limits with EVIOSABS(),
> 
> Ah, I did not know that it is possible to fixup the min/max values
> from user space, that is good to know.
> 
> > similarly to how we adjust keymaps for laptops?
> 
> We're currently looking into various ways to make this less painful,
> specifically for most laptops the problem seems to be the min value
> and not the max value. And the troublesome min value is the synaptics
> driver default, not the one we get from the firmware. The problem is
> we never ask the firmware because even though it has the "I can report
> min values" capability bit, its "maximum understood request" number
> is too low, so one of our 2 checks for getting the min value is
> failing. If we remove that check some models do give us a proper
> range (but not all, ie the T440s is still wrong).
> 
> We're currently trying to figure out if it will be safe for all models
> to remove the "maximum understood request" number check. That should ie
> remove the quirk for the x240 and possible others.
> 
> An other option to make this better is to switch the quirks to using
> pnp-ids, ie the L440 and L540 share the same pnp-id. Once you've
> merged the firmware_id patches I can take a shot at simplifying the
> quirk table that way. Downside is that we then probably need to
> put the firmware_id patches in the various stable kernels.
> 
> Note that even if we end up moving this to userspace, then we still
> need the firmware_id, because I believe any userspace solution should
> be using pnp-ids too.
> 
> TL;DR: It is complicated and for now we would like to continue with
> the quirks as we've done sofar. We are aware that this is undesirable
> from a maintenance pov and are looking into making this better.

OK, fair enough. I applied the patch.

Thanks.
diff mbox

Patch

diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
index a8b57d7..7c9f509 100644
--- a/drivers/input/mouse/synaptics.c
+++ b/drivers/input/mouse/synaptics.c
@@ -1566,6 +1566,14 @@  static const struct dmi_system_id min_max_dmi_table[] __initconst = {
 		.driver_data = (int []){1232, 5710, 1156, 4696},
 	},
 	{
+		/* Lenovo ThinkPad T431s */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T431"),
+		},
+		.driver_data = (int []){1024, 5112, 2024, 4832},
+	},
+	{
 		/* Lenovo ThinkPad T440s */
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1574,6 +1582,14 @@  static const struct dmi_system_id min_max_dmi_table[] __initconst = {
 		.driver_data = (int []){1024, 5112, 2024, 4832},
 	},
 	{
+		/* Lenovo ThinkPad L440 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L440"),
+		},
+		.driver_data = (int []){1024, 5112, 2024, 4832},
+	},
+	{
 		/* Lenovo ThinkPad T540p */
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -1581,6 +1597,32 @@  static const struct dmi_system_id min_max_dmi_table[] __initconst = {
 		},
 		.driver_data = (int []){1024, 5056, 2058, 4832},
 	},
+	{
+		/* Lenovo ThinkPad L540 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L540"),
+		},
+		.driver_data = (int []){1024, 5112, 2024, 4832},
+	},
+	{
+		/* Lenovo Yoga S1 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
+					"ThinkPad S1 Yoga"),
+		},
+		.driver_data = (int []){1232, 5710, 1156, 4696},
+	},
+	{
+		/* Lenovo ThinkPad X1 Carbon Haswell (3rd generation) */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_MATCH(DMI_PRODUCT_VERSION,
+					"ThinkPad X1 Carbon 2nd"),
+		},
+		.driver_data = (int []){1024, 5112, 2024, 4832},
+	},
 #endif
 	{ }
 };