Skip to content

Commit bf232e4

Browse files
bentissdtor
authored andcommitted
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: Benjamin Tissoires <[email protected]> Acked-by: KT Liao <[email protected]> Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent df07723 commit bf232e4

File tree

4 files changed

+13
-5
lines changed

4 files changed

+13
-5
lines changed

drivers/input/mouse/elantech.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1774,7 +1774,7 @@ static int elantech_create_smbus(struct psmouse *psmouse,
17741774
if (info->has_trackpoint)
17751775
smbus_board.properties = i2c_properties;
17761776

1777-
return psmouse_smbus_init(psmouse, &smbus_board, NULL, 0,
1777+
return psmouse_smbus_init(psmouse, &smbus_board, NULL, 0, false,
17781778
leave_breadcrumbs);
17791779
}
17801780

drivers/input/mouse/psmouse-smbus.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct psmouse_smbus_dev {
2323
struct i2c_client *client;
2424
struct list_head node;
2525
bool dead;
26+
bool need_deactivate;
2627
};
2728

2829
static LIST_HEAD(psmouse_smbus_list);
@@ -118,7 +119,10 @@ static psmouse_ret_t psmouse_smbus_process_byte(struct psmouse *psmouse)
118119

119120
static int psmouse_smbus_reconnect(struct psmouse *psmouse)
120121
{
121-
psmouse_deactivate(psmouse);
122+
struct psmouse_smbus_dev *smbdev = psmouse->private;
123+
124+
if (smbdev->need_deactivate)
125+
psmouse_deactivate(psmouse);
122126

123127
return 0;
124128
}
@@ -225,6 +229,7 @@ void psmouse_smbus_cleanup(struct psmouse *psmouse)
225229
int psmouse_smbus_init(struct psmouse *psmouse,
226230
const struct i2c_board_info *board,
227231
const void *pdata, size_t pdata_size,
232+
bool need_deactivate,
228233
bool leave_breadcrumbs)
229234
{
230235
struct psmouse_smbus_dev *smbdev;
@@ -236,6 +241,7 @@ int psmouse_smbus_init(struct psmouse *psmouse,
236241

237242
smbdev->psmouse = psmouse;
238243
smbdev->board = *board;
244+
smbdev->need_deactivate = need_deactivate;
239245

240246
if (pdata) {
241247
smbdev->board.platform_data = kmemdup(pdata, pdata_size,
@@ -246,15 +252,16 @@ int psmouse_smbus_init(struct psmouse *psmouse,
246252
}
247253
}
248254

255+
if (need_deactivate)
256+
psmouse_deactivate(psmouse);
257+
249258
psmouse->private = smbdev;
250259
psmouse->protocol_handler = psmouse_smbus_process_byte;
251260
psmouse->reconnect = psmouse_smbus_reconnect;
252261
psmouse->fast_reconnect = psmouse_smbus_reconnect;
253262
psmouse->disconnect = psmouse_smbus_disconnect;
254263
psmouse->resync_time = 0;
255264

256-
psmouse_deactivate(psmouse);
257-
258265
mutex_lock(&psmouse_smbus_mutex);
259266
list_add_tail(&smbdev->node, &psmouse_smbus_list);
260267
mutex_unlock(&psmouse_smbus_mutex);

drivers/input/mouse/psmouse.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ struct i2c_board_info;
225225
int psmouse_smbus_init(struct psmouse *psmouse,
226226
const struct i2c_board_info *board,
227227
const void *pdata, size_t pdata_size,
228+
bool need_deactivate,
228229
bool leave_breadcrumbs);
229230
void psmouse_smbus_cleanup(struct psmouse *psmouse);
230231

drivers/input/mouse/synaptics.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1748,7 +1748,7 @@ static int synaptics_create_intertouch(struct psmouse *psmouse,
17481748
};
17491749

17501750
return psmouse_smbus_init(psmouse, &intertouch_board,
1751-
&pdata, sizeof(pdata),
1751+
&pdata, sizeof(pdata), true,
17521752
leave_breadcrumbs);
17531753
}
17541754

0 commit comments

Comments
 (0)