|
@@ -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);
|