linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Richard Pospesel <pospeselr@gmail.com>
To: dmitry.torokhov@gmail.com
Cc: linux-input@vger.kernel.org, chris@diamand.org,
	phonesyfreakies@gmail.com
Subject: [PATCH] Input: byd - fix issue where generic PS/2 mice are detected as BYD touchpad
Date: Tue, 28 Jun 2016 21:01:18 -0700	[thread overview]
Message-ID: <1467172878-25483-1-git-send-email-pospeselr@gmail.com> (raw)
In-Reply-To: <20160627213412.GC22620@dtor-ws>

The secret handshake used was not sufficient to determine whether the connected
device was actually a BYD touchpad.  Added some restrictions on what the first
byte returned may be (based off of experiments with BYD touchapd).  Moved
subsequent initialization logic from byd_init to tail of byd_detect, and
removed byd_init function.

Fixes bug 1201781.  Tested on laptop with BYD touchpad hardware.

Applied against commit fcd6eb50eadd83f857eac55f99316f1789707cdb

Signed-off-by: Richard Pospesel <pospeselr@gmail.com>

---
diff --git a/drivers/input/mouse/byd.c b/drivers/input/mouse/byd.c
index ec73f75..92f5556 100644
--- a/drivers/input/mouse/byd.c
+++ b/drivers/input/mouse/byd.c
@@ -2,6 +2,10 @@
  * BYD TouchPad PS/2 mouse driver
  *
  * Copyright (C) 2015 Chris Diamand <chris@diamand.org>
+ * Copyright (C) 2015 Richard Pospesel
+ * Copyright (C) 2015 Tai Chi Minh Ralph Eastwood
+ * Copyright (C) 2015 Martin Wimpress
+ * Copyright (C) 2015 Jay Kuri
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 as published by
@@ -355,7 +359,7 @@ static int byd_reset_touchpad(struct psmouse *psmouse)
 		{ PSMOUSE_CMD_ENABLE, 0 },
 		/*
 		 * BYD-specific initialization, which enables absolute mode and
-		 * (if desired), the touchpad's built-in gesture detection.
+		 * disables the builtin hardware gesture recogniton.
 		 */
 		{ 0x10E2, 0x00 },
 		{ 0x10E0, 0x02 },
@@ -435,6 +439,10 @@ int byd_detect(struct psmouse *psmouse, bool set_properties)
 	struct ps2dev *ps2dev = &psmouse->ps2dev;
 	u8 param[4] = {0x03, 0x00, 0x00, 0x00};

+	if (psmouse_reset(psmouse))
+		return -EIO;
+
+	/* 'Secret' handshake */
 	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES))
 		return -1;
 	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES))
@@ -446,62 +454,68 @@ int byd_detect(struct psmouse *psmouse, bool set_properties)
 	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))
 		return -1;

-	if (param[1] != 0x03 || param[2] != 0x64)
+	/*
+	 * BYD touchpad returns 0x03 for resolution ( 8 count / mm ) and
+	 * 0x64 ( 100 samples / sec ) for sampling rate
+	 * The first byte's value is dependent on the mouse button states:
+	 *  0 : no button pressed
+	 *  1 : right button pressed
+	 *  4 : left button pressed
+	 *  5 : right and left button pressed
+	 */
+	if ((param[0] & 0x05) != param[0] ||
+	    param[1] != 0x03 ||
+	    param[2] != 0x64)
+		return -ENODEV;
+
+	/* Attempt to set BYD unique settings */
+	if (byd_reset_touchpad(psmouse))
 		return -ENODEV;

 	psmouse_dbg(psmouse, "BYD touchpad detected\n");

 	if (set_properties) {
-		psmouse->vendor = "BYD";
-		psmouse->name = "TouchPad";
-	}
+		struct input_dev *dev = psmouse->dev;
+		struct byd_data *priv;

-	return 0;
-}
+		priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+		if (!priv)
+			return -ENOMEM;

-int byd_init(struct psmouse *psmouse)
-{
-	struct input_dev *dev = psmouse->dev;
-	struct byd_data *priv;
-
-	if (psmouse_reset(psmouse))
-		return -EIO;
-
-	if (byd_reset_touchpad(psmouse))
-		return -EIO;
+		setup_timer(
+			&priv->timer,
+			byd_clear_touch,
+			(unsigned long) psmouse);

-	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-	if (!priv)
-		return -ENOMEM;
-
-	setup_timer(&priv->timer, byd_clear_touch, (unsigned long) psmouse);
-
-	psmouse->private = priv;
-	psmouse->disconnect = byd_disconnect;
-	psmouse->reconnect = byd_reconnect;
-	psmouse->protocol_handler = byd_process_byte;
-	psmouse->pktsize = 4;
-	psmouse->resync_time = 0;
-
-	__set_bit(INPUT_PROP_POINTER, dev->propbit);
-	/* Touchpad */
-	__set_bit(BTN_TOUCH, dev->keybit);
-	__set_bit(BTN_TOOL_FINGER, dev->keybit);
-	/* Buttons */
-	__set_bit(BTN_LEFT, dev->keybit);
-	__set_bit(BTN_RIGHT, dev->keybit);
-	__clear_bit(BTN_MIDDLE, dev->keybit);
-
-	/* Absolute position */
-	__set_bit(EV_ABS, dev->evbit);
-	input_set_abs_params(dev, ABS_X, 0, BYD_PAD_WIDTH, 0, 0);
-	input_set_abs_params(dev, ABS_Y, 0, BYD_PAD_HEIGHT, 0, 0);
-	input_abs_set_res(dev, ABS_X, BYD_PAD_RESOLUTION);
-	input_abs_set_res(dev, ABS_Y, BYD_PAD_RESOLUTION);
-	/* No relative support */
-	__clear_bit(EV_REL, dev->evbit);
-	__clear_bit(REL_X, dev->relbit);
-	__clear_bit(REL_Y, dev->relbit);
+		psmouse->private = priv;
+		psmouse->vendor = "BYD";
+		psmouse->name = "TouchPad";
+		psmouse->disconnect = byd_disconnect;
+		psmouse->reconnect = byd_reconnect;
+		psmouse->protocol_handler = byd_process_byte;
+		psmouse->pktsize = 4;
+		psmouse->resync_time = 0;
+
+		__set_bit(INPUT_PROP_POINTER, dev->propbit);
+		/* Touchpad */
+		__set_bit(BTN_TOUCH, dev->keybit);
+		__set_bit(BTN_TOOL_FINGER, dev->keybit);
+		/* Buttons */
+		__set_bit(BTN_LEFT, dev->keybit);
+		__set_bit(BTN_RIGHT, dev->keybit);
+		__clear_bit(BTN_MIDDLE, dev->keybit);
+
+		/* Absolute position */
+		__set_bit(EV_ABS, dev->evbit);
+		input_set_abs_params(dev, ABS_X, 0, BYD_PAD_WIDTH, 0, 0);
+		input_set_abs_params(dev, ABS_Y, 0, BYD_PAD_HEIGHT, 0, 0);
+		input_abs_set_res(dev, ABS_X, BYD_PAD_RESOLUTION);
+		input_abs_set_res(dev, ABS_Y, BYD_PAD_RESOLUTION);
+		/* No relative support */
+		__clear_bit(EV_REL, dev->evbit);
+		__clear_bit(REL_X, dev->relbit);
+		__clear_bit(REL_Y, dev->relbit);
+	}

 	return 0;
-}
+}
\ No newline at end of file
diff --git a/drivers/input/mouse/byd.h b/drivers/input/mouse/byd.h
index d6c120c..810d19e 100644
--- a/drivers/input/mouse/byd.h
+++ b/drivers/input/mouse/byd.h
@@ -3,16 +3,11 @@

 #ifdef CONFIG_MOUSE_PS2_BYD
 int byd_detect(struct psmouse *psmouse, bool set_properties);
-int byd_init(struct psmouse *psmouse);
 #else
 static inline int byd_detect(struct psmouse *psmouse, bool set_properties)
 {
 	return -ENOSYS;
 }
-static inline int byd_init(struct psmouse *psmouse)
-{
-	return -ENOSYS;
-}
 #endif /* CONFIG_MOUSE_PS2_BYD */

 #endif /* _BYD_H */
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index 5784e20..5750a10 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -849,7 +849,6 @@ static const struct psmouse_protocol psmouse_protocols[] = {
 		.name		= "BYDPS/2",
 		.alias		= "byd",
 		.detect		= byd_detect,
-		.init		= byd_init,
 	},
 #endif
 	{

  reply	other threads:[~2016-06-29  4:01 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-26  2:25 Input: byd - fix issue where generic PS/2 mice are detected as BYD touchpad Richard Pospesel
2016-06-26  2:25 ` [PATCH] made the byd_detect function more restrictive to prevent false positives when actual mouse is a generic PS/2 mouse; byd_detect now tries to go through BYD touchpad configuration steps, which fail when not performed on " Richard Pospesel
2016-06-27 21:34   ` Dmitry Torokhov
2016-06-29  4:01     ` Richard Pospesel [this message]
2016-07-11 20:26       ` [PATCH] Input: byd - fix issue where generic PS/2 mice are detected as " Chris Diamand
2016-07-12  2:57         ` Dmitry Torokhov
2016-07-14 16:46           ` Dmitry Torokhov
     [not found]             ` <CAHc7Qt1AEdCxu+rnrYqMRNQFGac4VuNFG=tfTSeHam4SnB3F3w@mail.gmail.com>
2016-08-02 11:32               ` Chris Diamand
2016-08-18 10:04                 ` Benjamin Tissoires

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1467172878-25483-1-git-send-email-pospeselr@gmail.com \
    --to=pospeselr@gmail.com \
    --cc=chris@diamand.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=phonesyfreakies@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).