mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
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 <benjamin.tissoires@redhat.com> Acked-by: KT Liao <kt.liao@emc.com.tw> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
df077237cf
commit
bf232e460a
4 changed files with 13 additions and 5 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue