From: Mario Limonciello <mario.limonciello@xxxxxxx> commit 5c4fa2a6da7fb ("Input: soc_button_array - debounce the buttons") hardcoded all soc-button-array devices to use a 50ms debounce timeout but this doesn't work on all hardware. The hardware I have on hand actually prescribes in the ASL that the timeout should be 0: GpioInt (Edge, ActiveBoth, Exclusive, PullUp, 0x0000, "\\_SB.GPIO", 0x00, ResourceConsumer, ,) { // Pin list 0x0000 } Many cherryview and baytrail systems don't have accurate values in the ASL for debouncing and thus use software debouncing in gpio_keys. The value to use is programmed in soc_button_array. Detect Cherry View and Baytrail using ACPI HID IDs used for those GPIO controllers and apply the 50ms only for those systems. Cc: Hans de Goede <hansg@xxxxxxxxxx> Fixes: 5c4fa2a6da7fb ("Input: soc_button_array - debounce the buttons") Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> --- v2: * commit message * quirk systems instead of revert --- drivers/input/misc/soc_button_array.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index b8cad415c62ca..56abc93f23e0c 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c @@ -129,6 +129,13 @@ static const struct dmi_system_id dmi_invalid_acpi_index[] = { {} /* Terminating entry */ }; +static const struct acpi_device_id force_software_debounce_ids[] = { + { "INT33FF" }, + { "INT33B2" }, + { "INT33FC" }, + { } +}; + /* * Get the Nth GPIO number from the ACPI object. */ @@ -149,11 +156,17 @@ static int soc_button_lookup_gpio(struct device *dev, int acpi_index, return 0; } +static int soc_button_match_acpi_device_ids(struct device *dev, const void *data) +{ + return acpi_match_device(data, dev) ? 1 : 0; +} + static struct platform_device * soc_button_device_create(struct platform_device *pdev, const struct soc_button_info *button_info, bool autorepeat) { + struct device *quirkdev __free(put_device) = NULL; const struct soc_button_info *info; struct platform_device *pd; struct gpio_keys_button *gpio_keys; @@ -181,6 +194,10 @@ soc_button_device_create(struct platform_device *pdev, if (dmi_id) invalid_acpi_index = (long)dmi_id->driver_data; + quirkdev = bus_find_device(&platform_bus_type, NULL, + force_software_debounce_ids, + soc_button_match_acpi_device_ids); + for (info = button_info; info->name; info++) { if (info->autorepeat != autorepeat) continue; @@ -220,7 +237,8 @@ soc_button_device_create(struct platform_device *pdev, gpio_keys[n_buttons].desc = info->name; gpio_keys[n_buttons].wakeup = info->wakeup; /* These devices often use cheap buttons, use 50 ms debounce */ - gpio_keys[n_buttons].debounce_interval = 50; + if (quirkdev) + gpio_keys[n_buttons].debounce_interval = 50; n_buttons++; } -- 2.43.0