[PATCH v2 3/3] Input: soc_button_array: Only debounce cherryview and baytrail systems
From: Mario Limonciello <superm1@kernel.org>
Date: 2025-06-25 18:13:52
Also in:
linux-acpi, linux-gpio, lkml
Subsystem:
input (keyboard, mouse, joystick, touchscreen) drivers, the rest · Maintainers:
Dmitry Torokhov, Linus Torvalds
From: Mario Limonciello <mario.limonciello@amd.com>
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@kernel.org>
Fixes: 5c4fa2a6da7fb ("Input: soc_button_array - debounce the buttons")
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
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