Revert "Input: psmouse - add delay when deactivating for SMBus mode"
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 12 Oct 2023 22:54:21 +0000 (15:54 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 12 Oct 2023 23:01:36 +0000 (16:01 -0700)
This reverts commit 92e24e0e57f72e06c2df87116557331fd2d4dda2.

While the patch itself is correct, it uncovered an issue with fallback
to PS/2 mode, where we were leaving psmouse->fast_reconnect handler set
to psmouse_smbus_reconnect(), which caused crashes.

While discussing various approaches to fix the issue it was noted that
this patch ass undesired delay in the "fast" resume path of PS/2 device,
and it would be better to actually use "reset_delay" option defined in
struct rmi_device_platform_data and have RMI code handle it for SMBus
transport as well. So this patch is being reverted to deal with crashes
and a better solution will be merged shortly.

Reported-by: Thorsten Leemhuis <linux@leemhuis.info>
Closes: https://lore.kernel.org/all/ca0109fa-c64b-43c1-a651-75b294d750a1@leemhuis.info/
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/psmouse-smbus.c

index 7b13de9..2a2459b 100644 (file)
@@ -5,7 +5,6 @@
 
 #define pr_fmt(fmt)            KBUILD_MODNAME ": " fmt
 
-#include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/libps2.h>
@@ -119,18 +118,13 @@ static psmouse_ret_t psmouse_smbus_process_byte(struct psmouse *psmouse)
        return PSMOUSE_FULL_PACKET;
 }
 
-static void psmouse_activate_smbus_mode(struct psmouse_smbus_dev *smbdev)
-{
-       if (smbdev->need_deactivate) {
-               psmouse_deactivate(smbdev->psmouse);
-               /* Give the device time to switch into SMBus mode */
-               msleep(30);
-       }
-}
-
 static int psmouse_smbus_reconnect(struct psmouse *psmouse)
 {
-       psmouse_activate_smbus_mode(psmouse->private);
+       struct psmouse_smbus_dev *smbdev = psmouse->private;
+
+       if (smbdev->need_deactivate)
+               psmouse_deactivate(psmouse);
+
        return 0;
 }
 
@@ -263,7 +257,8 @@ int psmouse_smbus_init(struct psmouse *psmouse,
                }
        }
 
-       psmouse_activate_smbus_mode(smbdev);
+       if (need_deactivate)
+               psmouse_deactivate(psmouse);
 
        psmouse->private = smbdev;
        psmouse->protocol_handler = psmouse_smbus_process_byte;