|
@@ -265,11 +265,22 @@ static int synaptics_identify(struct psmouse *psmouse)
|
|
|
* Read touchpad resolution and maximum reported coordinates
|
|
|
* Resolution is left zero if touchpad does not support the query
|
|
|
*/
|
|
|
+
|
|
|
+static const int *quirk_min_max;
|
|
|
+
|
|
|
static int synaptics_resolution(struct psmouse *psmouse)
|
|
|
{
|
|
|
struct synaptics_data *priv = psmouse->private;
|
|
|
unsigned char resp[3];
|
|
|
|
|
|
+ if (quirk_min_max) {
|
|
|
+ priv->x_min = quirk_min_max[0];
|
|
|
+ priv->x_max = quirk_min_max[1];
|
|
|
+ priv->y_min = quirk_min_max[2];
|
|
|
+ priv->y_max = quirk_min_max[3];
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (SYN_ID_MAJOR(priv->identity) < 4)
|
|
|
return 0;
|
|
|
|
|
@@ -1485,10 +1496,46 @@ static const struct dmi_system_id olpc_dmi_table[] __initconst = {
|
|
|
{ }
|
|
|
};
|
|
|
|
|
|
+static const struct dmi_system_id min_max_dmi_table[] __initconst = {
|
|
|
+#if defined(CONFIG_DMI)
|
|
|
+ {
|
|
|
+ /* Lenovo ThinkPad Helix */
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"),
|
|
|
+ },
|
|
|
+ .driver_data = (int []){1024, 5052, 2258, 4832},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ /* Lenovo ThinkPad T440s */
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"),
|
|
|
+ },
|
|
|
+ .driver_data = (int []){1024, 5112, 2024, 4832},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ /* Lenovo ThinkPad T540p */
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"),
|
|
|
+ },
|
|
|
+ .driver_data = (int []){1024, 5056, 2058, 4832},
|
|
|
+ },
|
|
|
+#endif
|
|
|
+ { }
|
|
|
+};
|
|
|
+
|
|
|
void __init synaptics_module_init(void)
|
|
|
{
|
|
|
+ const struct dmi_system_id *min_max_dmi;
|
|
|
+
|
|
|
impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
|
|
|
broken_olpc_ec = dmi_check_system(olpc_dmi_table);
|
|
|
+
|
|
|
+ min_max_dmi = dmi_first_match(min_max_dmi_table);
|
|
|
+ if (min_max_dmi)
|
|
|
+ quirk_min_max = min_max_dmi->driver_data;
|
|
|
}
|
|
|
|
|
|
static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
|