Re: [PATCH 1/1] Force ELAN06FA touchpad I2C bus freq to 100KHz

R Ha
2025-01-07T12:16:22Z

Hi,

Thanks for clarifying the speed. Seems like this bug is different than
I thought.

In my ACPI table there were no references to HCNT or LCNT
specifically. I'm not sure if this is normal.

In addition, I noticed that there were debug messages in dmesg
relating to the HCNT and LCNT.
I'm not sure if they'll be useful, but here they are (taken from an
unmodified kernel):
[ 3.543648] i2c i2c-14: Successfully instantiated SPD at 0x50
[ 3.543790] Standard Mode HCNT:LCNT = 552:652
[ 3.543794] Fast Mode HCNT:LCNT = 100:200

Here's what I have found with the string "\\_SB.PC00.I2C1" in my ACPI table:
#1
Scope (_SB)
{
Device (PEPD)
{
Name (_HID, "INT33A1" /* Intel Power Engine */) // _HID: Hardware ID
Name (_CID, EisaId ("PNP0D80") /* Windows-compatible System
Power Management Controller */) // _CID: Compatible ID
Name (_UID, One) // _UID: Unique ID
Name (LBUF, Buffer (0xC0){})
Name (PPD0, Package (0x03)
{
"\\_SB.PC00.SAT0",
Zero,
Package (0x02)
{
Zero,
Package (0x03)
{
0xFF,
Zero,
0x81
}
}
})
Name (PPD3, Package (0x03)
{
"\\_SB.PC00.SAT0",
Zero,
Package (0x02)
{
Zero,
Package (0x02)
{
0xFF,
0x03
}
}
})
Name (WWD3, Package (0x03)
{
"\\_SB.PC00.RP04",
Zero,
Package (0x02)
{
Zero,
Package (0x02)
{
0xFF,
0x03
}
}
})
Name (PKD0, Package (0x02)
{
Zero,
Package (0x03)
{
0xFF,
Zero,
0x81
}
})
Name (PKD3, Package (0x02)
{
Zero,
Package (0x02)
{
0xFF,
0x03
}
})
Name (DEVY, Package (0x77)
{
[...]
Package (0x03)
{
"\\_SB.PC00.I2C0",
One,
Package (0x02)
{
Zero,
Package (0x02)
{
0xFF,
0x03
}
}
},

Package (0x03)
{
"\\_SB.PC00.I2C1",
One,
Package (0x02)
{
Zero,
Package (0x02)
{
0xFF,
0x03
}
}
},

Package (0x03)
{
"\\_SB.PC00.XHCI",
One,
Package (0x02)
{
Zero,
Package (0x02)
{
0xFF,
0x03
}
}
},

Package (0x03)
{
"\\_SB.PC00.HDAS",
One,
Package (0x02)
{
Zero,
Package (0x03)
{
0xFF,
Zero,
0x81
}
}
},
[...The rest are similar, only changinng the strings]
})
}
}

#2 (seems related to another device)
Scope (_SB.PC00.I2C1)
{
Device (PA06)
{
Name (_HID, "MCHP1930") // _HID: Hardware ID
Name (_UID, "I2C1&PA06") // _UID: Unique ID
Name (_S0W, 0x03) // _S0W: S0 Device Wake State
Method (_STA, 0, Serialized) // _STA: Status
{
If (POME)
{
Switch (ToInteger (PLID))
{
Case (Package (0x01)
{
0x0C
}

)
{
Return (0x0F)
}
Default
{
Return (Zero)
}

}
}

Return (Zero)
}

Method (_CRS, 0, Serialized) // _CRS: Current Resource Settings
{
Name (RBUF, ResourceTemplate ()
{
I2cSerialBusV2 (0x0000, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PC00.I2C1",
0x00, ResourceConsumer, _Y3A, Exclusive,
)
})
CreateWordField (RBUF, \_SB.PC00.I2C1.PA06._CRS._Y3A._ADR,
BADR) // _ADR: Address
Switch (ToInteger (PLID))
{
Case (Package (0x01)
{
0x0C
}

)
{
BADR = 0x17
}
Default
{
BADR = Zero
}

}

Return (RBUF) /* \_SB_.PC00.I2C1.PA06._CRS.RBUF */
}

Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
{
If ((Arg0 != ToUUID
("033771e0-1705-47b4-9535-d1bbe14d9a09") /* Unknown UUID */))
{
Return (Buffer (One)
{
0x00 // .
})
}

Switch (ToInteger (Arg2))
{
Case (Zero)
{
Switch (ToInteger (Arg1))
{
Case (Zero)
{
Return (Buffer (One)
{
0x03
// .
})
}
Case (One)
{
Return (Buffer (One)
{
0x7F
// .
})
}

}

Break
}
Case (One)
{
Name (PKG1, Package (0x02)
{
Package (0x08)
{
"",
Zero,
"",
Zero,
"",
Zero,
"",
Zero
},

Package (0x08)
{
"",
Zero,
"VBAT_IN_ELPMIC",
0x32,
"V3P3DX_EDP",
0x0A,
"VCC_EDP_BKLT",
0x32
}
})
Switch (ToInteger (PLID))
{
Case (Package (0x01)
{
0x0C
}

)
{
Return (DerefOf (PKG1 [One]))
}
Default
{
Return (DerefOf (PKG1 [Zero]))
}

}
}
Case (0x02)
{
If ((Arg1 < One))
{
Break
}

Name (PKG2, Package (0x02)
{
Package (0x04)
{
Zero,
Zero,
Zero,
Zero
},

Package (0x04)
{
Zero,
0xC350,
0x2710,
0xC350
}
})
Switch (ToInteger (PLID))
{
Case (Package (0x01)
{
0x0C
}

)
{
Return (DerefOf (PKG2 [One]))
}
Default
{
Return (DerefOf (PKG2 [Zero]))
}

}
}
Case (0x03)
{
If ((Arg1 < One))
{
Break
}

Name (BUF3, Package (0x01)
{
0x0F
})
Return (BUF3) /* \_SB_.PC00.I2C1.PA06._DSM.BUF3 */
}
Case (0x04)
{
If ((Arg1 < One))
{
Break
}

Name (BUF4, Package (0x01)
{
Zero
})
Return (BUF4) /* \_SB_.PC00.I2C1.PA06._DSM.BUF4 */
}
Case (0x05)
{
If ((Arg1 < One))
{
Break
}

Name (BUF5, Package (0x02)
{
0x0400,
0x08
})
Return (BUF5) /* \_SB_.PC00.I2C1.PA06._DSM.BUF5 */
}
Case (0x06)
{
If ((Arg1 < One))
{
Break
}

Name (BUF6, Package (0x01)
{
0x0384
})
Return (BUF6) /* \_SB_.PC00.I2C1.PA06._DSM.BUF6 */
}

}

Return (Buffer (One)
{
0x00 // .
})
}
}
}

#3 (also seems related to another device)
ElseIf ((I2SB == One))
{
Scope (_SB.PC00.I2C1)
{
Device (HDAC)
{
Name (_HID, "INT00000") // _HID: Hardware ID
Name (_DDN, "Intel(R) Smart Sound Technology Audio Codec")
// _DDN: DOS Device Name
Name (_UID, One) // _UID: Unique ID
Name (CADR, Zero)
Name (CDIS, Zero)
Method (_INI, 0, NotSerialized) // _INI: Initialize
{
If ((I2SC == One))
{
_HID = "INT34C2"
_CID = "INT34C2"
CADR = 0x1C
}
ElseIf ((I2SC == 0x02))
{
_HID = "10EC1308"
_CID = "10EC1308"
CADR = 0x10
}
ElseIf ((I2SC == 0x03))
{
_HID = "ESSX8326"
_CID = "ESSX8326"
_DDN = "ESSX Codec Controller 8326 "
}
}

Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
If ((I2SC == 0x03))
{
Name (SBFB, ResourceTemplate ()
{
I2cSerialBusV2 (0x0018, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PC00.I2C0",
0x00, ResourceConsumer, , Exclusive,
)
I2cSerialBusV2 (0x0009, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PC00.I2C0",
0x00, ResourceConsumer, , Exclusive,
)
})
Name (PBUF, ResourceTemplate ()
{
GpioIo (Exclusive, PullDefault, 0x0000,
0x0000, IoRestrictionOutputOnly,
"\\_SB.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
Name (SBFG, ResourceTemplate ()
{
GpioInt (Edge, ActiveBoth, ExclusiveAndWake,
PullNone, 0x0000,
"\\_SB.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
CreateWordField (PBUF, 0x17, PWRP)
PWRP = GNUM (0x09030006)
CreateWordField (SBFG, 0x17, INTP)
INTP = GNUM (0x09030007)
Return (ConcatenateResTemplate (SBFB,
ConcatenateResTemplate (PBUF, SBFG)))
}
Else
{
Return (ConcatenateResTemplate (IICB (CADR, I2SB),
INTB (I2SI, Zero, Zero)))
}
}

Method (_STA, 0, NotSerialized) // _STA: Status
{
If (((I2SC != Zero) && (CDIS != One)))
{
Return (0x0F)
}

If ((CDIS == One))
{
Return (0x0D)
}

Return (Zero)
}

Method (_SRS, 1, Serialized) // _SRS: Set Resource Settings
{
CDIS = Zero
}

Method (_DIS, 0, NotSerialized) // _DIS: Disable Device
{
CDIS = One
}

Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
If ((Arg0 == Buffer (0x10)
{
/* 0000 */ 0x04, 0x0C, 0x80, 0xA9, 0x16,
0xE0, 0x3E, 0x34, // ......>4
/* 0008 */ 0x41, 0xF4, 0x6B, 0xCC, 0xE7,
0x0F, 0x43, 0x32 // A.k...C2
}))
{
If ((Arg2 == Zero))
{
Return (0x55)
}

[...Rest are similar to above, for values of Arg2
from 0 to DF]
}

Return (0xFF)
}
}
}
}