From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: "Raphaël Larocque" <rlarocque@disroot.org>
Cc: linux-input@vger.kernel.org, kees@kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Input: synaptics - retry SMBus intertouch setup when companion is not ready
Date: Tue, 2 Jun 2026 18:00:05 -0700 [thread overview]
Message-ID: <ah96mP0RsFT8JNnC@google.com> (raw)
In-Reply-To: <20260603002046.10697-1-rlarocque@disroot.org>
Hi Raphaël,
On Tue, Jun 02, 2026 at 08:20:46PM -0400, Raphaël Larocque wrote:
> On some machines (here: Lenovo ThinkPad T440p 20AWS0H800),
> the SMBus companion device is not ready
> by the time psmouse probes the Synaptics touchpad
> during early boot. synaptics_setup_intertouch() returns -EAGAIN in
> this situation, but synaptics_init() previously treated this the same
> as any other error and fell through immediately to PS/2 mode. As a
> result, the touchpad and TrackPoint were unresponsive for several
> minutes after a cold boot, until an internal reconnect cycle (which
> already carries retry logic in synaptics_reconnect()) eventually
> succeeded.
>
> Fix this by adding an exponential back-off retry loop in synaptics_init()
> when synaptics_setup_intertouch() returns -EAGAIN: clean up the failed
> state, sleep for 500 ms on the first attempt doubling each time up to
> 4000 ms, then retry. The worst-case added latency at boot is ~7.5 s
> (500 + 1000 + 2000 + 4000 ms), and only for hardware that actually
> reports SYN_CAP_INTERTOUCH. The pattern mirrors what
> synaptics_reconnect() already does after resume.
>
> Tested-by: Raphaël Larocque <rlarocque@disroot.org>
> Signed-off-by: Raphaël Larocque <rlarocque@disroot.org>
> ---
> drivers/input/mouse/synaptics.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
> index c70502e24031..5c1bfff2b16c 100644
> --- a/drivers/input/mouse/synaptics.c
> +++ b/drivers/input/mouse/synaptics.c
> @@ -1918,6 +1918,23 @@ int synaptics_init(struct psmouse *psmouse)
> }
>
> error = synaptics_setup_intertouch(psmouse, &info, true);
> + if (error == -EAGAIN) {
> + /*
> + * On some systems (e.g. ThinkPad T440p) the SMBus
> + * companion device is not yet ready at boot time.
> + * Clean up and retry with exponential back-off,
> + * mirroring synaptics_reconnect().
> + */
> + unsigned int delay = 500;
> +
> + do {
> + psmouse_smbus_cleanup(psmouse);
> + msleep(delay);
> + error = synaptics_setup_intertouch(psmouse, &info, true);
> + delay *= 2;
> + } while (error == -EAGAIN && delay <= 4000);
> + }
> +
The idea here is that if adapter/device is not ready we leave enuough
"breadcumbs" for it to recognize when SMBus companion appears and
complete the initialization without repeatedly cleaning up and retrying
initialization anew.
Could you enable logging and see where the logic fails for you? I am not
too keen on simply adding up to 8 seconds delay to the boot time.
Thanks.
--
Dmitry
prev parent reply other threads:[~2026-06-03 1:00 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 0:20 [PATCH] Input: synaptics - retry SMBus intertouch setup when companion is not ready Raphaël Larocque
2026-06-03 1:00 ` Dmitry Torokhov [this message]
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=ah96mP0RsFT8JNnC@google.com \
--to=dmitry.torokhov@gmail.com \
--cc=kees@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rlarocque@disroot.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox