pinctrl: amd: Clear GPIO debounce for suspend
authorMario Limonciello <mario.limonciello@amd.com>
Fri, 27 Jun 2025 15:01:46 +0000 (10:01 -0500)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 3 Jul 2025 22:24:45 +0000 (00:24 +0200)
soc-button-array hardcodes a debounce value by means of gpio_keys
which uses pinctrl-amd as a backend to program debounce for a GPIO.

This hardcoded value doesn't match what the firmware intended to be
programmed in _AEI. The hardcoded debounce leads to problems waking
from suspend. There isn't appetite to conditionalize the behavior in
soc-button-array or gpio-keys so clear it when the system suspends to
avoid problems with being able to resume.

Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Hans de Goede <hansg@kernel.org>
Fixes: 5c4fa2a6da7fb ("Input: soc_button_array - debounce the buttons")
Link: https://lore.kernel.org/linux-input/mkgtrb5gt7miyg6kvqdlbu4nj3elym6ijudobpdi26gp4xxay5@rsa6ytrjvj2q/
Link: https://lore.kernel.org/linux-input/20250625215813.3477840-1-superm1@kernel.org/
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Hans de Goede <hansg@kernel.org>
Link: https://lore.kernel.org/20250627150155.3311574-1-superm1@kernel.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-amd.c

index 5cf3db6d78b79af9ac5e7226de239a0d2f9aaacc..b3f0d02aeeb35b9704e8c0965a6f2634182fd8e8 100644 (file)
@@ -979,6 +979,17 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend
                                  pin, is_suspend ? "suspend" : "hibernate");
                }
 
+               /*
+                * debounce enabled over suspend has shown issues with a GPIO
+                * being unable to wake the system, as we're only interested in
+                * the actual wakeup event, clear it.
+                */
+               if (gpio_dev->saved_regs[i] & (DB_CNTRl_MASK << DB_CNTRL_OFF)) {
+                       amd_gpio_set_debounce(gpio_dev, pin, 0);
+                       pm_pr_dbg("Clearing debounce for GPIO #%d during %s.\n",
+                                 pin, is_suspend ? "suspend" : "hibernate");
+               }
+
                raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
        }