Re: [PATCH] ELAN touchpad i2c_hid bugs fix

From: Andy Shevchenko
Date: Thu Mar 21 2019 - 04:55:42 EST


On Thu, Mar 21, 2019 at 6:08 AM Kai-Heng Feng
<kai.heng.feng@xxxxxxxxxxxxx> wrote:
> at 01:18, Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote:
> > On Wed, Mar 20, 2019 at 6:55 PM Kai-Heng Feng
> > <kai.heng.feng@xxxxxxxxxxxxx> wrote:
> >> at 23:39, Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
> >>> On 3/20/19 3:37 PM, Benjamin Tissoires wrote:

> >> Recently we found that Elan touchpad doesnât like GpioInt() from its _CRS.
> >> Once the Interrupt() is used instead, the issue goes away.
> >
> > IIRC i2c core tries to get interrupt from Interrupt() resource and
> > then falls back to GpioInt().
> > See i2c_acpi_get_info() and i2c_device_probe().
>
> Hereâs its ASL:

> Name (SBFB, ResourceTemplate ()
> {
> I2cSerialBusV2 (0x002C, ControllerInitiated, 0x00061A80,
> AddressingMode7Bit, "\\_SB.PCI0.I2C4",
> 0x00, ResourceConsumer, , Exclusive,
> )
> })
> Name (SBFG, ResourceTemplate ()
> {
> GpioInt (Level, ActiveLow, ExclusiveAndWake, PullUp, 0x0000,
> "\\_SB.GPO1", 0x00, ResourceConsumer, ,
> )
> { // Pin list
> 0x0012
> }
> })
> Name (SBFI, ResourceTemplate ()
> {
> Interrupt (ResourceConsumer, Level, ActiveLow, ExclusiveAndWake, ,, )
> {
> 0x0000003C,
> }
> })

> Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
> {

> If ((OSYS < 0x07DC))
> {
> Return (SBFI) /* \_SB_.PCI0.I2C4.TPD0.SBFI */
> }

This will return only Interrupt() resource

>
> Return (ConcatenateResTemplate (SBFB, SBFG))

This one I2cSerialBus() and GpioInt().

> }


> }
> }
>
> Change SBFG to SBFI in its _CRS can workaround the issue.
> Is ASL in this form possible to do the flow you described?

Since it's enumerated in Linux as I2C device, it means it gets I2C and
GPIO resources.
So, no, it's not possible.

What are you describing might tell us about one of the following:
- touchpad should be switched to PS/2 mode in order to get working
- GPIO resource is not correct / bug in GPIO driver

I don't believe the first one is a case here.
If GPIO resource is not correct and main OS has some quirks, we need
to do similar in Linux.
Otherwise, debugging GPIO driver, starting from what exactly (pin
number, pin settings, etc) gets i2c-hid module.

Note, ACPICA and related stuff is done in order to be Windows compatible.
If you have settings in BIOS that defines OS to boot, it should be
chosen Windows.

--
With Best Regards,
Andy Shevchenko