Message ID | 20250113195308.244372-2-rha051117@gmail.com (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | Force ELAN06FA touchpad I2C bus freq to 100KHz | expand |
On Mon, Jan 13, 2025 at 02:52:37PM -0500, Randolph Ha wrote: > When a 400KHz freq is used on this model of ELAN touchpad in Linux, > excessive smoothing (similar to when the touchpad's firmware detects > a noisy signal) is sometimes applied. As some devices' (e.g, Lenovo > V15 G4) ACPI tables specify a 400KHz frequency for this device and > some I2C busses (e.g, Designware I2C) default to a 400KHz freq, > force the speed to 100KHz as a workaround. > > For future investigation: This problem may be related to the default > HCNT/LCNT values given by some busses' drivers, because they are not > specified in the aforementioned devices' ACPI tables, and because > the device works without issues on Windows at what is expected to be > a 400KHz frequency. The root cause of the issue is not known. > > Signed-off-by: Randolph Ha <rha051117@gmail.com> > Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Applied to for-next, thanks! Some comments for next contributions. Please send new patches always in a new thread. It was a bit confusing here to find the latest one. Also, while the code change looks easy, this is not a trivial change, so trivial@ is not appropriate here. Trivial patches are more like typos or whitespace fixes. Nonetheless, thanks again for your efforts in timely debugging this!
diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c index 14ae0cfc325e..d2499f302b50 100644 --- a/drivers/i2c/i2c-core-acpi.c +++ b/drivers/i2c/i2c-core-acpi.c @@ -355,6 +355,25 @@ static const struct acpi_device_id i2c_acpi_force_400khz_device_ids[] = { {} }; +static const struct acpi_device_id i2c_acpi_force_100khz_device_ids[] = { + /* + * When a 400KHz freq is used on this model of ELAN touchpad in Linux, + * excessive smoothing (similar to when the touchpad's firmware detects + * a noisy signal) is sometimes applied. As some devices' (e.g, Lenovo + * V15 G4) ACPI tables specify a 400KHz frequency for this device and + * some I2C busses (e.g, Designware I2C) default to a 400KHz freq, + * force the speed to 100KHz as a workaround. + * + * For future investigation: This problem may be related to the default + * HCNT/LCNT values given by some busses' drivers, because they are not + * specified in the aforementioned devices' ACPI tables, and because + * the device works without issues on Windows at what is expected to be + * a 400KHz frequency. The root cause of the issue is not known. + */ + { "ELAN06FA", 0 }, + {} +}; + static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level, void *data, void **return_value) { @@ -373,6 +392,9 @@ static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level, if (acpi_match_device_ids(adev, i2c_acpi_force_400khz_device_ids) == 0) lookup->force_speed = I2C_MAX_FAST_MODE_FREQ; + if (acpi_match_device_ids(adev, i2c_acpi_force_100khz_device_ids) == 0) + lookup->force_speed = I2C_MAX_STANDARD_MODE_FREQ; + return AE_OK; }