Skip to content

Commit bfd74cd

Browse files
Randolph HaWolfram Sang
authored andcommitted
i2c: Force ELAN06FA touchpad I2C bus freq to 100KHz
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> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
1 parent b31addf commit bfd74cd

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

drivers/i2c/i2c-core-acpi.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,25 @@ static const struct acpi_device_id i2c_acpi_force_400khz_device_ids[] = {
355355
{}
356356
};
357357

358+
static const struct acpi_device_id i2c_acpi_force_100khz_device_ids[] = {
359+
/*
360+
* When a 400KHz freq is used on this model of ELAN touchpad in Linux,
361+
* excessive smoothing (similar to when the touchpad's firmware detects
362+
* a noisy signal) is sometimes applied. As some devices' (e.g, Lenovo
363+
* V15 G4) ACPI tables specify a 400KHz frequency for this device and
364+
* some I2C busses (e.g, Designware I2C) default to a 400KHz freq,
365+
* force the speed to 100KHz as a workaround.
366+
*
367+
* For future investigation: This problem may be related to the default
368+
* HCNT/LCNT values given by some busses' drivers, because they are not
369+
* specified in the aforementioned devices' ACPI tables, and because
370+
* the device works without issues on Windows at what is expected to be
371+
* a 400KHz frequency. The root cause of the issue is not known.
372+
*/
373+
{ "ELAN06FA", 0 },
374+
{}
375+
};
376+
358377
static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
359378
void *data, void **return_value)
360379
{
@@ -373,6 +392,9 @@ static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
373392
if (acpi_match_device_ids(adev, i2c_acpi_force_400khz_device_ids) == 0)
374393
lookup->force_speed = I2C_MAX_FAST_MODE_FREQ;
375394

395+
if (acpi_match_device_ids(adev, i2c_acpi_force_100khz_device_ids) == 0)
396+
lookup->force_speed = I2C_MAX_STANDARD_MODE_FREQ;
397+
376398
return AE_OK;
377399
}
378400

0 commit comments

Comments
 (0)