Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 184dd275 authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

Input: trackpoint - activate protocol when resuming



Trackpoint driver was not sending the magic knock sequence upon resume
causing incorrect device behavior after resuming from disk.

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 0c19fcd8
Loading
Loading
Loading
Loading
+34 −18
Original line number Diff line number Diff line
@@ -183,21 +183,26 @@ static struct attribute_group trackpoint_attr_group = {
	.attrs = trackpoint_attrs,
};

static void trackpoint_disconnect(struct psmouse *psmouse)
static int trackpoint_start_protocol(struct psmouse *psmouse, unsigned char *firmware_id)
{
	sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group);
	unsigned char param[2] = { 0 };

	kfree(psmouse->private);
	psmouse->private = NULL;
	if (ps2_command(&psmouse->ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID)))
		return -1;

	if (param[0] != TP_MAGIC_IDENT)
		return -1;

	if (firmware_id)
		*firmware_id = param[1];

	return 0;
}

static int trackpoint_sync(struct psmouse *psmouse)
{
	unsigned char toggle;
	struct trackpoint_data *tp = psmouse->private;

	if (!tp)
		return -1;
	unsigned char toggle;

	/* Disable features that may make device unusable with this driver */
	trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, &toggle);
@@ -263,27 +268,38 @@ static void trackpoint_defaults(struct trackpoint_data *tp)
	tp->ext_dev = TP_DEF_EXT_DEV;
}

static void trackpoint_disconnect(struct psmouse *psmouse)
{
	sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group);

	kfree(psmouse->private);
	psmouse->private = NULL;
}

static int trackpoint_reconnect(struct psmouse *psmouse)
{
	if (trackpoint_start_protocol(psmouse, NULL))
		return -1;

	if (trackpoint_sync(psmouse))
		return -1;

	return 0;
}

int trackpoint_detect(struct psmouse *psmouse, int set_properties)
{
	struct trackpoint_data *priv;
	struct ps2dev *ps2dev = &psmouse->ps2dev;
	unsigned char firmware_id;
	unsigned char button_info;
	unsigned char param[2];

	param[0] = param[1] = 0;

	if (ps2_command(ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID)))
		return -1;

	if (param[0] != TP_MAGIC_IDENT)
	if (trackpoint_start_protocol(psmouse, &firmware_id))
		return -1;

	if (!set_properties)
		return 0;

	firmware_id = param[1];

	if (trackpoint_read(&psmouse->ps2dev, TP_EXT_BTN, &button_info)) {
		printk(KERN_WARNING "trackpoint.c: failed to get extended button data\n");
		button_info = 0;
@@ -296,7 +312,7 @@ int trackpoint_detect(struct psmouse *psmouse, int set_properties)
	psmouse->vendor = "IBM";
	psmouse->name = "TrackPoint";

	psmouse->reconnect = trackpoint_sync;
	psmouse->reconnect = trackpoint_reconnect;
	psmouse->disconnect = trackpoint_disconnect;

	trackpoint_defaults(priv);