|
@@ -117,6 +117,44 @@ void synaptics_reset(struct psmouse *psmouse)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_MOUSE_PS2_SYNAPTICS
|
|
|
+/* This list has been kindly provided by Synaptics. */
|
|
|
+static const char * const topbuttonpad_pnp_ids[] = {
|
|
|
+ "LEN0017",
|
|
|
+ "LEN0018",
|
|
|
+ "LEN0019",
|
|
|
+ "LEN0023",
|
|
|
+ "LEN002A",
|
|
|
+ "LEN002B",
|
|
|
+ "LEN002C",
|
|
|
+ "LEN002D",
|
|
|
+ "LEN002E",
|
|
|
+ "LEN0033", /* Helix */
|
|
|
+ "LEN0034", /* T431s, T540, X1 Carbon 2nd */
|
|
|
+ "LEN0035", /* X240 */
|
|
|
+ "LEN0036", /* T440 */
|
|
|
+ "LEN0037",
|
|
|
+ "LEN0038",
|
|
|
+ "LEN0041",
|
|
|
+ "LEN0042", /* Yoga */
|
|
|
+ "LEN0045",
|
|
|
+ "LEN0046",
|
|
|
+ "LEN0047",
|
|
|
+ "LEN0048",
|
|
|
+ "LEN0049",
|
|
|
+ "LEN2000",
|
|
|
+ "LEN2001",
|
|
|
+ "LEN2002",
|
|
|
+ "LEN2003",
|
|
|
+ "LEN2004", /* L440 */
|
|
|
+ "LEN2005",
|
|
|
+ "LEN2006",
|
|
|
+ "LEN2007",
|
|
|
+ "LEN2008",
|
|
|
+ "LEN2009",
|
|
|
+ "LEN200A",
|
|
|
+ "LEN200B",
|
|
|
+ NULL
|
|
|
+};
|
|
|
|
|
|
/*****************************************************************************
|
|
|
* Synaptics communications functions
|
|
@@ -1255,8 +1293,10 @@ static void set_abs_position_params(struct input_dev *dev,
|
|
|
input_abs_set_res(dev, y_code, priv->y_res);
|
|
|
}
|
|
|
|
|
|
-static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
|
|
+static void set_input_params(struct psmouse *psmouse,
|
|
|
+ struct synaptics_data *priv)
|
|
|
{
|
|
|
+ struct input_dev *dev = psmouse->dev;
|
|
|
int i;
|
|
|
|
|
|
/* Things that apply to both modes */
|
|
@@ -1325,6 +1365,17 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv)
|
|
|
|
|
|
if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
|
|
|
__set_bit(INPUT_PROP_BUTTONPAD, dev->propbit);
|
|
|
+ /* See if this buttonpad has a top button area */
|
|
|
+ if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4)) {
|
|
|
+ for (i = 0; topbuttonpad_pnp_ids[i]; i++) {
|
|
|
+ if (strstr(psmouse->ps2dev.serio->firmware_id,
|
|
|
+ topbuttonpad_pnp_ids[i])) {
|
|
|
+ __set_bit(INPUT_PROP_TOPBUTTONPAD,
|
|
|
+ dev->propbit);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
/* Clickpads report only left button */
|
|
|
__clear_bit(BTN_RIGHT, dev->keybit);
|
|
|
__clear_bit(BTN_MIDDLE, dev->keybit);
|
|
@@ -1593,7 +1644,7 @@ static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode)
|
|
|
priv->capabilities, priv->ext_cap, priv->ext_cap_0c,
|
|
|
priv->board_id, priv->firmware_id);
|
|
|
|
|
|
- set_input_params(psmouse->dev, priv);
|
|
|
+ set_input_params(psmouse, priv);
|
|
|
|
|
|
/*
|
|
|
* Encode touchpad model so that it can be used to set
|