Input: psmouse-smbus - allow to control psmouse_deactivate
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Wed, 23 May 2018 00:30:31 +0000 (17:30 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 23 May 2018 23:49:22 +0000 (16:49 -0700)
This seems to be Synaptics specific, as some Elan touchpads are not
correctly switching to SMBus if we call deactivate before switching to
SMBus on cold boot and on resume.

Tested with the T480s

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Acked-by: KT Liao <kt.liao@emc.com.tw>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/elantech.c
drivers/input/mouse/psmouse-smbus.c
drivers/input/mouse/psmouse.h
drivers/input/mouse/synaptics.c

index 07e40a58e66c01f1b49c0910ade8040c7105f794..fb4d902c440345d3cbc02329ed742d48b931dc85 100644 (file)
@@ -1774,7 +1774,7 @@ static int elantech_create_smbus(struct psmouse *psmouse,
        if (info->has_trackpoint)
                smbus_board.properties = i2c_properties;
 
-       return psmouse_smbus_init(psmouse, &smbus_board, NULL, 0,
+       return psmouse_smbus_init(psmouse, &smbus_board, NULL, 0, false,
                                  leave_breadcrumbs);
 }
 
index c8a3b1f35ce3c4a9e30e0cff9305ee906ac9d92d..852d4b486ddb4650696b7ef72339c383e90c05c4 100644 (file)
@@ -23,6 +23,7 @@ struct psmouse_smbus_dev {
        struct i2c_client *client;
        struct list_head node;
        bool dead;
+       bool need_deactivate;
 };
 
 static LIST_HEAD(psmouse_smbus_list);
@@ -118,7 +119,10 @@ static psmouse_ret_t psmouse_smbus_process_byte(struct psmouse *psmouse)
 
 static int psmouse_smbus_reconnect(struct psmouse *psmouse)
 {
-       psmouse_deactivate(psmouse);
+       struct psmouse_smbus_dev *smbdev = psmouse->private;
+
+       if (smbdev->need_deactivate)
+               psmouse_deactivate(psmouse);
 
        return 0;
 }
@@ -225,6 +229,7 @@ void psmouse_smbus_cleanup(struct psmouse *psmouse)
 int psmouse_smbus_init(struct psmouse *psmouse,
                       const struct i2c_board_info *board,
                       const void *pdata, size_t pdata_size,
+                      bool need_deactivate,
                       bool leave_breadcrumbs)
 {
        struct psmouse_smbus_dev *smbdev;
@@ -236,6 +241,7 @@ int psmouse_smbus_init(struct psmouse *psmouse,
 
        smbdev->psmouse = psmouse;
        smbdev->board = *board;
+       smbdev->need_deactivate = need_deactivate;
 
        if (pdata) {
                smbdev->board.platform_data = kmemdup(pdata, pdata_size,
@@ -246,6 +252,9 @@ int psmouse_smbus_init(struct psmouse *psmouse,
                }
        }
 
+       if (need_deactivate)
+               psmouse_deactivate(psmouse);
+
        psmouse->private = smbdev;
        psmouse->protocol_handler = psmouse_smbus_process_byte;
        psmouse->reconnect = psmouse_smbus_reconnect;
@@ -253,8 +262,6 @@ int psmouse_smbus_init(struct psmouse *psmouse,
        psmouse->disconnect = psmouse_smbus_disconnect;
        psmouse->resync_time = 0;
 
-       psmouse_deactivate(psmouse);
-
        mutex_lock(&psmouse_smbus_mutex);
        list_add_tail(&smbdev->node, &psmouse_smbus_list);
        mutex_unlock(&psmouse_smbus_mutex);
index dd4ec1f602d71df848bd5deca4af1f35e40c25ff..64c3a5d3fb3e6b92cd8c9b58102f7a29d7acb55d 100644 (file)
@@ -225,6 +225,7 @@ struct i2c_board_info;
 int psmouse_smbus_init(struct psmouse *psmouse,
                       const struct i2c_board_info *board,
                       const void *pdata, size_t pdata_size,
+                      bool need_deactivate,
                       bool leave_breadcrumbs);
 void psmouse_smbus_cleanup(struct psmouse *psmouse);
 
index 60f2c463d1cc7d2805d9a98923ad3934d5ff2294..e3e0ef585eb677797aed429f1dc49a546a2eff31 100644 (file)
@@ -1748,7 +1748,7 @@ static int synaptics_create_intertouch(struct psmouse *psmouse,
        };
 
        return psmouse_smbus_init(psmouse, &intertouch_board,
-                                 &pdata, sizeof(pdata),
+                                 &pdata, sizeof(pdata), true,
                                  leave_breadcrumbs);
 }