[PATCH libinput] touchpad: add a special quirk for the Lenovo x220 with updated firmware

Hans de Goede hdegoede at redhat.com
Fri Dec 11 02:34:56 PST 2015


Hi,

On 11-12-15 02:25, Peter Hutterer wrote:
> If an x220 is updated to the touchpad firmware version 8.1, the touchpad
> suffers from the same issues as the x230 and needs custom acceleration code.
> Unfortunately we cannot detect this otherwise, so it is left to the user as a
> custom hwdb setting.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1264453
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Ugh, well nothing we can do about this:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans



> ---
>   doc/device-configuration-via-udev.dox | 18 ++++++++++++++++++
>   src/evdev-mt-touchpad.c               |  3 ++-
>   src/evdev.c                           |  1 +
>   src/evdev.h                           |  1 +
>   udev/90-libinput-model-quirks.hwdb    | 12 ++++++++++++
>   5 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/doc/device-configuration-via-udev.dox b/doc/device-configuration-via-udev.dox
> index f615cc1..7987073 100644
> --- a/doc/device-configuration-via-udev.dox
> +++ b/doc/device-configuration-via-udev.dox
> @@ -117,4 +117,22 @@ defaults or any other reason. The effects of setting these properties, the
>   format of the property and the value of the property are subject to change
>   at any time.
>
> + at subsection model_specific_configuration_x220fw81 Lenovo x220 with touchpad firmware v8.1
> +
> +The property <b>LIBINPUT_MODEL_LENOVO_X220_TOUCHPAD_FW81</b> may be set by a
> +user in a local hwdb file. This property designates the touchpad on a Lenovo
> +x220 with a touchpad firmware version 8.1. When this firmware version is
> +installed, the touchpad is imprecise. The touchpad device does not send
> +continuos x/y axis position updates, a behavior also observed on its
> +successor model, the Lenovo x230 which has the same firmware version. If the
> +above property is set, libinput adjusts its behavior to better suit this
> +particular model.
> +
> +The touchpad firmware version cannot be detected automatically by libinput,
> +local configuration is required to set this property. Refer to the libinput
> +model quirks hwdb for instructions.
> +
> +This property must not be used for any other purpose, no specific behavior
> +is guaranteed.
> +
>   */
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index 8e2a5c5..8014cc9 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -1566,7 +1566,8 @@ tp_init_accel(struct tp_dispatch *tp, double diagonal)
>   	tp->accel.x_scale_coeff = (DEFAULT_MOUSE_DPI/25.4) / res_x;
>   	tp->accel.y_scale_coeff = (DEFAULT_MOUSE_DPI/25.4) / res_y;
>
> -	if (tp->device->model_flags & EVDEV_MODEL_LENOVO_X230)
> +	if (tp->device->model_flags & EVDEV_MODEL_LENOVO_X230 ||
> +	    tp->device->model_flags & EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81)
>   		filter = create_pointer_accelerator_filter_lenovo_x230(tp->device->dpi);
>   	else
>   		filter = create_pointer_accelerator_filter_touchpad(tp->device->dpi);
> diff --git a/src/evdev.c b/src/evdev.c
> index 83b1c20..85ca640 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1651,6 +1651,7 @@ evdev_read_model_flags(struct evdev_device *device)
>   		enum evdev_device_model model;
>   	} model_map[] = {
>   		{ "LIBINPUT_MODEL_LENOVO_X230", EVDEV_MODEL_LENOVO_X230 },
> +		{ "LIBINPUT_MODEL_LENOVO_X220_TOUCHPAD_FW81", EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81 },
>   		{ "LIBINPUT_MODEL_CHROMEBOOK", EVDEV_MODEL_CHROMEBOOK },
>   		{ "LIBINPUT_MODEL_SYSTEM76_BONOBO", EVDEV_MODEL_SYSTEM76_BONOBO },
>   		{ "LIBINPUT_MODEL_SYSTEM76_GALAGO", EVDEV_MODEL_SYSTEM76_GALAGO },
> diff --git a/src/evdev.h b/src/evdev.h
> index 75a2cb6..09c05e9 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -108,6 +108,7 @@ enum evdev_device_model {
>   	EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD = (1 << 9),
>   	EVDEV_MODEL_JUMPING_SEMI_MT = (1 << 10),
>   	EVDEV_MODEL_ELANTECH_TOUCHPAD = (1 << 11),
> +	EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81 = (1 << 12),
>   };
>
>   struct mt_slot {
> diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
> index cf4fbfa..814ec40 100644
> --- a/udev/90-libinput-model-quirks.hwdb
> +++ b/udev/90-libinput-model-quirks.hwdb
> @@ -67,6 +67,18 @@ libinput:name:Atmel maXTouch Touchpad:dmi:*svn*GOOGLE*:pn*Samus*
>   # LENOVO
>   ##########################################
>
> +# X220 after a bios update updating the touchpad firmware version to 8.1
> +# See https://bugzilla.redhat.com/show_bug.cgi?id=1264453 for details
> +# If the touchpad is unresponsive and dmesg includes this line
> +# 	psmouse serio1: synaptics: Touchpad model: 1, fw: 8.1 [...]
> +# then copy the two lines below into a new file
> +# /etc/udev/hwdb.d/90-libinput-x220-touchpad-fw81.hwdb, then run
> +# sudo udevadm hwdb --update and reboot.
> +#
> +# Copy the two lines below:
> +#libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPadX220*
> +# LIBINPUT_MODEL_LENOVO_X220_TOUCHPAD_FW81=1
> +
>   # X230 (Tablet)
>   libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPadX230*
>    LIBINPUT_MODEL_LENOVO_X230=1
>


More information about the wayland-devel mailing list