@@ -1476,16 +1476,47 @@ static void elantech_disconnect(struct psmouse *psmouse)
1476
1476
psmouse -> private = NULL ;
1477
1477
}
1478
1478
1479
+ /*
1480
+ * Some hw_version 4 models fail to properly activate absolute mode on
1481
+ * resume without going through disable/enable cycle.
1482
+ */
1483
+ static const struct dmi_system_id elantech_needs_reenable [] = {
1484
+ #if defined(CONFIG_DMI ) && defined (CONFIG_X86 )
1485
+ {
1486
+ /* Lenovo N24 */
1487
+ .matches = {
1488
+ DMI_MATCH (DMI_SYS_VENDOR , "LENOVO" ),
1489
+ DMI_MATCH (DMI_PRODUCT_NAME , "81AF" ),
1490
+ },
1491
+ },
1492
+ #endif
1493
+ { }
1494
+ };
1495
+
1479
1496
/*
1480
1497
* Put the touchpad back into absolute mode when reconnecting
1481
1498
*/
1482
1499
static int elantech_reconnect (struct psmouse * psmouse )
1483
1500
{
1501
+ int err ;
1502
+
1484
1503
psmouse_reset (psmouse );
1485
1504
1486
1505
if (elantech_detect (psmouse , 0 ))
1487
1506
return -1 ;
1488
1507
1508
+ if (dmi_check_system (elantech_needs_reenable )) {
1509
+ err = ps2_command (& psmouse -> ps2dev , NULL , PSMOUSE_CMD_DISABLE );
1510
+ if (err )
1511
+ psmouse_warn (psmouse , "failed to deactivate mouse on %s: %d\n" ,
1512
+ psmouse -> ps2dev .serio -> phys , err );
1513
+
1514
+ err = ps2_command (& psmouse -> ps2dev , NULL , PSMOUSE_CMD_ENABLE );
1515
+ if (err )
1516
+ psmouse_warn (psmouse , "failed to reactivate mouse on %s: %d\n" ,
1517
+ psmouse -> ps2dev .serio -> phys , err );
1518
+ }
1519
+
1489
1520
if (elantech_set_absolute_mode (psmouse )) {
1490
1521
psmouse_err (psmouse ,
1491
1522
"failed to put touchpad back into absolute mode.\n" );
0 commit comments