Hi Hans, On Mon, Nov 7, 2022 at 11:10 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > > Hi Benjamin, et. al., > > I have just merged a patch which adds a couple of DMI quirks to disable > the touchpad on/off functionality of the ideapad-laptop module on some models, > because it is causing issues there. > > Patch: https://lore.kernel.org/platform-driver-x86/20221018095323.14591-1-limanyi@xxxxxxxxxxxxx/ > Discussion: https://lore.kernel.org/platform-driver-x86/fdceb6d2-c38c-e8ff-4c19-b01521ca46c0@xxxxxxxxxx/ > > Rather then using DMI quirks I would prefer to just disable it everywhere > where a i2c-attached touchpad is used. Be it either one only attached to > i2c, or one of the synaptics intertouch thingies. I'm still trying to > figure out why the ideapad-laptop module's touchpad control (which > uses the EC + enabling/disabling the i8042 aux-port) matters for > i2c-attached touchpads at all, so I suspect that intertouch might be > a part of it. > > So now I'm wondering if there is some nice way for the ideapad-laptop > code to check if the touchpad is intertouch and/or if it is i2c-attached > only ... > > Any ideas? TL;DR: it's a complete mess. For mostly UEFI/BIOS compatibility, all touchpads on modern laptops have a PS/2 interface. But then, most of the touchpads (and of course not all) can also use I2C or SMBus to communicate. And this is where things are bad: - when using i2c-hid, there is a DT entry that enumerates the touchpad, but sometimes the manufacturers like to reuse the same DT and just enable/disable devices in it, so it's not easy to do. In the i2c-hid case, the PS/2 node has no idea it is not used anymore, and thus is kept up forever - for touchpads using SMBus (on Intel platforms only currently), the enumeration is done at the PS/2 level: there is a byte that says that the touchpad supports another bus or not. This is valid for both Synaptics, and Elan, as you figured out. But in the SMBus case there are many cases where it is not working: if the SMBus doesn't support Host Notify (AMD platforms), or if the enumeration is not working because the touchpad is not happy, etc... So again, in SMBus, we can not disable the PS/2 nodes, because there is a high chance the touchpad will not work. Not to mention that the specific bit to enable the touchpad might also be required when coming back from suspend (not entirely sure though). However, in the Synaptics SMbus case, we took a safer approach (because the SMBus driver is not standard and sometimes breaks on new hardware), so we are using the PnP ID to selectively enable the devices (see smbus_pnp_ids[] in drivers/input/mouse/synaptics.c) In the Elan case, if the touchpad exports the magic bit, we forward it to SMBus as the driver is behaving better with new devices. As a result, from user space, it's easier to know if the device uses smbus/i2c, simply because you can enumerate all devices. But from the kernel, either you have to look for the ACPI tables, and hope that the I2C bus is correctly supported in the system, or you have to talk over PS/2 and hope that the platform supports HostNotify... > > Regards, > > Hans > > p.s. > > Is it possible that Elan touchpads use something similar to intertouch, > or is that a synaptics thing only (under Linux) ? > Yep, see above. If the touchpad says it can be driven through SMBus, we forward it. Cheers, Benjamin