Commit bf232e46 authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Dmitry Torokhov

Input: psmouse-smbus - allow to control psmouse_deactivate

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: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Acked-by: default avatarKT Liao <kt.liao@emc.com.tw>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent df077237
...@@ -1774,7 +1774,7 @@ static int elantech_create_smbus(struct psmouse *psmouse, ...@@ -1774,7 +1774,7 @@ static int elantech_create_smbus(struct psmouse *psmouse,
if (info->has_trackpoint) if (info->has_trackpoint)
smbus_board.properties = i2c_properties; 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); leave_breadcrumbs);
} }
......
...@@ -23,6 +23,7 @@ struct psmouse_smbus_dev { ...@@ -23,6 +23,7 @@ struct psmouse_smbus_dev {
struct i2c_client *client; struct i2c_client *client;
struct list_head node; struct list_head node;
bool dead; bool dead;
bool need_deactivate;
}; };
static LIST_HEAD(psmouse_smbus_list); static LIST_HEAD(psmouse_smbus_list);
...@@ -118,7 +119,10 @@ static psmouse_ret_t psmouse_smbus_process_byte(struct psmouse *psmouse) ...@@ -118,7 +119,10 @@ static psmouse_ret_t psmouse_smbus_process_byte(struct psmouse *psmouse)
static int psmouse_smbus_reconnect(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; return 0;
} }
...@@ -225,6 +229,7 @@ void psmouse_smbus_cleanup(struct psmouse *psmouse) ...@@ -225,6 +229,7 @@ void psmouse_smbus_cleanup(struct psmouse *psmouse)
int psmouse_smbus_init(struct psmouse *psmouse, int psmouse_smbus_init(struct psmouse *psmouse,
const struct i2c_board_info *board, const struct i2c_board_info *board,
const void *pdata, size_t pdata_size, const void *pdata, size_t pdata_size,
bool need_deactivate,
bool leave_breadcrumbs) bool leave_breadcrumbs)
{ {
struct psmouse_smbus_dev *smbdev; struct psmouse_smbus_dev *smbdev;
...@@ -236,6 +241,7 @@ int psmouse_smbus_init(struct psmouse *psmouse, ...@@ -236,6 +241,7 @@ int psmouse_smbus_init(struct psmouse *psmouse,
smbdev->psmouse = psmouse; smbdev->psmouse = psmouse;
smbdev->board = *board; smbdev->board = *board;
smbdev->need_deactivate = need_deactivate;
if (pdata) { if (pdata) {
smbdev->board.platform_data = kmemdup(pdata, pdata_size, smbdev->board.platform_data = kmemdup(pdata, pdata_size,
...@@ -246,6 +252,9 @@ int psmouse_smbus_init(struct psmouse *psmouse, ...@@ -246,6 +252,9 @@ int psmouse_smbus_init(struct psmouse *psmouse,
} }
} }
if (need_deactivate)
psmouse_deactivate(psmouse);
psmouse->private = smbdev; psmouse->private = smbdev;
psmouse->protocol_handler = psmouse_smbus_process_byte; psmouse->protocol_handler = psmouse_smbus_process_byte;
psmouse->reconnect = psmouse_smbus_reconnect; psmouse->reconnect = psmouse_smbus_reconnect;
...@@ -253,8 +262,6 @@ int psmouse_smbus_init(struct psmouse *psmouse, ...@@ -253,8 +262,6 @@ int psmouse_smbus_init(struct psmouse *psmouse,
psmouse->disconnect = psmouse_smbus_disconnect; psmouse->disconnect = psmouse_smbus_disconnect;
psmouse->resync_time = 0; psmouse->resync_time = 0;
psmouse_deactivate(psmouse);
mutex_lock(&psmouse_smbus_mutex); mutex_lock(&psmouse_smbus_mutex);
list_add_tail(&smbdev->node, &psmouse_smbus_list); list_add_tail(&smbdev->node, &psmouse_smbus_list);
mutex_unlock(&psmouse_smbus_mutex); mutex_unlock(&psmouse_smbus_mutex);
......
...@@ -225,6 +225,7 @@ struct i2c_board_info; ...@@ -225,6 +225,7 @@ struct i2c_board_info;
int psmouse_smbus_init(struct psmouse *psmouse, int psmouse_smbus_init(struct psmouse *psmouse,
const struct i2c_board_info *board, const struct i2c_board_info *board,
const void *pdata, size_t pdata_size, const void *pdata, size_t pdata_size,
bool need_deactivate,
bool leave_breadcrumbs); bool leave_breadcrumbs);
void psmouse_smbus_cleanup(struct psmouse *psmouse); void psmouse_smbus_cleanup(struct psmouse *psmouse);
......
...@@ -1748,7 +1748,7 @@ static int synaptics_create_intertouch(struct psmouse *psmouse, ...@@ -1748,7 +1748,7 @@ static int synaptics_create_intertouch(struct psmouse *psmouse,
}; };
return psmouse_smbus_init(psmouse, &intertouch_board, return psmouse_smbus_init(psmouse, &intertouch_board,
&pdata, sizeof(pdata), &pdata, sizeof(pdata), true,
leave_breadcrumbs); leave_breadcrumbs);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment