linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] pinctrl: amd: Clear GPIO debounce for suspend
@ 2025-06-26 22:14 Mario Limonciello
  2025-06-27  8:04 ` Hans de Goede
  0 siblings, 1 reply; 3+ messages in thread
From: Mario Limonciello @ 2025-06-26 22:14 UTC (permalink / raw)
  To: mario.limonciello, Basavaraj.Natikar, Shyam-sundar.S-k,
	linus.walleij, dmitry.torokhov, hansg
  Cc: linux-gpio

From: Mario Limonciello <mario.limonciello@amd.com>

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>
---
 drivers/pinctrl/pinctrl-amd.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index 5cf3db6d78b79..4276bbe77e0e9 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -979,6 +979,13 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend
 				  pin, is_suspend ? "suspend" : "hibernate");
 		}
 
+		/* clear debounce */
+		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);
 	}
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] pinctrl: amd: Clear GPIO debounce for suspend
  2025-06-26 22:14 [PATCH] pinctrl: amd: Clear GPIO debounce for suspend Mario Limonciello
@ 2025-06-27  8:04 ` Hans de Goede
  2025-06-27 14:45   ` Mario Limonciello
  0 siblings, 1 reply; 3+ messages in thread
From: Hans de Goede @ 2025-06-27  8:04 UTC (permalink / raw)
  To: Mario Limonciello, mario.limonciello, Basavaraj.Natikar,
	Shyam-sundar.S-k, linus.walleij, dmitry.torokhov
  Cc: linux-gpio

Hi Mario,

On 27-Jun-25 12:14 AM, Mario Limonciello wrote:
> From: Mario Limonciello <mario.limonciello@amd.com>
> 
> 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.

Nice I do think this is a better solution then disabling hw-debounce
in soc-button-array as we did before.

> 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>
> ---
>  drivers/pinctrl/pinctrl-amd.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
> index 5cf3db6d78b79..4276bbe77e0e9 100644
> --- a/drivers/pinctrl/pinctrl-amd.c
> +++ b/drivers/pinctrl/pinctrl-amd.c
> @@ -979,6 +979,13 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend
>  				  pin, is_suspend ? "suspend" : "hibernate");
>  		}
>  
> +		/* clear debounce */
> +		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");
> +		}
> +


I notice that the if () { } block above this checks if a pin is not configured
to be a wakeup src. Since we only need this for wakeup sources maybe put this
in an else block of the if () { } block above this ?

I've not strong preference for doing this change, just something which I noticed
while looking at the code.

Either way this should probably have a comment on why the clearing is done here.

Regards,

Hans



>  		raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
>  	}
>  


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] pinctrl: amd: Clear GPIO debounce for suspend
  2025-06-27  8:04 ` Hans de Goede
@ 2025-06-27 14:45   ` Mario Limonciello
  0 siblings, 0 replies; 3+ messages in thread
From: Mario Limonciello @ 2025-06-27 14:45 UTC (permalink / raw)
  To: Hans de Goede, mario.limonciello, Basavaraj.Natikar,
	Shyam-sundar.S-k, linus.walleij, dmitry.torokhov
  Cc: linux-gpio

On 6/27/2025 3:04 AM, Hans de Goede wrote:
> Hi Mario,
> 
> On 27-Jun-25 12:14 AM, Mario Limonciello wrote:
>> From: Mario Limonciello <mario.limonciello@amd.com>
>>
>> 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.
> 
> Nice I do think this is a better solution then disabling hw-debounce
> in soc-button-array as we did before.

Although it helps this issue and should be harmless I intend to land it 
I do want to note we still have a difference in behavior for Windows and 
Linux in that Windows never programs the hardware debounce for the 
ACPI0011 device.

I think we should still consider a way to keep compatibility of behavior 
(my previous v3 3/4 seemed to do that just fine).

> 
>> 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>
>> ---
>>   drivers/pinctrl/pinctrl-amd.c | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
>> index 5cf3db6d78b79..4276bbe77e0e9 100644
>> --- a/drivers/pinctrl/pinctrl-amd.c
>> +++ b/drivers/pinctrl/pinctrl-amd.c
>> @@ -979,6 +979,13 @@ static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend
>>   				  pin, is_suspend ? "suspend" : "hibernate");
>>   		}
>>   
>> +		/* clear debounce */
>> +		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");
>> +		}
>> +
> 
> 
> I notice that the if () { } block above this checks if a pin is not configured
> to be a wakeup src. Since we only need this for wakeup sources maybe put this
> in an else block of the if () { } block above this ?
> 
> I've not strong preference for doing this change, just something which I noticed
> while looking at the code.
> 
> Either way this should probably have a comment on why the clearing is done here.

I'll respin with an updated comment.  I would rather keep the blocks 
separate so it's clearer in debug logs when multiple workarounds are 
enacted.

> 
> Regards,
> 
> Hans
> 
> 
> 
>>   		raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
>>   	}
>>   
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-06-27 14:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-26 22:14 [PATCH] pinctrl: amd: Clear GPIO debounce for suspend Mario Limonciello
2025-06-27  8:04 ` Hans de Goede
2025-06-27 14:45   ` Mario Limonciello

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).