Loading drivers/input/mouse/synaptics.c +30 −47 Original line number Diff line number Diff line Loading @@ -190,6 +190,22 @@ static int synaptics_send_cmd(struct psmouse *psmouse, return 0; } static int synaptics_query_int(struct psmouse *psmouse, u8 query_cmd, u32 *val) { int error; union { __be32 be_val; char buf[4]; } resp = { 0 }; error = synaptics_send_cmd(psmouse, query_cmd, resp.buf + 1); if (error) return error; *val = be32_to_cpu(resp.be_val); return 0; } /* * Identify Touchpad * See also the SYN_ID_* macros Loading @@ -197,14 +213,12 @@ static int synaptics_send_cmd(struct psmouse *psmouse, static int synaptics_identify(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char id[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_IDENTIFY, id); error = synaptics_query_int(psmouse, SYN_QUE_IDENTIFY, &info->identity); if (error) return error; info->identity = (id[0] << 16) | (id[1] << 8) | id[2]; return SYN_ID_IS_SYNAPTICS(info->identity) ? 0 : -ENXIO; } Loading @@ -215,15 +229,7 @@ static int synaptics_identify(struct psmouse *psmouse, static int synaptics_model_id(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char mi[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_MODEL, mi); if (error) return error; info->model_id = (mi[0] << 16) | (mi[1] << 8) | mi[2]; return 0; return synaptics_query_int(psmouse, SYN_QUE_MODEL, &info->model_id); } /* Loading @@ -232,29 +238,8 @@ static int synaptics_model_id(struct psmouse *psmouse, static int synaptics_firmware_id(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char fwid[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_FIRMWARE_ID, fwid); if (error) return error; info->firmware_id = (fwid[0] << 16) | (fwid[1] << 8) | fwid[2]; return 0; } static int synaptics_more_extended_queries(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char buf[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_MEXT_CAPAB_10, buf); if (error) return error; info->ext_cap_10 = (buf[0] << 16) | (buf[1] << 8) | buf[2]; return 0; return synaptics_query_int(psmouse, SYN_QUE_FIRMWARE_ID, &info->firmware_id); } /* Loading @@ -278,7 +263,8 @@ static int synaptics_query_modes(struct psmouse *psmouse, info->board_id = ((bid[0] & 0xfc) << 6) | bid[1]; if (SYN_MEXT_CAP_BIT(bid[0])) return synaptics_more_extended_queries(psmouse, info); return synaptics_query_int(psmouse, SYN_QUE_MEXT_CAPAB_10, &info->ext_cap_10); return 0; } Loading @@ -290,14 +276,13 @@ static int synaptics_query_modes(struct psmouse *psmouse, static int synaptics_capability(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char cap[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap); error = synaptics_query_int(psmouse, SYN_QUE_CAPABILITIES, &info->capabilities); if (error) return error; info->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2]; info->ext_cap = info->ext_cap_0c = 0; /* Loading @@ -315,29 +300,27 @@ static int synaptics_capability(struct psmouse *psmouse, info->capabilities = 0; if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 1) { if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) { error = synaptics_query_int(psmouse, SYN_QUE_EXT_CAPAB, &info->ext_cap); if (error) { psmouse_warn(psmouse, "device claims to have extended capabilities, but I'm not able to read them.\n"); } else { info->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2]; /* * if nExtBtn is greater than 8 it should be considered * invalid and treated as 0 */ if (SYN_CAP_MULTI_BUTTON_NO(info->ext_cap) > 8) info->ext_cap &= 0xff0fff; info->ext_cap &= ~SYN_CAP_MB_MASK; } } if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 4) { error = synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap); error = synaptics_query_int(psmouse, SYN_QUE_EXT_CAPAB_0C, &info->ext_cap_0c); if (error) psmouse_warn(psmouse, "device claims to have extended capability 0x0c, but I'm not able to read it.\n"); else info->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2]; } return 0; Loading drivers/input/mouse/synaptics.h +2 −1 Original line number Diff line number Diff line Loading @@ -52,7 +52,8 @@ #define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0)) #define SYN_CAP_SUBMODEL_ID(c) (((c) & 0x00ff00) >> 8) #define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20) #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) #define SYN_CAP_MB_MASK GENMASK(15, 12) #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & SYN_CAP_MB_MASK) >> 12) #define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16) #define SYN_MEXT_CAP_BIT(m) ((m) & (1 << 1)) Loading Loading
drivers/input/mouse/synaptics.c +30 −47 Original line number Diff line number Diff line Loading @@ -190,6 +190,22 @@ static int synaptics_send_cmd(struct psmouse *psmouse, return 0; } static int synaptics_query_int(struct psmouse *psmouse, u8 query_cmd, u32 *val) { int error; union { __be32 be_val; char buf[4]; } resp = { 0 }; error = synaptics_send_cmd(psmouse, query_cmd, resp.buf + 1); if (error) return error; *val = be32_to_cpu(resp.be_val); return 0; } /* * Identify Touchpad * See also the SYN_ID_* macros Loading @@ -197,14 +213,12 @@ static int synaptics_send_cmd(struct psmouse *psmouse, static int synaptics_identify(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char id[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_IDENTIFY, id); error = synaptics_query_int(psmouse, SYN_QUE_IDENTIFY, &info->identity); if (error) return error; info->identity = (id[0] << 16) | (id[1] << 8) | id[2]; return SYN_ID_IS_SYNAPTICS(info->identity) ? 0 : -ENXIO; } Loading @@ -215,15 +229,7 @@ static int synaptics_identify(struct psmouse *psmouse, static int synaptics_model_id(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char mi[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_MODEL, mi); if (error) return error; info->model_id = (mi[0] << 16) | (mi[1] << 8) | mi[2]; return 0; return synaptics_query_int(psmouse, SYN_QUE_MODEL, &info->model_id); } /* Loading @@ -232,29 +238,8 @@ static int synaptics_model_id(struct psmouse *psmouse, static int synaptics_firmware_id(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char fwid[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_FIRMWARE_ID, fwid); if (error) return error; info->firmware_id = (fwid[0] << 16) | (fwid[1] << 8) | fwid[2]; return 0; } static int synaptics_more_extended_queries(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char buf[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_MEXT_CAPAB_10, buf); if (error) return error; info->ext_cap_10 = (buf[0] << 16) | (buf[1] << 8) | buf[2]; return 0; return synaptics_query_int(psmouse, SYN_QUE_FIRMWARE_ID, &info->firmware_id); } /* Loading @@ -278,7 +263,8 @@ static int synaptics_query_modes(struct psmouse *psmouse, info->board_id = ((bid[0] & 0xfc) << 6) | bid[1]; if (SYN_MEXT_CAP_BIT(bid[0])) return synaptics_more_extended_queries(psmouse, info); return synaptics_query_int(psmouse, SYN_QUE_MEXT_CAPAB_10, &info->ext_cap_10); return 0; } Loading @@ -290,14 +276,13 @@ static int synaptics_query_modes(struct psmouse *psmouse, static int synaptics_capability(struct psmouse *psmouse, struct synaptics_device_info *info) { unsigned char cap[3]; int error; error = synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap); error = synaptics_query_int(psmouse, SYN_QUE_CAPABILITIES, &info->capabilities); if (error) return error; info->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2]; info->ext_cap = info->ext_cap_0c = 0; /* Loading @@ -315,29 +300,27 @@ static int synaptics_capability(struct psmouse *psmouse, info->capabilities = 0; if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 1) { if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) { error = synaptics_query_int(psmouse, SYN_QUE_EXT_CAPAB, &info->ext_cap); if (error) { psmouse_warn(psmouse, "device claims to have extended capabilities, but I'm not able to read them.\n"); } else { info->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2]; /* * if nExtBtn is greater than 8 it should be considered * invalid and treated as 0 */ if (SYN_CAP_MULTI_BUTTON_NO(info->ext_cap) > 8) info->ext_cap &= 0xff0fff; info->ext_cap &= ~SYN_CAP_MB_MASK; } } if (SYN_EXT_CAP_REQUESTS(info->capabilities) >= 4) { error = synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap); error = synaptics_query_int(psmouse, SYN_QUE_EXT_CAPAB_0C, &info->ext_cap_0c); if (error) psmouse_warn(psmouse, "device claims to have extended capability 0x0c, but I'm not able to read it.\n"); else info->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2]; } return 0; Loading
drivers/input/mouse/synaptics.h +2 −1 Original line number Diff line number Diff line Loading @@ -52,7 +52,8 @@ #define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0)) #define SYN_CAP_SUBMODEL_ID(c) (((c) & 0x00ff00) >> 8) #define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20) #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) #define SYN_CAP_MB_MASK GENMASK(15, 12) #define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & SYN_CAP_MB_MASK) >> 12) #define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16) #define SYN_MEXT_CAP_BIT(m) ((m) & (1 << 1)) Loading