Loading drivers/input/mouse/alps.c +7 −23 Original line number Diff line number Diff line Loading @@ -827,7 +827,7 @@ static void alps_process_packet_v6(struct psmouse *psmouse) unsigned char *packet = psmouse->packet; struct input_dev *dev = psmouse->dev; struct input_dev *dev2 = priv->dev2; int x, y, z, left, right, middle; int x, y, z; /* * We can use Byte5 to distinguish if the packet is from Touchpad Loading @@ -847,9 +847,6 @@ static void alps_process_packet_v6(struct psmouse *psmouse) x = packet[1] | ((packet[3] & 0x20) << 2); y = packet[2] | ((packet[3] & 0x40) << 1); z = packet[4]; left = packet[3] & 0x01; right = packet[3] & 0x02; middle = packet[3] & 0x04; /* To prevent the cursor jump when finger lifted */ if (x == 0x7F && y == 0x7F && z == 0x7F) Loading @@ -859,9 +856,7 @@ static void alps_process_packet_v6(struct psmouse *psmouse) input_report_rel(dev2, REL_X, (char)x / 4); input_report_rel(dev2, REL_Y, -((char)y / 4)); input_report_key(dev2, BTN_LEFT, left); input_report_key(dev2, BTN_RIGHT, right); input_report_key(dev2, BTN_MIDDLE, middle); psmouse_report_standard_buttons(dev2, packet[3]); input_sync(dev2); return; Loading @@ -871,8 +866,6 @@ static void alps_process_packet_v6(struct psmouse *psmouse) x = packet[1] | ((packet[3] & 0x78) << 4); y = packet[2] | ((packet[4] & 0x78) << 4); z = packet[5]; left = packet[3] & 0x01; right = packet[3] & 0x02; if (z > 30) input_report_key(dev, BTN_TOUCH, 1); Loading @@ -888,8 +881,8 @@ static void alps_process_packet_v6(struct psmouse *psmouse) input_report_key(dev, BTN_TOOL_FINGER, z > 0); /* v6 touchpad does not have middle button */ input_report_key(dev, BTN_LEFT, left); input_report_key(dev, BTN_RIGHT, right); packet[3] &= ~BIT(2); psmouse_report_standard_buttons(dev2, packet[3]); input_sync(dev); } Loading Loading @@ -1098,7 +1091,7 @@ static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) struct alps_data *priv = psmouse->private; unsigned char *packet = psmouse->packet; struct input_dev *dev2 = priv->dev2; int x, y, z, left, right, middle; int x, y, z; /* It should be a DualPoint when received trackstick packet */ if (!(priv->flags & ALPS_DUALPOINT)) { Loading @@ -1112,16 +1105,10 @@ static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) ((packet[3] & 0x20) << 1); z = (packet[5] & 0x3f) | ((packet[3] & 0x80) >> 1); left = (packet[1] & 0x01); right = (packet[1] & 0x02) >> 1; middle = (packet[1] & 0x04) >> 2; input_report_rel(dev2, REL_X, (char)x); input_report_rel(dev2, REL_Y, -((char)y)); input_report_key(dev2, BTN_LEFT, left); input_report_key(dev2, BTN_RIGHT, right); input_report_key(dev2, BTN_MIDDLE, middle); psmouse_report_standard_buttons(dev2, packet[1]); input_sync(dev2); } Loading Loading @@ -1503,10 +1490,7 @@ static void alps_report_bare_ps2_packet(struct psmouse *psmouse, alps_report_buttons(dev, dev2, packet[0] & 1, packet[0] & 2, packet[0] & 4); input_report_rel(dev, REL_X, packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0); input_report_rel(dev, REL_Y, packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0); psmouse_report_standard_motion(dev, packet); input_sync(dev); } Loading drivers/input/mouse/elantech.c +16 −24 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param) { if (psmouse_sliced_command(psmouse, c) || if (ps2_sliced_command(&psmouse->ps2dev, c) || ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c); return -1; Loading Loading @@ -107,8 +107,8 @@ static int elantech_read_reg(struct psmouse *psmouse, unsigned char reg, switch (etd->hw_version) { case 1: if (psmouse_sliced_command(psmouse, ETP_REGISTER_READ) || psmouse_sliced_command(psmouse, reg) || if (ps2_sliced_command(&psmouse->ps2dev, ETP_REGISTER_READ) || ps2_sliced_command(&psmouse->ps2dev, reg) || ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { rc = -1; } Loading Loading @@ -162,9 +162,9 @@ static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg, switch (etd->hw_version) { case 1: if (psmouse_sliced_command(psmouse, ETP_REGISTER_WRITE) || psmouse_sliced_command(psmouse, reg) || psmouse_sliced_command(psmouse, val) || if (ps2_sliced_command(&psmouse->ps2dev, ETP_REGISTER_WRITE) || ps2_sliced_command(&psmouse->ps2dev, reg) || ps2_sliced_command(&psmouse->ps2dev, val) || ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) { rc = -1; } Loading Loading @@ -279,8 +279,8 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); psmouse_report_standard_buttons(dev, packet[0]); if (etd->fw_version < 0x020000 && (etd->capabilities[0] & ETP_CAP_HAS_ROCKER)) { Loading Loading @@ -390,8 +390,7 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse) input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); input_report_key(dev, BTN_TOOL_QUADTAP, fingers == 4); input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); psmouse_report_standard_buttons(dev, packet[0]); if (etd->reports_pressure) { input_report_abs(dev, ABS_PRESSURE, pres); input_report_abs(dev, ABS_TOOL_WIDTH, width); Loading Loading @@ -434,9 +433,7 @@ static void elantech_report_trackpoint(struct psmouse *psmouse, x = packet[4] - (int)((packet[1]^0x80) << 1); y = (int)((packet[2]^0x80) << 1) - packet[5]; input_report_key(tp_dev, BTN_LEFT, packet[0] & 0x01); input_report_key(tp_dev, BTN_RIGHT, packet[0] & 0x02); input_report_key(tp_dev, BTN_MIDDLE, packet[0] & 0x04); psmouse_report_standard_buttons(tp_dev, packet[0]); input_report_rel(tp_dev, REL_X, x); input_report_rel(tp_dev, REL_Y, y); Loading Loading @@ -526,12 +523,10 @@ static void elantech_report_absolute_v3(struct psmouse *psmouse, input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); /* For clickpads map both buttons to BTN_LEFT */ if (etd->fw_version & 0x001000) { if (etd->fw_version & 0x001000) input_report_key(dev, BTN_LEFT, packet[0] & 0x03); } else { input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); } else psmouse_report_standard_buttons(dev, packet[0]); input_report_abs(dev, ABS_PRESSURE, pres); input_report_abs(dev, ABS_TOOL_WIDTH, width); Loading @@ -546,13 +541,10 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) unsigned char *packet = psmouse->packet; /* For clickpads map both buttons to BTN_LEFT */ if (etd->fw_version & 0x001000) { if (etd->fw_version & 0x001000) input_report_key(dev, BTN_LEFT, packet[0] & 0x03); } else { input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04); } else psmouse_report_standard_buttons(dev, packet[0]); input_mt_report_pointer_emulation(dev, true); input_sync(dev); Loading drivers/input/mouse/lifebook.c +33 −29 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include <linux/libps2.h> #include <linux/dmi.h> #include <linux/slab.h> #include <linux/types.h> #include "psmouse.h" #include "lifebook.h" Loading Loading @@ -136,7 +137,7 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) struct lifebook_data *priv = psmouse->private; struct input_dev *dev1 = psmouse->dev; struct input_dev *dev2 = priv ? priv->dev2 : NULL; unsigned char *packet = psmouse->packet; u8 *packet = psmouse->packet; bool relative_packet = packet[0] & 0x08; if (relative_packet || !lifebook_use_6byte_proto) { Loading Loading @@ -188,14 +189,10 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) } if (dev2) { if (relative_packet) { input_report_rel(dev2, REL_X, ((packet[0] & 0x10) ? packet[1] - 256 : packet[1])); input_report_rel(dev2, REL_Y, -(int)((packet[0] & 0x20) ? packet[2] - 256 : packet[2])); } input_report_key(dev2, BTN_LEFT, packet[0] & 0x01); input_report_key(dev2, BTN_RIGHT, packet[0] & 0x02); if (relative_packet) psmouse_report_standard_motion(dev2, packet); psmouse_report_standard_buttons(dev2, packet[0]); input_sync(dev2); } Loading @@ -205,10 +202,12 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) static int lifebook_absolute_mode(struct psmouse *psmouse) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param; u8 param; int error; if (psmouse_reset(psmouse)) return -1; error = psmouse_reset(psmouse); if (error) return error; /* * Enable absolute output -- ps2_command fails always but if Loading @@ -224,15 +223,15 @@ static int lifebook_absolute_mode(struct psmouse *psmouse) static void lifebook_relative_mode(struct psmouse *psmouse) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param = 0x06; u8 param = 0x06; ps2_command(ps2dev, ¶m, PSMOUSE_CMD_SETRES); } static void lifebook_set_resolution(struct psmouse *psmouse, unsigned int resolution) { static const unsigned char params[] = { 0, 1, 2, 2, 3 }; unsigned char p; static const u8 params[] = { 0, 1, 2, 2, 3 }; u8 p; if (resolution == 0 || resolution > 400) resolution = 400; Loading @@ -257,11 +256,11 @@ static void lifebook_disconnect(struct psmouse *psmouse) int lifebook_detect(struct psmouse *psmouse, bool set_properties) { if (!lifebook_present) return -1; return -ENXIO; if (desired_serio_phys && strcmp(psmouse->ps2dev.serio->phys, desired_serio_phys)) return -1; return -ENXIO; if (set_properties) { psmouse->vendor = "Fujitsu"; Loading Loading @@ -294,10 +293,10 @@ static int lifebook_create_relative_device(struct psmouse *psmouse) dev2->id.version = 0x0000; dev2->dev.parent = &psmouse->ps2dev.serio->dev; dev2->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); dev2->relbit[BIT_WORD(REL_X)] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); dev2->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); input_set_capability(dev2, EV_REL, REL_X); input_set_capability(dev2, EV_REL, REL_Y); input_set_capability(dev2, EV_KEY, BTN_LEFT); input_set_capability(dev2, EV_KEY, BTN_RIGHT); error = input_register_device(priv->dev2); if (error) Loading @@ -316,21 +315,26 @@ int lifebook_init(struct psmouse *psmouse) { struct input_dev *dev1 = psmouse->dev; int max_coord = lifebook_use_6byte_proto ? 4096 : 1024; int error; if (lifebook_absolute_mode(psmouse)) return -1; error = lifebook_absolute_mode(psmouse); if (error) return error; dev1->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); dev1->relbit[0] = 0; dev1->keybit[BIT_WORD(BTN_MOUSE)] = 0; dev1->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); /* Clear default capabilities */ bitmap_zero(dev1->evbit, EV_CNT); bitmap_zero(dev1->relbit, REL_CNT); bitmap_zero(dev1->keybit, KEY_CNT); input_set_capability(dev1, EV_KEY, BTN_TOUCH); input_set_abs_params(dev1, ABS_X, 0, max_coord, 0, 0); input_set_abs_params(dev1, ABS_Y, 0, max_coord, 0, 0); if (!desired_serio_phys) { if (lifebook_create_relative_device(psmouse)) { error = lifebook_create_relative_device(psmouse); if (error) { lifebook_relative_mode(psmouse); return -1; return error; } } Loading drivers/input/mouse/logips2pp.c +87 −65 Original line number Diff line number Diff line Loading @@ -9,9 +9,11 @@ * the Free Software Foundation. */ #include <linux/bitops.h> #include <linux/input.h> #include <linux/serio.h> #include <linux/libps2.h> #include <linux/types.h> #include "psmouse.h" #include "logips2pp.h" Loading @@ -22,12 +24,12 @@ #define PS2PP_KIND_TRACKMAN 4 /* Logitech mouse features */ #define PS2PP_WHEEL 0x01 #define PS2PP_HWHEEL 0x02 #define PS2PP_SIDE_BTN 0x04 #define PS2PP_EXTRA_BTN 0x08 #define PS2PP_TASK_BTN 0x10 #define PS2PP_NAV_BTN 0x20 #define PS2PP_WHEEL BIT(0) #define PS2PP_HWHEEL BIT(1) #define PS2PP_SIDE_BTN BIT(2) #define PS2PP_EXTRA_BTN BIT(3) #define PS2PP_TASK_BTN BIT(4) #define PS2PP_NAV_BTN BIT(5) struct ps2pp_info { u8 model; Loading @@ -42,7 +44,7 @@ struct ps2pp_info { static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) { struct input_dev *dev = psmouse->dev; unsigned char *packet = psmouse->packet; u8 *packet = psmouse->packet; if (psmouse->pktcnt < 3) return PSMOUSE_GOOD_DATA; Loading @@ -58,28 +60,30 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) case 0x0d: /* Mouse extra info */ input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL, (int) (packet[2] & 8) - (int) (packet[2] & 7)); input_report_key(dev, BTN_SIDE, (packet[2] >> 4) & 1); input_report_key(dev, BTN_EXTRA, (packet[2] >> 5) & 1); input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL, -sign_extend32(packet[2], 3)); input_report_key(dev, BTN_SIDE, packet[2] & BIT(4)); input_report_key(dev, BTN_EXTRA, packet[2] & BIT(5)); break; case 0x0e: /* buttons 4, 5, 6, 7, 8, 9, 10 info */ input_report_key(dev, BTN_SIDE, (packet[2]) & 1); input_report_key(dev, BTN_EXTRA, (packet[2] >> 1) & 1); input_report_key(dev, BTN_BACK, (packet[2] >> 3) & 1); input_report_key(dev, BTN_FORWARD, (packet[2] >> 4) & 1); input_report_key(dev, BTN_TASK, (packet[2] >> 2) & 1); input_report_key(dev, BTN_SIDE, packet[2] & BIT(0)); input_report_key(dev, BTN_EXTRA, packet[2] & BIT(1)); input_report_key(dev, BTN_TASK, packet[2] & BIT(2)); input_report_key(dev, BTN_BACK, packet[2] & BIT(3)); input_report_key(dev, BTN_FORWARD, packet[2] & BIT(4)); break; case 0x0f: /* TouchPad extra info */ input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL, (int) ((packet[2] >> 4) & 8) - (int) ((packet[2] >> 4) & 7)); packet[0] = packet[2] | 0x08; input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL, -sign_extend32(packet[2] >> 4, 3)); packet[0] = packet[2] | BIT(3); break; default: Loading @@ -88,16 +92,14 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) (packet[1] >> 4) | (packet[0] & 0x30)); break; } psmouse_report_standard_buttons(dev, packet[0]); } else { /* Standard PS/2 motion data */ input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0); input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0); psmouse_report_standard_packet(dev, packet); } input_report_key(dev, BTN_LEFT, packet[0] & 1); input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1); input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1); input_sync(dev); return PSMOUSE_FULL_PACKET; Loading @@ -111,13 +113,17 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) * Ugly. */ static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned char command) static int ps2pp_cmd(struct psmouse *psmouse, u8 *param, u8 command) { if (psmouse_sliced_command(psmouse, command)) return -1; int error; error = ps2_sliced_command(&psmouse->ps2dev, command); if (error) return error; if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300)) return -1; error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300); if (error) return error; return 0; } Loading @@ -133,7 +139,7 @@ static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned cha static void ps2pp_set_smartscroll(struct psmouse *psmouse, bool smartscroll) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param[4]; u8 param[4]; ps2pp_cmd(psmouse, param, 0x32); Loading Loading @@ -179,11 +185,12 @@ PSMOUSE_DEFINE_ATTR(smartscroll, S_IWUSR | S_IRUGO, NULL, * also good reasons to use it, let the user decide). */ static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolution) static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolution) { if (resolution > 400) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param = 3; u8 param = 3; ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); Loading @@ -196,7 +203,8 @@ static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolutio static void ps2pp_disconnect(struct psmouse *psmouse) { device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); } static const struct ps2pp_info *get_model_info(unsigned char model) Loading Loading @@ -269,24 +277,24 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, struct input_dev *input_dev = psmouse->dev; if (model_info->features & PS2PP_SIDE_BTN) __set_bit(BTN_SIDE, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_SIDE); if (model_info->features & PS2PP_EXTRA_BTN) __set_bit(BTN_EXTRA, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_EXTRA); if (model_info->features & PS2PP_TASK_BTN) __set_bit(BTN_TASK, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_TASK); if (model_info->features & PS2PP_NAV_BTN) { __set_bit(BTN_FORWARD, input_dev->keybit); __set_bit(BTN_BACK, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_FORWARD); input_set_capability(input_dev, EV_KEY, BTN_BACK); } if (model_info->features & PS2PP_WHEEL) __set_bit(REL_WHEEL, input_dev->relbit); input_set_capability(input_dev, EV_REL, REL_WHEEL); if (model_info->features & PS2PP_HWHEEL) __set_bit(REL_HWHEEL, input_dev->relbit); input_set_capability(input_dev, EV_REL, REL_HWHEEL); switch (model_info->kind) { Loading Loading @@ -318,6 +326,30 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, } } static int ps2pp_setup_protocol(struct psmouse *psmouse, const struct ps2pp_info *model_info) { int error; psmouse->protocol_handler = ps2pp_process_byte; psmouse->pktsize = 3; if (model_info->kind != PS2PP_KIND_TP3) { psmouse->set_resolution = ps2pp_set_resolution; psmouse->disconnect = ps2pp_disconnect; error = device_create_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); if (error) { psmouse_err(psmouse, "failed to create smartscroll sysfs attribute, error: %d\n", error); return error; } } return 0; } /* * Logitech magic init. Detect whether the mouse is a Logitech one Loading @@ -328,9 +360,9 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, int ps2pp_detect(struct psmouse *psmouse, bool set_properties) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param[4]; unsigned char model, buttons; const struct ps2pp_info *model_info; u8 param[4]; u8 model, buttons; bool use_ps2pp = false; int error; Loading @@ -346,7 +378,7 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) buttons = param[1]; if (!model || !buttons) return -1; return -ENXIO; model_info = get_model_info(model); if (model_info) { Loading @@ -368,7 +400,8 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) param[0] = 0; if (!ps2_command(ps2dev, param, 0x13d1) && param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) { param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) { use_ps2pp = true; } Loading @@ -387,7 +420,9 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) } } else { psmouse_warn(psmouse, "Detected unknown Logitech mouse model %d\n", model); psmouse_warn(psmouse, "Detected unknown Logitech mouse model %d\n", model); } if (set_properties) { Loading @@ -395,31 +430,18 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) psmouse->model = model; if (use_ps2pp) { psmouse->protocol_handler = ps2pp_process_byte; psmouse->pktsize = 3; if (model_info->kind != PS2PP_KIND_TP3) { psmouse->set_resolution = ps2pp_set_resolution; psmouse->disconnect = ps2pp_disconnect; error = device_create_file(&ps2dev->serio->dev, &psmouse_attr_smartscroll.dattr); if (error) { psmouse_err(psmouse, "failed to create smartscroll sysfs attribute, error: %d\n", error); return -1; } } error = ps2pp_setup_protocol(psmouse, model_info); if (error) return error; } if (buttons >= 3) __set_bit(BTN_MIDDLE, psmouse->dev->keybit); input_set_capability(psmouse->dev, EV_KEY, BTN_MIDDLE); if (model_info) ps2pp_set_model_properties(psmouse, model_info, use_ps2pp); } return use_ps2pp ? 0 : -1; return use_ps2pp ? 0 : -ENXIO; } drivers/input/mouse/psmouse-base.c +103 −86 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
drivers/input/mouse/alps.c +7 −23 Original line number Diff line number Diff line Loading @@ -827,7 +827,7 @@ static void alps_process_packet_v6(struct psmouse *psmouse) unsigned char *packet = psmouse->packet; struct input_dev *dev = psmouse->dev; struct input_dev *dev2 = priv->dev2; int x, y, z, left, right, middle; int x, y, z; /* * We can use Byte5 to distinguish if the packet is from Touchpad Loading @@ -847,9 +847,6 @@ static void alps_process_packet_v6(struct psmouse *psmouse) x = packet[1] | ((packet[3] & 0x20) << 2); y = packet[2] | ((packet[3] & 0x40) << 1); z = packet[4]; left = packet[3] & 0x01; right = packet[3] & 0x02; middle = packet[3] & 0x04; /* To prevent the cursor jump when finger lifted */ if (x == 0x7F && y == 0x7F && z == 0x7F) Loading @@ -859,9 +856,7 @@ static void alps_process_packet_v6(struct psmouse *psmouse) input_report_rel(dev2, REL_X, (char)x / 4); input_report_rel(dev2, REL_Y, -((char)y / 4)); input_report_key(dev2, BTN_LEFT, left); input_report_key(dev2, BTN_RIGHT, right); input_report_key(dev2, BTN_MIDDLE, middle); psmouse_report_standard_buttons(dev2, packet[3]); input_sync(dev2); return; Loading @@ -871,8 +866,6 @@ static void alps_process_packet_v6(struct psmouse *psmouse) x = packet[1] | ((packet[3] & 0x78) << 4); y = packet[2] | ((packet[4] & 0x78) << 4); z = packet[5]; left = packet[3] & 0x01; right = packet[3] & 0x02; if (z > 30) input_report_key(dev, BTN_TOUCH, 1); Loading @@ -888,8 +881,8 @@ static void alps_process_packet_v6(struct psmouse *psmouse) input_report_key(dev, BTN_TOOL_FINGER, z > 0); /* v6 touchpad does not have middle button */ input_report_key(dev, BTN_LEFT, left); input_report_key(dev, BTN_RIGHT, right); packet[3] &= ~BIT(2); psmouse_report_standard_buttons(dev2, packet[3]); input_sync(dev); } Loading Loading @@ -1098,7 +1091,7 @@ static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) struct alps_data *priv = psmouse->private; unsigned char *packet = psmouse->packet; struct input_dev *dev2 = priv->dev2; int x, y, z, left, right, middle; int x, y, z; /* It should be a DualPoint when received trackstick packet */ if (!(priv->flags & ALPS_DUALPOINT)) { Loading @@ -1112,16 +1105,10 @@ static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) ((packet[3] & 0x20) << 1); z = (packet[5] & 0x3f) | ((packet[3] & 0x80) >> 1); left = (packet[1] & 0x01); right = (packet[1] & 0x02) >> 1; middle = (packet[1] & 0x04) >> 2; input_report_rel(dev2, REL_X, (char)x); input_report_rel(dev2, REL_Y, -((char)y)); input_report_key(dev2, BTN_LEFT, left); input_report_key(dev2, BTN_RIGHT, right); input_report_key(dev2, BTN_MIDDLE, middle); psmouse_report_standard_buttons(dev2, packet[1]); input_sync(dev2); } Loading Loading @@ -1503,10 +1490,7 @@ static void alps_report_bare_ps2_packet(struct psmouse *psmouse, alps_report_buttons(dev, dev2, packet[0] & 1, packet[0] & 2, packet[0] & 4); input_report_rel(dev, REL_X, packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0); input_report_rel(dev, REL_Y, packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0); psmouse_report_standard_motion(dev, packet); input_sync(dev); } Loading
drivers/input/mouse/elantech.c +16 −24 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param) { if (psmouse_sliced_command(psmouse, c) || if (ps2_sliced_command(&psmouse->ps2dev, c) || ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c); return -1; Loading Loading @@ -107,8 +107,8 @@ static int elantech_read_reg(struct psmouse *psmouse, unsigned char reg, switch (etd->hw_version) { case 1: if (psmouse_sliced_command(psmouse, ETP_REGISTER_READ) || psmouse_sliced_command(psmouse, reg) || if (ps2_sliced_command(&psmouse->ps2dev, ETP_REGISTER_READ) || ps2_sliced_command(&psmouse->ps2dev, reg) || ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { rc = -1; } Loading Loading @@ -162,9 +162,9 @@ static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg, switch (etd->hw_version) { case 1: if (psmouse_sliced_command(psmouse, ETP_REGISTER_WRITE) || psmouse_sliced_command(psmouse, reg) || psmouse_sliced_command(psmouse, val) || if (ps2_sliced_command(&psmouse->ps2dev, ETP_REGISTER_WRITE) || ps2_sliced_command(&psmouse->ps2dev, reg) || ps2_sliced_command(&psmouse->ps2dev, val) || ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) { rc = -1; } Loading Loading @@ -279,8 +279,8 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); psmouse_report_standard_buttons(dev, packet[0]); if (etd->fw_version < 0x020000 && (etd->capabilities[0] & ETP_CAP_HAS_ROCKER)) { Loading Loading @@ -390,8 +390,7 @@ static void elantech_report_absolute_v2(struct psmouse *psmouse) input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); input_report_key(dev, BTN_TOOL_QUADTAP, fingers == 4); input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); psmouse_report_standard_buttons(dev, packet[0]); if (etd->reports_pressure) { input_report_abs(dev, ABS_PRESSURE, pres); input_report_abs(dev, ABS_TOOL_WIDTH, width); Loading Loading @@ -434,9 +433,7 @@ static void elantech_report_trackpoint(struct psmouse *psmouse, x = packet[4] - (int)((packet[1]^0x80) << 1); y = (int)((packet[2]^0x80) << 1) - packet[5]; input_report_key(tp_dev, BTN_LEFT, packet[0] & 0x01); input_report_key(tp_dev, BTN_RIGHT, packet[0] & 0x02); input_report_key(tp_dev, BTN_MIDDLE, packet[0] & 0x04); psmouse_report_standard_buttons(tp_dev, packet[0]); input_report_rel(tp_dev, REL_X, x); input_report_rel(tp_dev, REL_Y, y); Loading Loading @@ -526,12 +523,10 @@ static void elantech_report_absolute_v3(struct psmouse *psmouse, input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); /* For clickpads map both buttons to BTN_LEFT */ if (etd->fw_version & 0x001000) { if (etd->fw_version & 0x001000) input_report_key(dev, BTN_LEFT, packet[0] & 0x03); } else { input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); } else psmouse_report_standard_buttons(dev, packet[0]); input_report_abs(dev, ABS_PRESSURE, pres); input_report_abs(dev, ABS_TOOL_WIDTH, width); Loading @@ -546,13 +541,10 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) unsigned char *packet = psmouse->packet; /* For clickpads map both buttons to BTN_LEFT */ if (etd->fw_version & 0x001000) { if (etd->fw_version & 0x001000) input_report_key(dev, BTN_LEFT, packet[0] & 0x03); } else { input_report_key(dev, BTN_LEFT, packet[0] & 0x01); input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04); } else psmouse_report_standard_buttons(dev, packet[0]); input_mt_report_pointer_emulation(dev, true); input_sync(dev); Loading
drivers/input/mouse/lifebook.c +33 −29 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include <linux/libps2.h> #include <linux/dmi.h> #include <linux/slab.h> #include <linux/types.h> #include "psmouse.h" #include "lifebook.h" Loading Loading @@ -136,7 +137,7 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) struct lifebook_data *priv = psmouse->private; struct input_dev *dev1 = psmouse->dev; struct input_dev *dev2 = priv ? priv->dev2 : NULL; unsigned char *packet = psmouse->packet; u8 *packet = psmouse->packet; bool relative_packet = packet[0] & 0x08; if (relative_packet || !lifebook_use_6byte_proto) { Loading Loading @@ -188,14 +189,10 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) } if (dev2) { if (relative_packet) { input_report_rel(dev2, REL_X, ((packet[0] & 0x10) ? packet[1] - 256 : packet[1])); input_report_rel(dev2, REL_Y, -(int)((packet[0] & 0x20) ? packet[2] - 256 : packet[2])); } input_report_key(dev2, BTN_LEFT, packet[0] & 0x01); input_report_key(dev2, BTN_RIGHT, packet[0] & 0x02); if (relative_packet) psmouse_report_standard_motion(dev2, packet); psmouse_report_standard_buttons(dev2, packet[0]); input_sync(dev2); } Loading @@ -205,10 +202,12 @@ static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) static int lifebook_absolute_mode(struct psmouse *psmouse) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param; u8 param; int error; if (psmouse_reset(psmouse)) return -1; error = psmouse_reset(psmouse); if (error) return error; /* * Enable absolute output -- ps2_command fails always but if Loading @@ -224,15 +223,15 @@ static int lifebook_absolute_mode(struct psmouse *psmouse) static void lifebook_relative_mode(struct psmouse *psmouse) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param = 0x06; u8 param = 0x06; ps2_command(ps2dev, ¶m, PSMOUSE_CMD_SETRES); } static void lifebook_set_resolution(struct psmouse *psmouse, unsigned int resolution) { static const unsigned char params[] = { 0, 1, 2, 2, 3 }; unsigned char p; static const u8 params[] = { 0, 1, 2, 2, 3 }; u8 p; if (resolution == 0 || resolution > 400) resolution = 400; Loading @@ -257,11 +256,11 @@ static void lifebook_disconnect(struct psmouse *psmouse) int lifebook_detect(struct psmouse *psmouse, bool set_properties) { if (!lifebook_present) return -1; return -ENXIO; if (desired_serio_phys && strcmp(psmouse->ps2dev.serio->phys, desired_serio_phys)) return -1; return -ENXIO; if (set_properties) { psmouse->vendor = "Fujitsu"; Loading Loading @@ -294,10 +293,10 @@ static int lifebook_create_relative_device(struct psmouse *psmouse) dev2->id.version = 0x0000; dev2->dev.parent = &psmouse->ps2dev.serio->dev; dev2->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); dev2->relbit[BIT_WORD(REL_X)] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); dev2->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); input_set_capability(dev2, EV_REL, REL_X); input_set_capability(dev2, EV_REL, REL_Y); input_set_capability(dev2, EV_KEY, BTN_LEFT); input_set_capability(dev2, EV_KEY, BTN_RIGHT); error = input_register_device(priv->dev2); if (error) Loading @@ -316,21 +315,26 @@ int lifebook_init(struct psmouse *psmouse) { struct input_dev *dev1 = psmouse->dev; int max_coord = lifebook_use_6byte_proto ? 4096 : 1024; int error; if (lifebook_absolute_mode(psmouse)) return -1; error = lifebook_absolute_mode(psmouse); if (error) return error; dev1->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); dev1->relbit[0] = 0; dev1->keybit[BIT_WORD(BTN_MOUSE)] = 0; dev1->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); /* Clear default capabilities */ bitmap_zero(dev1->evbit, EV_CNT); bitmap_zero(dev1->relbit, REL_CNT); bitmap_zero(dev1->keybit, KEY_CNT); input_set_capability(dev1, EV_KEY, BTN_TOUCH); input_set_abs_params(dev1, ABS_X, 0, max_coord, 0, 0); input_set_abs_params(dev1, ABS_Y, 0, max_coord, 0, 0); if (!desired_serio_phys) { if (lifebook_create_relative_device(psmouse)) { error = lifebook_create_relative_device(psmouse); if (error) { lifebook_relative_mode(psmouse); return -1; return error; } } Loading
drivers/input/mouse/logips2pp.c +87 −65 Original line number Diff line number Diff line Loading @@ -9,9 +9,11 @@ * the Free Software Foundation. */ #include <linux/bitops.h> #include <linux/input.h> #include <linux/serio.h> #include <linux/libps2.h> #include <linux/types.h> #include "psmouse.h" #include "logips2pp.h" Loading @@ -22,12 +24,12 @@ #define PS2PP_KIND_TRACKMAN 4 /* Logitech mouse features */ #define PS2PP_WHEEL 0x01 #define PS2PP_HWHEEL 0x02 #define PS2PP_SIDE_BTN 0x04 #define PS2PP_EXTRA_BTN 0x08 #define PS2PP_TASK_BTN 0x10 #define PS2PP_NAV_BTN 0x20 #define PS2PP_WHEEL BIT(0) #define PS2PP_HWHEEL BIT(1) #define PS2PP_SIDE_BTN BIT(2) #define PS2PP_EXTRA_BTN BIT(3) #define PS2PP_TASK_BTN BIT(4) #define PS2PP_NAV_BTN BIT(5) struct ps2pp_info { u8 model; Loading @@ -42,7 +44,7 @@ struct ps2pp_info { static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) { struct input_dev *dev = psmouse->dev; unsigned char *packet = psmouse->packet; u8 *packet = psmouse->packet; if (psmouse->pktcnt < 3) return PSMOUSE_GOOD_DATA; Loading @@ -58,28 +60,30 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) case 0x0d: /* Mouse extra info */ input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL, (int) (packet[2] & 8) - (int) (packet[2] & 7)); input_report_key(dev, BTN_SIDE, (packet[2] >> 4) & 1); input_report_key(dev, BTN_EXTRA, (packet[2] >> 5) & 1); input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL, -sign_extend32(packet[2], 3)); input_report_key(dev, BTN_SIDE, packet[2] & BIT(4)); input_report_key(dev, BTN_EXTRA, packet[2] & BIT(5)); break; case 0x0e: /* buttons 4, 5, 6, 7, 8, 9, 10 info */ input_report_key(dev, BTN_SIDE, (packet[2]) & 1); input_report_key(dev, BTN_EXTRA, (packet[2] >> 1) & 1); input_report_key(dev, BTN_BACK, (packet[2] >> 3) & 1); input_report_key(dev, BTN_FORWARD, (packet[2] >> 4) & 1); input_report_key(dev, BTN_TASK, (packet[2] >> 2) & 1); input_report_key(dev, BTN_SIDE, packet[2] & BIT(0)); input_report_key(dev, BTN_EXTRA, packet[2] & BIT(1)); input_report_key(dev, BTN_TASK, packet[2] & BIT(2)); input_report_key(dev, BTN_BACK, packet[2] & BIT(3)); input_report_key(dev, BTN_FORWARD, packet[2] & BIT(4)); break; case 0x0f: /* TouchPad extra info */ input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL, (int) ((packet[2] >> 4) & 8) - (int) ((packet[2] >> 4) & 7)); packet[0] = packet[2] | 0x08; input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL, -sign_extend32(packet[2] >> 4, 3)); packet[0] = packet[2] | BIT(3); break; default: Loading @@ -88,16 +92,14 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) (packet[1] >> 4) | (packet[0] & 0x30)); break; } psmouse_report_standard_buttons(dev, packet[0]); } else { /* Standard PS/2 motion data */ input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0); input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0); psmouse_report_standard_packet(dev, packet); } input_report_key(dev, BTN_LEFT, packet[0] & 1); input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1); input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1); input_sync(dev); return PSMOUSE_FULL_PACKET; Loading @@ -111,13 +113,17 @@ static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) * Ugly. */ static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned char command) static int ps2pp_cmd(struct psmouse *psmouse, u8 *param, u8 command) { if (psmouse_sliced_command(psmouse, command)) return -1; int error; error = ps2_sliced_command(&psmouse->ps2dev, command); if (error) return error; if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300)) return -1; error = ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300); if (error) return error; return 0; } Loading @@ -133,7 +139,7 @@ static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned cha static void ps2pp_set_smartscroll(struct psmouse *psmouse, bool smartscroll) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param[4]; u8 param[4]; ps2pp_cmd(psmouse, param, 0x32); Loading Loading @@ -179,11 +185,12 @@ PSMOUSE_DEFINE_ATTR(smartscroll, S_IWUSR | S_IRUGO, NULL, * also good reasons to use it, let the user decide). */ static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolution) static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolution) { if (resolution > 400) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param = 3; u8 param = 3; ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); Loading @@ -196,7 +203,8 @@ static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolutio static void ps2pp_disconnect(struct psmouse *psmouse) { device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); } static const struct ps2pp_info *get_model_info(unsigned char model) Loading Loading @@ -269,24 +277,24 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, struct input_dev *input_dev = psmouse->dev; if (model_info->features & PS2PP_SIDE_BTN) __set_bit(BTN_SIDE, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_SIDE); if (model_info->features & PS2PP_EXTRA_BTN) __set_bit(BTN_EXTRA, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_EXTRA); if (model_info->features & PS2PP_TASK_BTN) __set_bit(BTN_TASK, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_TASK); if (model_info->features & PS2PP_NAV_BTN) { __set_bit(BTN_FORWARD, input_dev->keybit); __set_bit(BTN_BACK, input_dev->keybit); input_set_capability(input_dev, EV_KEY, BTN_FORWARD); input_set_capability(input_dev, EV_KEY, BTN_BACK); } if (model_info->features & PS2PP_WHEEL) __set_bit(REL_WHEEL, input_dev->relbit); input_set_capability(input_dev, EV_REL, REL_WHEEL); if (model_info->features & PS2PP_HWHEEL) __set_bit(REL_HWHEEL, input_dev->relbit); input_set_capability(input_dev, EV_REL, REL_HWHEEL); switch (model_info->kind) { Loading Loading @@ -318,6 +326,30 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, } } static int ps2pp_setup_protocol(struct psmouse *psmouse, const struct ps2pp_info *model_info) { int error; psmouse->protocol_handler = ps2pp_process_byte; psmouse->pktsize = 3; if (model_info->kind != PS2PP_KIND_TP3) { psmouse->set_resolution = ps2pp_set_resolution; psmouse->disconnect = ps2pp_disconnect; error = device_create_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); if (error) { psmouse_err(psmouse, "failed to create smartscroll sysfs attribute, error: %d\n", error); return error; } } return 0; } /* * Logitech magic init. Detect whether the mouse is a Logitech one Loading @@ -328,9 +360,9 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, int ps2pp_detect(struct psmouse *psmouse, bool set_properties) { struct ps2dev *ps2dev = &psmouse->ps2dev; unsigned char param[4]; unsigned char model, buttons; const struct ps2pp_info *model_info; u8 param[4]; u8 model, buttons; bool use_ps2pp = false; int error; Loading @@ -346,7 +378,7 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) buttons = param[1]; if (!model || !buttons) return -1; return -ENXIO; model_info = get_model_info(model); if (model_info) { Loading @@ -368,7 +400,8 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) param[0] = 0; if (!ps2_command(ps2dev, param, 0x13d1) && param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) { param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) { use_ps2pp = true; } Loading @@ -387,7 +420,9 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) } } else { psmouse_warn(psmouse, "Detected unknown Logitech mouse model %d\n", model); psmouse_warn(psmouse, "Detected unknown Logitech mouse model %d\n", model); } if (set_properties) { Loading @@ -395,31 +430,18 @@ int ps2pp_detect(struct psmouse *psmouse, bool set_properties) psmouse->model = model; if (use_ps2pp) { psmouse->protocol_handler = ps2pp_process_byte; psmouse->pktsize = 3; if (model_info->kind != PS2PP_KIND_TP3) { psmouse->set_resolution = ps2pp_set_resolution; psmouse->disconnect = ps2pp_disconnect; error = device_create_file(&ps2dev->serio->dev, &psmouse_attr_smartscroll.dattr); if (error) { psmouse_err(psmouse, "failed to create smartscroll sysfs attribute, error: %d\n", error); return -1; } } error = ps2pp_setup_protocol(psmouse, model_info); if (error) return error; } if (buttons >= 3) __set_bit(BTN_MIDDLE, psmouse->dev->keybit); input_set_capability(psmouse->dev, EV_KEY, BTN_MIDDLE); if (model_info) ps2pp_set_model_properties(psmouse, model_info, use_ps2pp); } return use_ps2pp ? 0 : -1; return use_ps2pp ? 0 : -ENXIO; }
drivers/input/mouse/psmouse-base.c +103 −86 File changed.Preview size limit exceeded, changes collapsed. Show changes