Hi, Pali, I don't get your point. Please modify the code if you have an idea.
Best Regards, Masaki Ota -----Original Message----- From: Pali Rohár [mailto:pali.ro...@gmail.com] Sent: Saturday, December 02, 2017 6:08 AM To: Masaki Ota <012ne...@gmail.com> Cc: dmitry.torok...@gmail.com; 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 Wednesday 29 November 2017 17:33:58 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. > > Signed-off-by: Masaki Ota <masaki....@jp.alps.com> > --- > drivers/input/mouse/alps.c | 24 +++++++++++++++++++++--- > 1 file changed, 21 insertions(+), 3 deletions(-) > > diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c > index 850b00e3ad8e..6f092bdd9fc5 100644 > --- a/drivers/input/mouse/alps.c > +++ b/drivers/input/mouse/alps.c > @@ -2541,13 +2541,31 @@ 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; > > + if (!is_dual) { > + /* For support TrackStick of Thinkpad L/E series */ > + 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 +2588,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); Now looking at this change... Is there reason why you are passing psmouse parameter there? Because struct alps_data contains psmouse member. > > return 0; > } -- Pali Rohár pali.ro...@gmail.com