All of lore.kernel.org
 help / color / mirror / Atom feed
From: "phoenix" <phoenix@emc.com.tw>
To: "'Dmitry Torokhov'" <dmitry.torokhov@gmail.com>,
	"'Eirin Nya'" <nyanpasu256@gmail.com>
Cc: <linux-input@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	"'Josh.Chen'" <josh.chen@emc.com.tw>
Subject: RE: [PATCH V2 3/3] Input: elantech - Fix incorrectly halved touchpad range on ELAN v3 touchpads
Date: Tue, 29 Nov 2022 11:47:23 +0800	[thread overview]
Message-ID: <002001d903a5$4a39a800$deacf800$@emc.com.tw> (raw)
In-Reply-To: <Y4T21vl0mJocdpdV@google.com>

Loop Josh

-----Original Message-----
From: Dmitry Torokhov [mailto:dmitry.torokhov@gmail.com] 
Sent: Tuesday, November 29, 2022 1:59 AM
To: Eirin Nya <nyanpasu256@gmail.com>; Phoenix Huang <phoenix@emc.com.tw>
Cc: linux-input@vger.kernel.org; linux-kernel@vger.kernel.org
Subject: Re: [PATCH V2 3/3] Input: elantech - Fix incorrectly halved
touchpad range on ELAN v3 touchpads

On Mon, Nov 28, 2022 at 09:57:51AM -0800, Dmitry Torokhov wrote:
> On Fri, Oct 14, 2022 at 04:15:33AM -0700, Eirin Nya wrote:
> > On Linux 5.19.10, on my laptop (Dell Inspiron 15R SE 7520) with an 
> > Elan
> > v3 touchpad (dmesg says "with firmware version 0x450f02"), the 
> > reported size of my touchpad (in userspace by calling 
> > mtdev_configure() and libevdev_get_abs_maximum(), in kernel space 
> > elantech_device_info::x_max/y_max, either way 1470 by 700) is half 
> > that of the actual touch range (2940 by 1400), and the upper half of 
> > my touchpad reports negative values. As a result, with the Synaptics 
> > or libinput X11 driver set to edge scrolling mode, the entire right 
> > half of my touchpad has x-values past evdev's reported maximum size, 
> > and acts as a giant scrollbar!
> > 
> > The problem is that elantech_setup_ps2() -> 
> > elantech_set_absolute_mode() sets up absolute mode and doubles the 
> > hardware resolution (doubling the hardware's maximum reported x/y 
> > coordinates and its response to ETP_FW_ID_QUERY), *after* 
> > elantech_query_info() fetches the touchpad coordinate system size 
> > using ETP_FW_ID_QUERY, which gets cached and reported to userspace 
> > through ioctl(fd, EVIOCGABS(ABS_X/Y), ...). So the touchpad size 
> > reported to userspace (and used to subtract vertical coordinates from)
is half the maximum position of actual touches.
> > 
> > This patch splits out a function elantech_query_range_v3() which 
> > fetches
> > *only* ETP_FW_ID_QUERY (touchpad size), and calls it a second time 
> > if
> > elantech_set_absolute_mode() enables double-size mode. This means 
> > the first call is redundant and wasted if a second call occurs, but 
> > this minimizes the need to restructure the driver.
> 
> If the setting is indeed double resolution, can we simply multiply 
> x_max and y_max by 2 instead of re-querying it?
> 
> Also let's try adding one of Elan engineers for their take in this.
> Phoenix, do you have any suggestions please?

Argh, adding Phoenix for real now.

> 
> > 
> > Link: 
> > https://lore.kernel.org/linux-input/CAL57YxZNutUVxBtvbVWKMw-V2kqeVB5
> > kTQ5BFdJmN=mdPq8Q8Q@mail.gmail.com/
> > Link: 
> > https://lore.kernel.org/linux-input/20221008093437.72d0f6b0@dell-voi
> > d.nyanpasu256.gmail.com.beta.tailscale.net/
> > Fixes: 37548659bb22 ("Input: elantech - query the min/max 
> > information beforehand too")
> > Signed-off-by: Eirin Nya <nyanpasu256@gmail.com>
> > ---
> > 
> > Notes:
> >     Should we move (elantech_set_absolute_mode ->
> >     elantech_write_reg(...0x0b or 0x01)) *earlier* into
elantech_query_info()
> >     before "query range information"? See discussion at
> >     
> > https://lore.kernel.org/linux-input/20221008093437.72d0f6b0@dell-voi
> > d.nyanpasu256.gmail.com.beta.tailscale.net/
> > 
> >  drivers/input/mouse/elantech.c | 30 ++++++++++++++++++++++++++----
> >  1 file changed, 26 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/input/mouse/elantech.c 
> > b/drivers/input/mouse/elantech.c index 263779c031..a2176f0fd3 100644
> > --- a/drivers/input/mouse/elantech.c
> > +++ b/drivers/input/mouse/elantech.c
> > @@ -1006,6 +1006,9 @@ static void
elantech_set_rate_restore_reg_07(struct psmouse *psmouse,
> >  		psmouse_err(psmouse, "restoring reg_07 failed\n");  }
> >  
> > +static int elantech_query_range_v3(struct psmouse *psmouse,
> > +				   struct elantech_device_info *info);
> > +
> >  /*
> >   * Put the touchpad into absolute mode
> >   */
> > @@ -1047,6 +1050,14 @@ static int elantech_set_absolute_mode(struct
psmouse *psmouse)
> >  		if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
> >  			rc = -1;
> >  
> > +		/*
> > +		 * If we boost hardware resolution, we have to re-query
> > +		 * info->x_max and y_max.
> > +		 */
> > +		if (etd->info.set_hw_resolution)
> > +			if (elantech_query_range_v3(psmouse, &etd->info))
> > +				rc = -1;
> > +
> >  		break;
> >  
> >  	case 4:
> > @@ -1671,6 +1682,20 @@ static int elantech_set_properties(struct
elantech_device_info *info)
> >  	return 0;
> >  }
> >  
> > +static int elantech_query_range_v3(struct psmouse *psmouse,
> > +				   struct elantech_device_info *info) {
> > +	unsigned char param[3];
> > +
> > +	if (info->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
> > +		return -EINVAL;
> > +
> > +	info->x_max = (0x0f & param[0]) << 8 | param[1];
> > +	info->y_max = (0xf0 & param[0]) << 4 | param[2];
> > +
> > +	return 0;
> > +}
> > +
> >  static int elantech_query_info(struct psmouse *psmouse,
> >  			       struct elantech_device_info *info)  { @@
-1826,11 +1851,8 
> > @@ static int elantech_query_info(struct psmouse *psmouse,
> >  		break;
> >  
> >  	case 3:
> > -		if (info->send_cmd(psmouse, ETP_FW_ID_QUERY, param))
> > +		if (elantech_query_range_v3(psmouse, info))
> >  			return -EINVAL;
> > -
> > -		info->x_max = (0x0f & param[0]) << 8 | param[1];
> > -		info->y_max = (0xf0 & param[0]) << 4 | param[2];
> >  		break;
> >  
> >  	case 4:
> > --
> > 2.38.0
> > 
> 
> Thanks.
> 
> --
> Dmitry

--
Dmitry


  reply	other threads:[~2022-11-29  3:48 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-14 11:15 [PATCH V2 0/3] Input: Fix incorrectly halved touchpad range on ELAN v3 touchpads Eirin Nya
2022-10-14 11:15 ` [PATCH V2 1/3] Input: elantech - Remove redundant field elantech_data::y_max Eirin Nya
2022-10-14 13:10   ` Mattijs Korpershoek
2022-11-28  9:18     ` Eirin Nya
2022-11-28 13:29       ` Mattijs Korpershoek
2022-11-28 18:01         ` Dmitry Torokhov
2022-10-14 11:15 ` [PATCH V2 2/3] Input: elantech - Remove redundant field elantech_data::width Eirin Nya
2022-10-14 13:14   ` Mattijs Korpershoek
2022-10-14 11:15 ` [PATCH V2 3/3] Input: elantech - Fix incorrectly halved touchpad range on ELAN v3 touchpads Eirin Nya
2022-10-14 13:26   ` Mattijs Korpershoek
2022-11-28 17:57   ` Dmitry Torokhov
2022-11-28 17:58     ` Dmitry Torokhov
2022-11-29  3:47       ` phoenix [this message]
2022-11-30 11:22       ` phoenix
2022-12-03  7:42         ` Eirin Nya
2022-12-05 13:28           ` Mattijs Korpershoek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='002001d903a5$4a39a800$deacf800$@emc.com.tw' \
    --to=phoenix@emc.com.tw \
    --cc=dmitry.torokhov@gmail.com \
    --cc=josh.chen@emc.com.tw \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nyanpasu256@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.