|
@@ -11,6 +11,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/delay.h>
|
|
|
+#include <linux/dmi.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/input.h>
|
|
@@ -831,7 +832,11 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
- etd->reg_10 = 0x0b;
|
|
|
+ if (etd->set_hw_resolution)
|
|
|
+ etd->reg_10 = 0x0b;
|
|
|
+ else
|
|
|
+ etd->reg_10 = 0x03;
|
|
|
+
|
|
|
if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
|
|
|
rc = -1;
|
|
|
|
|
@@ -1330,6 +1335,22 @@ static int elantech_reconnect(struct psmouse *psmouse)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Some hw_version 3 models go into error state when we try to set bit 3 of r10
|
|
|
+ */
|
|
|
+static const struct dmi_system_id no_hw_res_dmi_table[] = {
|
|
|
+#if defined(CONFIG_DMI) && defined(CONFIG_X86)
|
|
|
+ {
|
|
|
+ /* Gigabyte U2442 */
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "U2442"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+#endif
|
|
|
+ { }
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* determine hardware version and set some properties according to it.
|
|
|
*/
|
|
@@ -1390,6 +1411,9 @@ static int elantech_set_properties(struct elantech_data *etd)
|
|
|
*/
|
|
|
etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000);
|
|
|
|
|
|
+ /* Enable real hardware resolution on hw_version 3 ? */
|
|
|
+ etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|