| From: Ulrik De Bie <ulrik.debie-os@e2big.org> |
| Date: Thu, 13 Nov 2014 17:45:12 -0800 |
| Subject: Input: elantech - report the middle button of the touchpad |
| |
| commit f386474e12a560e005ec7899e78f51f6bdc3cf41 upstream. |
| |
| In the past, no elantech was known with 3 touchpad mouse buttons. |
| Fujitsu H730 is the first known elantech with a middle button. This commit |
| enables this middle button. For backwards compatibility, the Fujitsu is |
| detected via DMI, and only for this one 3 buttons will be announced. |
| |
| Reported-by: Stefan Valouch <stefan@valouch.com> |
| Signed-off-by: Ulrik De Bie <ulrik.debie-os@e2big.org> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/input/mouse/elantech.c | 19 +++++++++++++++++++ |
| 1 file changed, 19 insertions(+) |
| |
| --- a/drivers/input/mouse/elantech.c |
| +++ b/drivers/input/mouse/elantech.c |
| @@ -500,6 +500,7 @@ static void elantech_input_sync_v4(struc |
| } 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); |
| } |
| |
| input_mt_report_pointer_emulation(dev, true); |
| @@ -1064,6 +1065,22 @@ static void elantech_set_buttonpad_prop( |
| } |
| |
| /* |
| + * Some hw_version 4 models do have a middle button |
| + */ |
| +static const struct dmi_system_id elantech_dmi_has_middle_button[] = { |
| +#if defined(CONFIG_DMI) && defined(CONFIG_X86) |
| + { |
| + /* Fujitsu H730 has a middle button */ |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
| + DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), |
| + }, |
| + }, |
| +#endif |
| + { } |
| +}; |
| + |
| +/* |
| * Set the appropriate event bits for the input subsystem |
| */ |
| static int elantech_set_input_params(struct psmouse *psmouse) |
| @@ -1082,6 +1099,8 @@ static int elantech_set_input_params(str |
| __clear_bit(EV_REL, dev->evbit); |
| |
| __set_bit(BTN_LEFT, dev->keybit); |
| + if (dmi_check_system(elantech_dmi_has_middle_button)) |
| + __set_bit(BTN_MIDDLE, dev->keybit); |
| __set_bit(BTN_RIGHT, dev->keybit); |
| |
| __set_bit(BTN_TOUCH, dev->keybit); |