Hi, Pali,

1) Yes, but we don't have FW update plan.
 And this device works as SMBus in Windows, so this issue happens on only Linux.

2) Yes.

Best Regards,
Masaki Ota
-----Original Message-----
From: Pali Rohár [mailto:pali.ro...@gmail.com] 
Sent: Monday, November 20, 2017 5:30 PM
To: Masaki Ota <012ne...@gmail.com>; dmitry.torok...@gmail.com
Cc: benjamin.tissoi...@redhat.com; aaron...@canonical.com; j...@ristioja.ee; 太田 
真喜 Masaki Ota <masaki....@jp.alps.com>; linux-in...@vger.kernel.org; 
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Support TrackStick of Thinkpad L570

On Monday 20 November 2017 16:55:30 Masaki Ota wrote:
> From: Masaki Ota <masaki....@jp.alps.com>
> - The issue is that Thinkpad L570 TrackStick does not work. Because the main 
> interface of Thinkpad L570 device is SMBus, so ALPS overlooked PS2 interface 
> Firmware setting of TrackStick. The detail is that TrackStick otp bit is 
> disabled.
> - Add the code that checks 0xD7 address value. This value is device number 
> information, so we can identify the device by checking this value.
> - If we check 0xD7 value, we need to enable Command mode and after check the 
> value we need to disable Command mode, then we have to enable the device(0xF4 
> command).
> - Thinkpad L570 device number is 0x0C or 0x1D. If it is TRUE, enable 
> ALPS_DUALPOINT flag.

So, the root of this problem is in ALPS firmware which provides wrong 
information to kernel?

Masaki, I have two questions:

1) Can ALPS or Lenovo release a new firmware update for this Thinkpad to
   fix this issue?

2) Have all Thinkpad L570 machines trackpoint?

Dmitry, as a workaround for firmware bug on particular notebook, would not be 
better to check DMI information and DMI based hook?

> Signed-off-by: Masaki Ota <masaki....@jp.alps.com>
> ---
>  drivers/input/mouse/alps.c | 21 ++++++++++++++++++---
>  1 file changed, 18 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c 
> index 850b00e3ad8e..cce52104ed5a 100644
> --- a/drivers/input/mouse/alps.c
> +++ b/drivers/input/mouse/alps.c
> @@ -2541,13 +2541,28 @@ static int 
> alps_update_btn_info_ss4_v2(unsigned char otp[][4],  }
>  
>  static int alps_update_dual_info_ss4_v2(unsigned char otp[][4],
> -                                    struct alps_data *priv)
> +                                    struct alps_data *priv,
> +                                     struct psmouse *psmouse)
>  {
>       bool is_dual = false;
> +     int reg_val = 0;
> +     struct ps2dev *ps2dev = &psmouse->ps2dev;
>  
> -     if (IS_SS4PLUS_DEV(priv->dev_id))
> +     if (IS_SS4PLUS_DEV(priv->dev_id)) {
>               is_dual = (otp[0][0] >> 4) & 0x01;
>  
> +             /* For support TrackStick of Thinkpad L570 device */
> +             if (alps_exit_command_mode(psmouse) == 0 &&
> +                     alps_enter_command_mode(psmouse) == 0) {
> +                     reg_val = alps_command_mode_read_reg(psmouse, 0xD7);
> +             }
> +             alps_exit_command_mode(psmouse);
> +             ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE);
> +
> +             if (reg_val == 0x0C || reg_val == 0x1D)
> +                     is_dual = true;
> +     }
> +
>       if (is_dual)
>               priv->flags |= ALPS_DUALPOINT |
>                                       ALPS_DUALPOINT_WITH_PRESSURE;
> @@ -2570,7 +2585,7 @@ static int alps_set_defaults_ss4_v2(struct 
> psmouse *psmouse,
>  
>       alps_update_btn_info_ss4_v2(otp, priv);
>  
> -     alps_update_dual_info_ss4_v2(otp, priv);
> +     alps_update_dual_info_ss4_v2(otp, priv, psmouse);
>  
>       return 0;
>  }

--
Pali Rohár
pali.ro...@gmail.com

Reply via email to