* [PATCH v3 0/4] Fix soc-button-array debounce @ 2025-06-25 21:58 Mario Limonciello 2025-06-25 21:58 ` [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce Mario Limonciello ` (4 more replies) 0 siblings, 5 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-25 21:58 UTC (permalink / raw) To: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello From: Mario Limonciello <mario.limonciello@amd.com> I have some hardware in front of me that uses the soc-button-array driver but the power button doesn't work. Digging into it, it's because the ASL prescribes a debounce of 0 for the power button, but the soc-button-array driver hardcodes 50ms. Hardcoding it to what the ASL expects the power button works. I looked at the callpath into the GPIO core and I believe it's because the debounce value from _CRS is never programmed to the hardware the way that the GPIO gets setup. This series add that programming path and then sets the hardcoded value on on some quirked systems. Hopefully Hans can confirm this continues to work on the hardware that he originally developed the hardcoding for. --- v3: * Use Hans suggestion to force software debounce instead of a quirk * Fix a resume issue identified from testing this series Mario Limonciello (4): gpiolib: acpi: Add a helper for programming debounce gpiolib: acpi: Program debounce when finding GPIO Input: Don't program hw debounce for soc_button_array devices Input: Don't send fake button presses to wake system drivers/gpio/gpiolib-acpi-core.c | 25 ++++++++++++++----------- drivers/input/keyboard/gpio_keys.c | 14 ++++++-------- drivers/input/misc/soc_button_array.c | 1 + include/linux/gpio_keys.h | 2 ++ 4 files changed, 23 insertions(+), 19 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce 2025-06-25 21:58 [PATCH v3 0/4] Fix soc-button-array debounce Mario Limonciello @ 2025-06-25 21:58 ` Mario Limonciello 2025-06-26 14:29 ` Andy Shevchenko 2025-06-25 21:58 ` [PATCH v3 2/4] gpiolib: acpi: Program debounce when finding GPIO Mario Limonciello ` (3 subsequent siblings) 4 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-25 21:58 UTC (permalink / raw) To: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello From: Mario Limonciello <mario.limonciello@amd.com> Debounce is programmed in two places and considered non-fatal in one of them. Introduce a helper for programming debounce and show a warning when failing to program. This is a difference in behavior for the call in acpi_dev_gpio_irq_wake_get_by(). Reviewed-by: Hans de Goede <hansg@kernel.org> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- drivers/gpio/gpiolib-acpi-core.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/gpio/gpiolib-acpi-core.c b/drivers/gpio/gpiolib-acpi-core.c index 12b24a717e43f..1895e45bd9f16 100644 --- a/drivers/gpio/gpiolib-acpi-core.c +++ b/drivers/gpio/gpiolib-acpi-core.c @@ -291,6 +291,17 @@ acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio, int polarity) return GPIOD_ASIS; } +static void acpi_set_debounce_timeout(struct gpio_desc *desc, unsigned int timeout) +{ + int ret; + + /* ACPI uses hundredths of milliseconds units */ + ret = gpio_set_debounce_timeout(desc, timeout * 10); + if (ret) + dev_warn(&desc->gdev->dev, + "Failed to set debounce-timeout: %d\n", ret); +} + static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip, struct acpi_resource_gpio *agpio, unsigned int index, @@ -300,18 +311,12 @@ static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip, enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio, polarity); unsigned int pin = agpio->pin_table[index]; struct gpio_desc *desc; - int ret; desc = gpiochip_request_own_desc(chip, pin, label, polarity, flags); if (IS_ERR(desc)) return desc; - /* ACPI uses hundredths of milliseconds units */ - ret = gpio_set_debounce_timeout(desc, agpio->debounce_timeout * 10); - if (ret) - dev_warn(chip->parent, - "Failed to set debounce-timeout for pin 0x%04X, err %d\n", - pin, ret); + acpi_set_debounce_timeout(desc, agpio->debounce_timeout); return desc; } @@ -1025,10 +1030,7 @@ int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id, if (ret < 0) return ret; - /* ACPI uses hundredths of milliseconds units */ - ret = gpio_set_debounce_timeout(desc, info.debounce * 10); - if (ret) - return ret; + acpi_set_debounce_timeout(desc, info.debounce); irq_flags = acpi_dev_get_irq_type(info.triggering, info.polarity); -- 2.43.0 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce 2025-06-25 21:58 ` [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce Mario Limonciello @ 2025-06-26 14:29 ` Andy Shevchenko 2025-06-26 16:04 ` Mario Limonciello 0 siblings, 1 reply; 53+ messages in thread From: Andy Shevchenko @ 2025-06-26 14:29 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Wed, Jun 25, 2025 at 04:58:10PM -0500, Mario Limonciello wrote: > > Debounce is programmed in two places and considered non-fatal in one of > them. Introduce a helper for programming debounce and show a warning > when failing to program. > This is a difference in behavior for the call > in acpi_dev_gpio_irq_wake_get_by(). When I meant "both", I was thinking of the _single_ existing case and new one which you are about to add. In principle, I think changing behaviour here is undesired. We provoke BIOS writers to make mistakes with debounce settings in GpioInt() resources. I agree on the patch... > - /* ACPI uses hundredths of milliseconds units */ > - ret = gpio_set_debounce_timeout(desc, info.debounce * 10); > - if (ret) > - return ret; > + acpi_set_debounce_timeout(desc, info.debounce); ...except this hunk. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce 2025-06-26 14:29 ` Andy Shevchenko @ 2025-06-26 16:04 ` Mario Limonciello 0 siblings, 0 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 16:04 UTC (permalink / raw) To: Andy Shevchenko Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/2025 9:29 AM, Andy Shevchenko wrote: > On Wed, Jun 25, 2025 at 04:58:10PM -0500, Mario Limonciello wrote: >> >> Debounce is programmed in two places and considered non-fatal in one of >> them. Introduce a helper for programming debounce and show a warning >> when failing to program. > >> This is a difference in behavior for the call >> in acpi_dev_gpio_irq_wake_get_by(). > > When I meant "both", I was thinking of the _single_ existing case and new one > which you are about to add. In principle, I think changing behaviour here is > undesired. We provoke BIOS writers to make mistakes with debounce settings in > GpioInt() resources. > > I agree on the patch... > >> - /* ACPI uses hundredths of milliseconds units */ >> - ret = gpio_set_debounce_timeout(desc, info.debounce * 10); >> - if (ret) >> - return ret; >> + acpi_set_debounce_timeout(desc, info.debounce); > > ...except this hunk. > OK in that case I'll just squash patches 1 and 2 together, pick up Hans' tag and drop this hunk. ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v3 2/4] gpiolib: acpi: Program debounce when finding GPIO 2025-06-25 21:58 [PATCH v3 0/4] Fix soc-button-array debounce Mario Limonciello 2025-06-25 21:58 ` [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce Mario Limonciello @ 2025-06-25 21:58 ` Mario Limonciello 2025-06-26 14:31 ` Andy Shevchenko 2025-06-25 21:58 ` [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices Mario Limonciello ` (2 subsequent siblings) 4 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-25 21:58 UTC (permalink / raw) To: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello From: Mario Limonciello <mario.limonciello@amd.com> When soc-button-array looks up the GPIO to use it calls acpi_find_gpio() which will parse _CRS. acpi_find_gpio.cold (drivers/gpio/gpiolib-acpi-core.c:953) gpiod_find_and_request (drivers/gpio/gpiolib.c:4598 drivers/gpio/gpiolib.c:4625) gpiod_get_index (drivers/gpio/gpiolib.c:4877) The GPIO is setup basically, but the debounce information is discarded. The platform will assert what debounce should be in _CRS, so program it at the time it's available. Reviewed-by: Hans de Goede <hansg@kernel.org> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- v2: * Make non fatal by using helper from patch 1 (Andy) --- drivers/gpio/gpiolib-acpi-core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpio/gpiolib-acpi-core.c b/drivers/gpio/gpiolib-acpi-core.c index 1895e45bd9f16..15222bfc25bb2 100644 --- a/drivers/gpio/gpiolib-acpi-core.c +++ b/drivers/gpio/gpiolib-acpi-core.c @@ -962,6 +962,7 @@ struct gpio_desc *acpi_find_gpio(struct fwnode_handle *fwnode, acpi_gpio_update_gpiod_flags(dflags, &info); acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info); + acpi_set_debounce_timeout(desc, info.debounce); return desc; } -- 2.43.0 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v3 2/4] gpiolib: acpi: Program debounce when finding GPIO 2025-06-25 21:58 ` [PATCH v3 2/4] gpiolib: acpi: Program debounce when finding GPIO Mario Limonciello @ 2025-06-26 14:31 ` Andy Shevchenko 0 siblings, 0 replies; 53+ messages in thread From: Andy Shevchenko @ 2025-06-26 14:31 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Wed, Jun 25, 2025 at 04:58:11PM -0500, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > When soc-button-array looks up the GPIO to use it calls acpi_find_gpio() > which will parse _CRS. > > acpi_find_gpio.cold (drivers/gpio/gpiolib-acpi-core.c:953) > gpiod_find_and_request (drivers/gpio/gpiolib.c:4598 drivers/gpio/gpiolib.c:4625) > gpiod_get_index (drivers/gpio/gpiolib.c:4877) > > The GPIO is setup basically, but the debounce information is discarded. > The platform will assert what debounce should be in _CRS, so program it > at the time it's available. No objections, just a style nit-pick. ... > acpi_gpio_update_gpiod_flags(dflags, &info); > acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info); + blank line > + acpi_set_debounce_timeout(desc, info.debounce); + blank line (this one I'm not sure, need to check the other function style). > return desc; -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices 2025-06-25 21:58 [PATCH v3 0/4] Fix soc-button-array debounce Mario Limonciello 2025-06-25 21:58 ` [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce Mario Limonciello 2025-06-25 21:58 ` [PATCH v3 2/4] gpiolib: acpi: Program debounce when finding GPIO Mario Limonciello @ 2025-06-25 21:58 ` Mario Limonciello 2025-06-26 8:27 ` Hans de Goede 2025-06-26 14:33 ` Andy Shevchenko 2025-06-25 21:58 ` [PATCH v3 4/4] Input: Don't send fake button presses to wake system Mario Limonciello 2025-06-26 14:35 ` [PATCH v3 0/4] Fix soc-button-array debounce Andy Shevchenko 4 siblings, 2 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-25 21:58 UTC (permalink / raw) To: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello From: Mario Limonciello <mario.limonciello@amd.com> Programming a hardware debounce of 50ms causes problems where a button doesn't work properly anymore on some systems. This debounce is intended for compatibility with systems with a mechanical switch so soc_button_array devices should only be using a sofware debounce. Add support for indicating that a driver is only requesting gpio_keys to use software debounce support and mark that in soc_button_array accordingly. Suggested-by: Hans de Goede <hansg@kernel.org> Fixes: 5c4fa2a6da7fb ("Input: soc_button_array - debounce the buttons") Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- drivers/input/keyboard/gpio_keys.c | 7 +++++-- drivers/input/misc/soc_button_array.c | 1 + include/linux/gpio_keys.h | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index f9db86da0818b..773aa5294d269 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -552,8 +552,11 @@ static int gpio_keys_setup_key(struct platform_device *pdev, bool active_low = gpiod_is_active_low(bdata->gpiod); if (button->debounce_interval) { - error = gpiod_set_debounce(bdata->gpiod, - button->debounce_interval * 1000); + if (ddata->pdata->no_hw_debounce) + error = -EINVAL; + else + error = gpiod_set_debounce(bdata->gpiod, + button->debounce_interval * 1000); /* use timer if gpiolib doesn't provide debounce */ if (error < 0) bdata->software_debounce = diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index b8cad415c62ca..dac940455bea8 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c @@ -232,6 +232,7 @@ soc_button_device_create(struct platform_device *pdev, gpio_keys_pdata->buttons = gpio_keys; gpio_keys_pdata->nbuttons = n_buttons; gpio_keys_pdata->rep = autorepeat; + gpio_keys_pdata->no_hw_debounce = TRUE; pd = platform_device_register_resndata(&pdev->dev, "gpio-keys", PLATFORM_DEVID_AUTO, NULL, 0, diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index 80fa930b04c67..c99f74467fda6 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h @@ -48,6 +48,7 @@ struct gpio_keys_button { * @enable: platform hook for enabling the device * @disable: platform hook for disabling the device * @name: input device name + * @no_hw_debounce: avoid programming hardware debounce */ struct gpio_keys_platform_data { const struct gpio_keys_button *buttons; @@ -57,6 +58,7 @@ struct gpio_keys_platform_data { int (*enable)(struct device *dev); void (*disable)(struct device *dev); const char *name; + bool no_hw_debounce; }; #endif -- 2.43.0 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices 2025-06-25 21:58 ` [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices Mario Limonciello @ 2025-06-26 8:27 ` Hans de Goede 2025-06-26 14:33 ` Andy Shevchenko 1 sibling, 0 replies; 53+ messages in thread From: Hans de Goede @ 2025-06-26 8:27 UTC (permalink / raw) To: Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 25-Jun-25 23:58, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > Programming a hardware debounce of 50ms causes problems where a button > doesn't work properly anymore on some systems. This debounce is intended > for compatibility with systems with a mechanical switch so soc_button_array > devices should only be using a sofware debounce. > > Add support for indicating that a driver is only requesting gpio_keys > to use software debounce support and mark that in soc_button_array > accordingly. > > Suggested-by: Hans de Goede <hansg@kernel.org> > Fixes: 5c4fa2a6da7fb ("Input: soc_button_array - debounce the buttons") > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hansg@kernel.org> Regards, Hans > --- > drivers/input/keyboard/gpio_keys.c | 7 +++++-- > drivers/input/misc/soc_button_array.c | 1 + > include/linux/gpio_keys.h | 2 ++ > 3 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > index f9db86da0818b..773aa5294d269 100644 > --- a/drivers/input/keyboard/gpio_keys.c > +++ b/drivers/input/keyboard/gpio_keys.c > @@ -552,8 +552,11 @@ static int gpio_keys_setup_key(struct platform_device *pdev, > bool active_low = gpiod_is_active_low(bdata->gpiod); > > if (button->debounce_interval) { > - error = gpiod_set_debounce(bdata->gpiod, > - button->debounce_interval * 1000); > + if (ddata->pdata->no_hw_debounce) > + error = -EINVAL; > + else > + error = gpiod_set_debounce(bdata->gpiod, > + button->debounce_interval * 1000); > /* use timer if gpiolib doesn't provide debounce */ > if (error < 0) > bdata->software_debounce = > diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c > index b8cad415c62ca..dac940455bea8 100644 > --- a/drivers/input/misc/soc_button_array.c > +++ b/drivers/input/misc/soc_button_array.c > @@ -232,6 +232,7 @@ soc_button_device_create(struct platform_device *pdev, > gpio_keys_pdata->buttons = gpio_keys; > gpio_keys_pdata->nbuttons = n_buttons; > gpio_keys_pdata->rep = autorepeat; > + gpio_keys_pdata->no_hw_debounce = TRUE; > > pd = platform_device_register_resndata(&pdev->dev, "gpio-keys", > PLATFORM_DEVID_AUTO, NULL, 0, > diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h > index 80fa930b04c67..c99f74467fda6 100644 > --- a/include/linux/gpio_keys.h > +++ b/include/linux/gpio_keys.h > @@ -48,6 +48,7 @@ struct gpio_keys_button { > * @enable: platform hook for enabling the device > * @disable: platform hook for disabling the device > * @name: input device name > + * @no_hw_debounce: avoid programming hardware debounce > */ > struct gpio_keys_platform_data { > const struct gpio_keys_button *buttons; > @@ -57,6 +58,7 @@ struct gpio_keys_platform_data { > int (*enable)(struct device *dev); > void (*disable)(struct device *dev); > const char *name; > + bool no_hw_debounce; > }; > > #endif ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices 2025-06-25 21:58 ` [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices Mario Limonciello 2025-06-26 8:27 ` Hans de Goede @ 2025-06-26 14:33 ` Andy Shevchenko 1 sibling, 0 replies; 53+ messages in thread From: Andy Shevchenko @ 2025-06-26 14:33 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Wed, Jun 25, 2025 at 04:58:12PM -0500, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > Programming a hardware debounce of 50ms causes problems where a button > doesn't work properly anymore on some systems. This debounce is intended > for compatibility with systems with a mechanical switch so soc_button_array > devices should only be using a sofware debounce. > > Add support for indicating that a driver is only requesting gpio_keys > to use software debounce support and mark that in soc_button_array > accordingly. ... > + gpio_keys_pdata->no_hw_debounce = TRUE; true -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-25 21:58 [PATCH v3 0/4] Fix soc-button-array debounce Mario Limonciello ` (2 preceding siblings ...) 2025-06-25 21:58 ` [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices Mario Limonciello @ 2025-06-25 21:58 ` Mario Limonciello 2025-06-26 8:35 ` Hans de Goede 2025-06-26 14:37 ` Andy Shevchenko 2025-06-26 14:35 ` [PATCH v3 0/4] Fix soc-button-array debounce Andy Shevchenko 4 siblings, 2 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-25 21:58 UTC (permalink / raw) To: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello From: Mario Limonciello <mario.limonciello@amd.com> Sending an input event to wake a system does wake it, but userspace picks up the keypress and processes it. This isn't the intended behavior as it causes a suspended system to wake up and then potentially turn off if userspace is configured to turn off on power button presses. Instead send a PM wakeup event for the PM core to handle waking the system. Cc: Hans de Goede <hansg@kernel.org> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- drivers/input/keyboard/gpio_keys.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 773aa5294d269..4c6876b099c43 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) pm_stay_awake(bdata->input->dev.parent); if (bdata->suspended && (button->type == 0 || button->type == EV_KEY)) { - /* - * Simulate wakeup key press in case the key has - * already released by the time we got interrupt - * handler to run. - */ - input_report_key(bdata->input, button->code, 1); + pm_wakeup_event(bdata->input->dev.parent, 0); } } -- 2.43.0 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-25 21:58 ` [PATCH v3 4/4] Input: Don't send fake button presses to wake system Mario Limonciello @ 2025-06-26 8:35 ` Hans de Goede 2025-06-26 11:33 ` Mario Limonciello 2025-06-26 14:37 ` Andy Shevchenko 1 sibling, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-26 8:35 UTC (permalink / raw) To: Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi Mario, On 25-Jun-25 23:58, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > Sending an input event to wake a system does wake it, but userspace picks > up the keypress and processes it. This isn't the intended behavior as it > causes a suspended system to wake up and then potentially turn off if > userspace is configured to turn off on power button presses. > > Instead send a PM wakeup event for the PM core to handle waking the system. > > Cc: Hans de Goede <hansg@kernel.org> > Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/input/keyboard/gpio_keys.c | 7 +------ > 1 file changed, 1 insertion(+), 6 deletions(-) > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > index 773aa5294d269..4c6876b099c43 100644 > --- a/drivers/input/keyboard/gpio_keys.c > +++ b/drivers/input/keyboard/gpio_keys.c > @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > pm_stay_awake(bdata->input->dev.parent); > if (bdata->suspended && > (button->type == 0 || button->type == EV_KEY)) { > - /* > - * Simulate wakeup key press in case the key has > - * already released by the time we got interrupt > - * handler to run. > - */ > - input_report_key(bdata->input, button->code, 1); > + pm_wakeup_event(bdata->input->dev.parent, 0); > } > } > Hmm, we have the same problem on many Bay Trail / Cherry Trail windows 8 / win10 tablets, so this has been discussed before and e.g. Android userspace actually needs the button-press (evdev) event to not immediately go back to sleep, so a similar patch has been nacked in the past. At least for GNOME this has been fixed in userspace by ignoring power-button events the first few seconds after a resume from suspend. Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 8:35 ` Hans de Goede @ 2025-06-26 11:33 ` Mario Limonciello 2025-06-26 17:44 ` Dmitry Torokhov 2025-06-26 18:37 ` Hans de Goede 0 siblings, 2 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 11:33 UTC (permalink / raw) To: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov Cc: open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/25 3:35 AM, Hans de Goede wrote: > Hi Mario, > > On 25-Jun-25 23:58, Mario Limonciello wrote: >> From: Mario Limonciello <mario.limonciello@amd.com> >> >> Sending an input event to wake a system does wake it, but userspace picks >> up the keypress and processes it. This isn't the intended behavior as it >> causes a suspended system to wake up and then potentially turn off if >> userspace is configured to turn off on power button presses. >> >> Instead send a PM wakeup event for the PM core to handle waking the system. >> >> Cc: Hans de Goede <hansg@kernel.org> >> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >> --- >> drivers/input/keyboard/gpio_keys.c | 7 +------ >> 1 file changed, 1 insertion(+), 6 deletions(-) >> >> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >> index 773aa5294d269..4c6876b099c43 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >> pm_stay_awake(bdata->input->dev.parent); >> if (bdata->suspended && >> (button->type == 0 || button->type == EV_KEY)) { >> - /* >> - * Simulate wakeup key press in case the key has >> - * already released by the time we got interrupt >> - * handler to run. >> - */ >> - input_report_key(bdata->input, button->code, 1); >> + pm_wakeup_event(bdata->input->dev.parent, 0); >> } >> } >> > > Hmm, we have the same problem on many Bay Trail / Cherry Trail > windows 8 / win10 tablets, so this has been discussed before and e.g. > Android userspace actually needs the button-press (evdev) event to not > immediately go back to sleep, so a similar patch has been nacked in > the past. > > At least for GNOME this has been fixed in userspace by ignoring > power-button events the first few seconds after a resume from suspend. > The default behavior for logind is: HandlePowerKey=poweroff Can you share more about what version of GNOME has a workaround? This was actually GNOME (on Ubuntu 24.04) that I found this issue. Nonetheless if this is dependent on an Android userspace problem could we perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? Most people not using Android would be compiling with that enabled in their kernel I'd expect. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 11:33 ` Mario Limonciello @ 2025-06-26 17:44 ` Dmitry Torokhov 2025-06-26 17:53 ` Mario Limonciello 2025-06-26 18:37 ` Hans de Goede 1 sibling, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 17:44 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi Mario, On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > > > On 6/26/25 3:35 AM, Hans de Goede wrote: > > Hi Mario, > > > > On 25-Jun-25 23:58, Mario Limonciello wrote: > > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > > > Sending an input event to wake a system does wake it, but userspace picks > > > up the keypress and processes it. This isn't the intended behavior as it > > > causes a suspended system to wake up and then potentially turn off if > > > userspace is configured to turn off on power button presses. > > > > > > Instead send a PM wakeup event for the PM core to handle waking the system. > > > > > > Cc: Hans de Goede <hansg@kernel.org> > > > Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > > --- > > > drivers/input/keyboard/gpio_keys.c | 7 +------ > > > 1 file changed, 1 insertion(+), 6 deletions(-) > > > > > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > > > index 773aa5294d269..4c6876b099c43 100644 > > > --- a/drivers/input/keyboard/gpio_keys.c > > > +++ b/drivers/input/keyboard/gpio_keys.c > > > @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > > > pm_stay_awake(bdata->input->dev.parent); > > > if (bdata->suspended && > > > (button->type == 0 || button->type == EV_KEY)) { > > > - /* > > > - * Simulate wakeup key press in case the key has > > > - * already released by the time we got interrupt > > > - * handler to run. > > > - */ > > > - input_report_key(bdata->input, button->code, 1); > > > + pm_wakeup_event(bdata->input->dev.parent, 0); There is already pm_stay_awake() above. > > > } > > > } > > > > Hmm, we have the same problem on many Bay Trail / Cherry Trail > > windows 8 / win10 tablets, so this has been discussed before and e.g. > > Android userspace actually needs the button-press (evdev) event to not > > immediately go back to sleep, so a similar patch has been nacked in > > the past. > > > > At least for GNOME this has been fixed in userspace by ignoring > > power-button events the first few seconds after a resume from suspend. > > > > The default behavior for logind is: > > HandlePowerKey=poweroff > > Can you share more about what version of GNOME has a workaround? > This was actually GNOME (on Ubuntu 24.04) that I found this issue. > > Nonetheless if this is dependent on an Android userspace problem could we > perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? No it is not only Android, other userspace may want to distinguish between normal and "dark" resume based on keyboard or other user activity. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 17:44 ` Dmitry Torokhov @ 2025-06-26 17:53 ` Mario Limonciello 2025-06-26 18:07 ` Dmitry Torokhov 0 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 17:53 UTC (permalink / raw) To: Dmitry Torokhov Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > Hi Mario, > > On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >> >> >> On 6/26/25 3:35 AM, Hans de Goede wrote: >>> Hi Mario, >>> >>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>> >>>> Sending an input event to wake a system does wake it, but userspace picks >>>> up the keypress and processes it. This isn't the intended behavior as it >>>> causes a suspended system to wake up and then potentially turn off if >>>> userspace is configured to turn off on power button presses. >>>> >>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>> >>>> Cc: Hans de Goede <hansg@kernel.org> >>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>> --- >>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>> >>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>> index 773aa5294d269..4c6876b099c43 100644 >>>> --- a/drivers/input/keyboard/gpio_keys.c >>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>> pm_stay_awake(bdata->input->dev.parent); >>>> if (bdata->suspended && >>>> (button->type == 0 || button->type == EV_KEY)) { >>>> - /* >>>> - * Simulate wakeup key press in case the key has >>>> - * already released by the time we got interrupt >>>> - * handler to run. >>>> - */ >>>> - input_report_key(bdata->input, button->code, 1); >>>> + pm_wakeup_event(bdata->input->dev.parent, 0); > > There is already pm_stay_awake() above. But that doesn't help with the fact that userspace gets KEY_POWER from this and reacts to it. > >>>> } >>>> } >>> >>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>> Android userspace actually needs the button-press (evdev) event to not >>> immediately go back to sleep, so a similar patch has been nacked in >>> the past. >>> >>> At least for GNOME this has been fixed in userspace by ignoring >>> power-button events the first few seconds after a resume from suspend. >>> >> >> The default behavior for logind is: >> >> HandlePowerKey=poweroff >> >> Can you share more about what version of GNOME has a workaround? >> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >> >> Nonetheless if this is dependent on an Android userspace problem could we >> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > > No it is not only Android, other userspace may want to distinguish > between normal and "dark" resume based on keyboard or other user > activity. > > Thanks. > In this specific case does the key passed up to satisfy this userspace requirement and keep it awake need to specifically be a fabricated KEY_POWER? Or could we find a key that doesn't require some userspace to ignore KEY_POWER? Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 17:53 ` Mario Limonciello @ 2025-06-26 18:07 ` Dmitry Torokhov 2025-06-26 18:20 ` Mario Limonciello 0 siblings, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 18:07 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: > > > On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > > Hi Mario, > > > > On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > > > > > > > > > On 6/26/25 3:35 AM, Hans de Goede wrote: > > > > Hi Mario, > > > > > > > > On 25-Jun-25 23:58, Mario Limonciello wrote: > > > > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > > > > > > > Sending an input event to wake a system does wake it, but userspace picks > > > > > up the keypress and processes it. This isn't the intended behavior as it > > > > > causes a suspended system to wake up and then potentially turn off if > > > > > userspace is configured to turn off on power button presses. > > > > > > > > > > Instead send a PM wakeup event for the PM core to handle waking the system. > > > > > > > > > > Cc: Hans de Goede <hansg@kernel.org> > > > > > Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > > > > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > > > > --- > > > > > drivers/input/keyboard/gpio_keys.c | 7 +------ > > > > > 1 file changed, 1 insertion(+), 6 deletions(-) > > > > > > > > > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > > > > > index 773aa5294d269..4c6876b099c43 100644 > > > > > --- a/drivers/input/keyboard/gpio_keys.c > > > > > +++ b/drivers/input/keyboard/gpio_keys.c > > > > > @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > > > > > pm_stay_awake(bdata->input->dev.parent); > > > > > if (bdata->suspended && > > > > > (button->type == 0 || button->type == EV_KEY)) { > > > > > - /* > > > > > - * Simulate wakeup key press in case the key has > > > > > - * already released by the time we got interrupt > > > > > - * handler to run. > > > > > - */ > > > > > - input_report_key(bdata->input, button->code, 1); > > > > > + pm_wakeup_event(bdata->input->dev.parent, 0); > > > > There is already pm_stay_awake() above. > > But that doesn't help with the fact that userspace gets KEY_POWER from this > and reacts to it. > > > > > > > > } > > > > > } > > > > > > > > Hmm, we have the same problem on many Bay Trail / Cherry Trail > > > > windows 8 / win10 tablets, so this has been discussed before and e.g. > > > > Android userspace actually needs the button-press (evdev) event to not > > > > immediately go back to sleep, so a similar patch has been nacked in > > > > the past. > > > > > > > > At least for GNOME this has been fixed in userspace by ignoring > > > > power-button events the first few seconds after a resume from suspend. > > > > > > > > > > The default behavior for logind is: > > > > > > HandlePowerKey=poweroff > > > > > > Can you share more about what version of GNOME has a workaround? > > > This was actually GNOME (on Ubuntu 24.04) that I found this issue. > > > > > > Nonetheless if this is dependent on an Android userspace problem could we > > > perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > > > > No it is not only Android, other userspace may want to distinguish > > between normal and "dark" resume based on keyboard or other user > > activity. > > > > Thanks. > > > In this specific case does the key passed up to satisfy this userspace > requirement and keep it awake need to specifically be a fabricated > KEY_POWER? > > Or could we find a key that doesn't require some userspace to ignore > KEY_POWER? > > Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. It simply passes event to userspace for processing. You need to fix your userspace. Even with your tweak it is possible for userspace to get a normal key event "too early" and turn off the screen again, so you still need to handle this situation. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:07 ` Dmitry Torokhov @ 2025-06-26 18:20 ` Mario Limonciello 2025-06-26 18:48 ` Dmitry Torokhov 0 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 18:20 UTC (permalink / raw) To: Dmitry Torokhov Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: > On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: >> >> >> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: >>> Hi Mario, >>> >>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >>>> >>>> >>>> On 6/26/25 3:35 AM, Hans de Goede wrote: >>>>> Hi Mario, >>>>> >>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>>>> >>>>>> Sending an input event to wake a system does wake it, but userspace picks >>>>>> up the keypress and processes it. This isn't the intended behavior as it >>>>>> causes a suspended system to wake up and then potentially turn off if >>>>>> userspace is configured to turn off on power button presses. >>>>>> >>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>>>> >>>>>> Cc: Hans de Goede <hansg@kernel.org> >>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>>>> --- >>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>>>> >>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>>>> index 773aa5294d269..4c6876b099c43 100644 >>>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>>>> pm_stay_awake(bdata->input->dev.parent); >>>>>> if (bdata->suspended && >>>>>> (button->type == 0 || button->type == EV_KEY)) { >>>>>> - /* >>>>>> - * Simulate wakeup key press in case the key has >>>>>> - * already released by the time we got interrupt >>>>>> - * handler to run. >>>>>> - */ >>>>>> - input_report_key(bdata->input, button->code, 1); >>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>> >>> There is already pm_stay_awake() above. >> >> But that doesn't help with the fact that userspace gets KEY_POWER from this >> and reacts to it. >> >>> >>>>>> } >>>>>> } >>>>> >>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>>>> Android userspace actually needs the button-press (evdev) event to not >>>>> immediately go back to sleep, so a similar patch has been nacked in >>>>> the past. >>>>> >>>>> At least for GNOME this has been fixed in userspace by ignoring >>>>> power-button events the first few seconds after a resume from suspend. >>>>> >>>> >>>> The default behavior for logind is: >>>> >>>> HandlePowerKey=poweroff >>>> >>>> Can you share more about what version of GNOME has a workaround? >>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >>>> >>>> Nonetheless if this is dependent on an Android userspace problem could we >>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? >>> >>> No it is not only Android, other userspace may want to distinguish >>> between normal and "dark" resume based on keyboard or other user >>> activity. >>> >>> Thanks. >>> >> In this specific case does the key passed up to satisfy this userspace >> requirement and keep it awake need to specifically be a fabricated >> KEY_POWER? >> >> Or could we find a key that doesn't require some userspace to ignore >> KEY_POWER? >> >> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? > > The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. > It simply passes event to userspace for processing. Right. I don't expect a problem with most keys, but my proposal is to special case KEY_POWER while suspended. If a key press event must be sent to keep Android and other userspace happy I suggest sending something different just for that situation. Like this: diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 773aa5294d269..66e788d381956 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) * already released by the time we got interrupt * handler to run. */ - input_report_key(bdata->input, button->code, 1); + if (button->code == KEY_POWER) + input_report_key(bdata->input, KEY_WAKEUP, 1); + else + input_report_key(bdata->input, button->code, 1); } } > > You need to fix your userspace. Even with your tweak it is possible for > userspace to get a normal key event "too early" and turn off the screen > again, so you still need to handle this situation. > > Thanks. > I want to note this driver works quite differently than how ACPI power button does. You can see in acpi_button_notify() that the "keypress" is only forwarded when not suspended [1]. Otherwise it's just wakeup event (which is what my patch was modeling). https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 [1] ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:20 ` Mario Limonciello @ 2025-06-26 18:48 ` Dmitry Torokhov 2025-06-26 18:55 ` Mario Limonciello 2025-06-26 18:57 ` Hans de Goede 0 siblings, 2 replies; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 18:48 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: > > On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: > > > > > > > > > On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > > > > Hi Mario, > > > > > > > > On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > > > > > > > > > > > > > > > On 6/26/25 3:35 AM, Hans de Goede wrote: > > > > > > Hi Mario, > > > > > > > > > > > > On 25-Jun-25 23:58, Mario Limonciello wrote: > > > > > > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > > > > > > > > > > > Sending an input event to wake a system does wake it, but userspace picks > > > > > > > up the keypress and processes it. This isn't the intended behavior as it > > > > > > > causes a suspended system to wake up and then potentially turn off if > > > > > > > userspace is configured to turn off on power button presses. > > > > > > > > > > > > > > Instead send a PM wakeup event for the PM core to handle waking the system. > > > > > > > > > > > > > > Cc: Hans de Goede <hansg@kernel.org> > > > > > > > Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > > > > > > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > > > > > > --- > > > > > > > drivers/input/keyboard/gpio_keys.c | 7 +------ > > > > > > > 1 file changed, 1 insertion(+), 6 deletions(-) > > > > > > > > > > > > > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > > > > > > > index 773aa5294d269..4c6876b099c43 100644 > > > > > > > --- a/drivers/input/keyboard/gpio_keys.c > > > > > > > +++ b/drivers/input/keyboard/gpio_keys.c > > > > > > > @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > > > > > > > pm_stay_awake(bdata->input->dev.parent); > > > > > > > if (bdata->suspended && > > > > > > > (button->type == 0 || button->type == EV_KEY)) { > > > > > > > - /* > > > > > > > - * Simulate wakeup key press in case the key has > > > > > > > - * already released by the time we got interrupt > > > > > > > - * handler to run. > > > > > > > - */ > > > > > > > - input_report_key(bdata->input, button->code, 1); > > > > > > > + pm_wakeup_event(bdata->input->dev.parent, 0); > > > > > > > > There is already pm_stay_awake() above. > > > > > > But that doesn't help with the fact that userspace gets KEY_POWER from this > > > and reacts to it. > > > > > > > > > > > > > > } > > > > > > > } > > > > > > > > > > > > Hmm, we have the same problem on many Bay Trail / Cherry Trail > > > > > > windows 8 / win10 tablets, so this has been discussed before and e.g. > > > > > > Android userspace actually needs the button-press (evdev) event to not > > > > > > immediately go back to sleep, so a similar patch has been nacked in > > > > > > the past. > > > > > > > > > > > > At least for GNOME this has been fixed in userspace by ignoring > > > > > > power-button events the first few seconds after a resume from suspend. > > > > > > > > > > > > > > > > The default behavior for logind is: > > > > > > > > > > HandlePowerKey=poweroff > > > > > > > > > > Can you share more about what version of GNOME has a workaround? > > > > > This was actually GNOME (on Ubuntu 24.04) that I found this issue. > > > > > > > > > > Nonetheless if this is dependent on an Android userspace problem could we > > > > > perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > > > > > > > > No it is not only Android, other userspace may want to distinguish > > > > between normal and "dark" resume based on keyboard or other user > > > > activity. > > > > > > > > Thanks. > > > > > > > In this specific case does the key passed up to satisfy this userspace > > > requirement and keep it awake need to specifically be a fabricated > > > KEY_POWER? > > > > > > Or could we find a key that doesn't require some userspace to ignore > > > KEY_POWER? > > > > > > Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? > > > > The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. > > It simply passes event to userspace for processing. > > Right. I don't expect a problem with most keys, but my proposal is to > special case KEY_POWER while suspended. If a key press event must be sent > to keep Android and other userspace happy I suggest sending something > different just for that situation. I do not know if userspace specifically looks for KEY_POWER or if it looks for user input in general, and I'd rather be on safe side and not mangle user input. As Hans mentioned, at least some userspace already prepared to deal with this issue. And again, this only works if by the time ISR/debounce runs the key is already released. What if it is still pressed? You still going to observe KEY_POWER and need to suppress turning off the screen. > > Like this: > > diff --git a/drivers/input/keyboard/gpio_keys.c > b/drivers/input/keyboard/gpio_keys.c > index 773aa5294d269..66e788d381956 100644 > --- a/drivers/input/keyboard/gpio_keys.c > +++ b/drivers/input/keyboard/gpio_keys.c > @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void > *dev_id) > * already released by the time we got interrupt > * handler to run. > */ > - input_report_key(bdata->input, button->code, 1); > + if (button->code == KEY_POWER) > + input_report_key(bdata->input, KEY_WAKEUP, > 1); Just FYI: Here your KEY_WAKEUP is stuck forever. > + else > + input_report_key(bdata->input, button->code, > 1); > } > } > > > > > > > You need to fix your userspace. Even with your tweak it is possible for > > userspace to get a normal key event "too early" and turn off the screen > > again, so you still need to handle this situation. > > > > Thanks. > > > > I want to note this driver works quite differently than how ACPI power > button does. > > You can see in acpi_button_notify() that the "keypress" is only forwarded > when not suspended [1]. Otherwise it's just wakeup event (which is what my > patch was modeling). > > https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > [1] If you check acpi_button_resume() you will see that the events are sent from there. Except that for some reason they chose to use KEY_WAKEUP and not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on multiple other platforms. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:48 ` Dmitry Torokhov @ 2025-06-26 18:55 ` Mario Limonciello 2025-06-26 19:06 ` Dmitry Torokhov 2025-06-26 19:37 ` Andy Shevchenko 2025-06-26 18:57 ` Hans de Goede 1 sibling, 2 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 18:55 UTC (permalink / raw) To: Dmitry Torokhov Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/2025 1:48 PM, Dmitry Torokhov wrote: > On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >> On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: >>> On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: >>>> >>>> >>>> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: >>>>> Hi Mario, >>>>> >>>>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >>>>>> >>>>>> >>>>>> On 6/26/25 3:35 AM, Hans de Goede wrote: >>>>>>> Hi Mario, >>>>>>> >>>>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>>>>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>>>>>> >>>>>>>> Sending an input event to wake a system does wake it, but userspace picks >>>>>>>> up the keypress and processes it. This isn't the intended behavior as it >>>>>>>> causes a suspended system to wake up and then potentially turn off if >>>>>>>> userspace is configured to turn off on power button presses. >>>>>>>> >>>>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>>>>>> >>>>>>>> Cc: Hans de Goede <hansg@kernel.org> >>>>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>>>>>> --- >>>>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>>>>>> >>>>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>>>>>> index 773aa5294d269..4c6876b099c43 100644 >>>>>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>>>>>> pm_stay_awake(bdata->input->dev.parent); >>>>>>>> if (bdata->suspended && >>>>>>>> (button->type == 0 || button->type == EV_KEY)) { >>>>>>>> - /* >>>>>>>> - * Simulate wakeup key press in case the key has >>>>>>>> - * already released by the time we got interrupt >>>>>>>> - * handler to run. >>>>>>>> - */ >>>>>>>> - input_report_key(bdata->input, button->code, 1); >>>>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>>>> >>>>> There is already pm_stay_awake() above. >>>> >>>> But that doesn't help with the fact that userspace gets KEY_POWER from this >>>> and reacts to it. >>>> >>>>> >>>>>>>> } >>>>>>>> } >>>>>>> >>>>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>>>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>>>>>> Android userspace actually needs the button-press (evdev) event to not >>>>>>> immediately go back to sleep, so a similar patch has been nacked in >>>>>>> the past. >>>>>>> >>>>>>> At least for GNOME this has been fixed in userspace by ignoring >>>>>>> power-button events the first few seconds after a resume from suspend. >>>>>>> >>>>>> >>>>>> The default behavior for logind is: >>>>>> >>>>>> HandlePowerKey=poweroff >>>>>> >>>>>> Can you share more about what version of GNOME has a workaround? >>>>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >>>>>> >>>>>> Nonetheless if this is dependent on an Android userspace problem could we >>>>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? >>>>> >>>>> No it is not only Android, other userspace may want to distinguish >>>>> between normal and "dark" resume based on keyboard or other user >>>>> activity. >>>>> >>>>> Thanks. >>>>> >>>> In this specific case does the key passed up to satisfy this userspace >>>> requirement and keep it awake need to specifically be a fabricated >>>> KEY_POWER? >>>> >>>> Or could we find a key that doesn't require some userspace to ignore >>>> KEY_POWER? >>>> >>>> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? >>> >>> The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. >>> It simply passes event to userspace for processing. >> >> Right. I don't expect a problem with most keys, but my proposal is to >> special case KEY_POWER while suspended. If a key press event must be sent >> to keep Android and other userspace happy I suggest sending something >> different just for that situation. > > I do not know if userspace specifically looks for KEY_POWER or if it > looks for user input in general, and I'd rather be on safe side and not > mangle user input. > > As Hans mentioned, at least some userspace already prepared to deal with > this issue. And again, this only works if by the time ISR/debounce > runs the key is already released. What if it is still pressed? You still > going to observe KEY_POWER and need to suppress turning off the screen. > >> >> Like this: >> >> diff --git a/drivers/input/keyboard/gpio_keys.c >> b/drivers/input/keyboard/gpio_keys.c >> index 773aa5294d269..66e788d381956 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >> *dev_id) >> * already released by the time we got interrupt >> * handler to run. >> */ >> - input_report_key(bdata->input, button->code, 1); >> + if (button->code == KEY_POWER) >> + input_report_key(bdata->input, KEY_WAKEUP, >> 1); > > Just FYI: Here your KEY_WAKEUP is stuck forever. Thanks. > >> + else >> + input_report_key(bdata->input, button->code, >> 1); >> } >> } >> >> >> >>> >>> You need to fix your userspace. Even with your tweak it is possible for >>> userspace to get a normal key event "too early" and turn off the screen >>> again, so you still need to handle this situation. >>> >>> Thanks. >>> >> >> I want to note this driver works quite differently than how ACPI power >> button does. >> >> You can see in acpi_button_notify() that the "keypress" is only forwarded >> when not suspended [1]. Otherwise it's just wakeup event (which is what my >> patch was modeling). >> >> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >> [1] > > If you check acpi_button_resume() you will see that the events are sent > from there. Except that for some reason they chose to use KEY_WAKEUP and > not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > multiple other platforms. > > Thanks. > Well that would explain the difference, and git blame gives the history [1]. It's from enablement for Android with ACPI power button. That commit also mentions that Android can handle both POWER and WAKEUP from input device to wakeup the system. Non-Android userspace doesn't do anything with KEY_WAKEUP today. So this has me thinking the proposal I had above to special case KEY_POWER and translate to KEY_WAKEUP is the right way forward, just making sure to release the key as you rightfully pointed out. https://github.com/torvalds/linux/commit/16f70feaabe9fde0af703f2991d44a7589f0b6e3 [1] ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:55 ` Mario Limonciello @ 2025-06-26 19:06 ` Dmitry Torokhov 2025-06-26 19:37 ` Andy Shevchenko 1 sibling, 0 replies; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 19:06 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 01:55:29PM -0500, Mario Limonciello wrote: > On 6/26/2025 1:48 PM, Dmitry Torokhov wrote: > > On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > > > On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: > > > > On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: > > > > > > > > > > > > > > > On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > > > > > > Hi Mario, > > > > > > > > > > > > On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > > > > > > > > > > > > > > > > > > > > > On 6/26/25 3:35 AM, Hans de Goede wrote: > > > > > > > > Hi Mario, > > > > > > > > > > > > > > > > On 25-Jun-25 23:58, Mario Limonciello wrote: > > > > > > > > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > > > > > > > > > > > > > > > Sending an input event to wake a system does wake it, but userspace picks > > > > > > > > > up the keypress and processes it. This isn't the intended behavior as it > > > > > > > > > causes a suspended system to wake up and then potentially turn off if > > > > > > > > > userspace is configured to turn off on power button presses. > > > > > > > > > > > > > > > > > > Instead send a PM wakeup event for the PM core to handle waking the system. > > > > > > > > > > > > > > > > > > Cc: Hans de Goede <hansg@kernel.org> > > > > > > > > > Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > > > > > > > > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > > > > > > > > --- > > > > > > > > > drivers/input/keyboard/gpio_keys.c | 7 +------ > > > > > > > > > 1 file changed, 1 insertion(+), 6 deletions(-) > > > > > > > > > > > > > > > > > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > > > > > > > > > index 773aa5294d269..4c6876b099c43 100644 > > > > > > > > > --- a/drivers/input/keyboard/gpio_keys.c > > > > > > > > > +++ b/drivers/input/keyboard/gpio_keys.c > > > > > > > > > @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > > > > > > > > > pm_stay_awake(bdata->input->dev.parent); > > > > > > > > > if (bdata->suspended && > > > > > > > > > (button->type == 0 || button->type == EV_KEY)) { > > > > > > > > > - /* > > > > > > > > > - * Simulate wakeup key press in case the key has > > > > > > > > > - * already released by the time we got interrupt > > > > > > > > > - * handler to run. > > > > > > > > > - */ > > > > > > > > > - input_report_key(bdata->input, button->code, 1); > > > > > > > > > + pm_wakeup_event(bdata->input->dev.parent, 0); > > > > > > > > > > > > There is already pm_stay_awake() above. > > > > > > > > > > But that doesn't help with the fact that userspace gets KEY_POWER from this > > > > > and reacts to it. > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > } > > > > > > > > > > > > > > > > Hmm, we have the same problem on many Bay Trail / Cherry Trail > > > > > > > > windows 8 / win10 tablets, so this has been discussed before and e.g. > > > > > > > > Android userspace actually needs the button-press (evdev) event to not > > > > > > > > immediately go back to sleep, so a similar patch has been nacked in > > > > > > > > the past. > > > > > > > > > > > > > > > > At least for GNOME this has been fixed in userspace by ignoring > > > > > > > > power-button events the first few seconds after a resume from suspend. > > > > > > > > > > > > > > > > > > > > > > The default behavior for logind is: > > > > > > > > > > > > > > HandlePowerKey=poweroff > > > > > > > > > > > > > > Can you share more about what version of GNOME has a workaround? > > > > > > > This was actually GNOME (on Ubuntu 24.04) that I found this issue. > > > > > > > > > > > > > > Nonetheless if this is dependent on an Android userspace problem could we > > > > > > > perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > > > > > > > > > > > > No it is not only Android, other userspace may want to distinguish > > > > > > between normal and "dark" resume based on keyboard or other user > > > > > > activity. > > > > > > > > > > > > Thanks. > > > > > > > > > > > In this specific case does the key passed up to satisfy this userspace > > > > > requirement and keep it awake need to specifically be a fabricated > > > > > KEY_POWER? > > > > > > > > > > Or could we find a key that doesn't require some userspace to ignore > > > > > KEY_POWER? > > > > > > > > > > Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? > > > > > > > > The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. > > > > It simply passes event to userspace for processing. > > > > > > Right. I don't expect a problem with most keys, but my proposal is to > > > special case KEY_POWER while suspended. If a key press event must be sent > > > to keep Android and other userspace happy I suggest sending something > > > different just for that situation. > > > > I do not know if userspace specifically looks for KEY_POWER or if it > > looks for user input in general, and I'd rather be on safe side and not > > mangle user input. > > > > As Hans mentioned, at least some userspace already prepared to deal with > > this issue. And again, this only works if by the time ISR/debounce > > runs the key is already released. What if it is still pressed? You still > > going to observe KEY_POWER and need to suppress turning off the screen. > > > > > > > > Like this: > > > > > > diff --git a/drivers/input/keyboard/gpio_keys.c > > > b/drivers/input/keyboard/gpio_keys.c > > > index 773aa5294d269..66e788d381956 100644 > > > --- a/drivers/input/keyboard/gpio_keys.c > > > +++ b/drivers/input/keyboard/gpio_keys.c > > > @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void > > > *dev_id) > > > * already released by the time we got interrupt > > > * handler to run. > > > */ > > > - input_report_key(bdata->input, button->code, 1); > > > + if (button->code == KEY_POWER) > > > + input_report_key(bdata->input, KEY_WAKEUP, > > > 1); > > > > Just FYI: Here your KEY_WAKEUP is stuck forever. > > Thanks. > > > > > > + else > > > + input_report_key(bdata->input, button->code, > > > 1); > > > } > > > } > > > > > > > > > > > > > > > > > You need to fix your userspace. Even with your tweak it is possible for > > > > userspace to get a normal key event "too early" and turn off the screen > > > > again, so you still need to handle this situation. > > > > > > > > Thanks. > > > > > > > > > > I want to note this driver works quite differently than how ACPI power > > > button does. > > > _> > > You can see in acpi_button_notify() that the "keypress" is only forwarded > > > when not suspended [1]. Otherwise it's just wakeup event (which is what my > > > patch was modeling). > > > > > > https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > > [1] > > > > If you check acpi_button_resume() you will see that the events are sent > > from there. Except that for some reason they chose to use KEY_WAKEUP and > > not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > multiple other platforms. > > > > Thanks. > > > > Well that would explain the difference, and git blame gives the history [1]. > > It's from enablement for Android with ACPI power button. That commit also > mentions that Android can handle both POWER and WAKEUP from input device to > wakeup the system. Non-Android userspace doesn't do anything with > KEY_WAKEUP today. *All* non-Android userspace? > > So this has me thinking the proposal I had above to special case KEY_POWER > and translate to KEY_WAKEUP is the right way forward, just making sure to > release the key as you rightfully pointed out. You keep ignoring the fact that it does not solve your issue when the key/button is pressed just a tad longer. There are a ton of drivers that report KEY_POWER and do not convert it to anything else on resume. I will not accept patches that mangle input events in the gpio_keys driver, sorry. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:55 ` Mario Limonciello 2025-06-26 19:06 ` Dmitry Torokhov @ 2025-06-26 19:37 ` Andy Shevchenko 1 sibling, 0 replies; 53+ messages in thread From: Andy Shevchenko @ 2025-06-26 19:37 UTC (permalink / raw) To: Mario Limonciello Cc: Dmitry Torokhov, Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 01:55:29PM -0500, Mario Limonciello wrote: Mario, I see that this discussion takes longer than expected, however I agree that adding debounce call in GPIO ACPI lib is right thing to do independently on the outcome of this discussion. So, I have looked into the code and think that the patches do not need to be squashed. I have some tweaks and I would like to take your patches as two separate entities and add my code on top. I will cook something tomorrow and send out based on this version of yours. P.S. TWIMC, It's only about the code that touches gpiolib-acpi. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:48 ` Dmitry Torokhov 2025-06-26 18:55 ` Mario Limonciello @ 2025-06-26 18:57 ` Hans de Goede 2025-06-26 19:14 ` Dmitry Torokhov 1 sibling, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-26 18:57 UTC (permalink / raw) To: Dmitry Torokhov, Mario Limonciello Cc: Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 26-Jun-25 20:48, Dmitry Torokhov wrote: > On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >> On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: >>> On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: >>>> >>>> >>>> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: >>>>> Hi Mario, >>>>> >>>>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >>>>>> >>>>>> >>>>>> On 6/26/25 3:35 AM, Hans de Goede wrote: >>>>>>> Hi Mario, >>>>>>> >>>>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>>>>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>>>>>> >>>>>>>> Sending an input event to wake a system does wake it, but userspace picks >>>>>>>> up the keypress and processes it. This isn't the intended behavior as it >>>>>>>> causes a suspended system to wake up and then potentially turn off if >>>>>>>> userspace is configured to turn off on power button presses. >>>>>>>> >>>>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>>>>>> >>>>>>>> Cc: Hans de Goede <hansg@kernel.org> >>>>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>>>>>> --- >>>>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>>>>>> >>>>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>>>>>> index 773aa5294d269..4c6876b099c43 100644 >>>>>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>>>>>> pm_stay_awake(bdata->input->dev.parent); >>>>>>>> if (bdata->suspended && >>>>>>>> (button->type == 0 || button->type == EV_KEY)) { >>>>>>>> - /* >>>>>>>> - * Simulate wakeup key press in case the key has >>>>>>>> - * already released by the time we got interrupt >>>>>>>> - * handler to run. >>>>>>>> - */ >>>>>>>> - input_report_key(bdata->input, button->code, 1); >>>>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>>>> >>>>> There is already pm_stay_awake() above. >>>> >>>> But that doesn't help with the fact that userspace gets KEY_POWER from this >>>> and reacts to it. >>>> >>>>> >>>>>>>> } >>>>>>>> } >>>>>>> >>>>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>>>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>>>>>> Android userspace actually needs the button-press (evdev) event to not >>>>>>> immediately go back to sleep, so a similar patch has been nacked in >>>>>>> the past. >>>>>>> >>>>>>> At least for GNOME this has been fixed in userspace by ignoring >>>>>>> power-button events the first few seconds after a resume from suspend. >>>>>>> >>>>>> >>>>>> The default behavior for logind is: >>>>>> >>>>>> HandlePowerKey=poweroff >>>>>> >>>>>> Can you share more about what version of GNOME has a workaround? >>>>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >>>>>> >>>>>> Nonetheless if this is dependent on an Android userspace problem could we >>>>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? >>>>> >>>>> No it is not only Android, other userspace may want to distinguish >>>>> between normal and "dark" resume based on keyboard or other user >>>>> activity. >>>>> >>>>> Thanks. >>>>> >>>> In this specific case does the key passed up to satisfy this userspace >>>> requirement and keep it awake need to specifically be a fabricated >>>> KEY_POWER? >>>> >>>> Or could we find a key that doesn't require some userspace to ignore >>>> KEY_POWER? >>>> >>>> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? >>> >>> The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. >>> It simply passes event to userspace for processing. >> >> Right. I don't expect a problem with most keys, but my proposal is to >> special case KEY_POWER while suspended. If a key press event must be sent >> to keep Android and other userspace happy I suggest sending something >> different just for that situation. > > I do not know if userspace specifically looks for KEY_POWER or if it > looks for user input in general, and I'd rather be on safe side and not > mangle user input. > > As Hans mentioned, at least some userspace already prepared to deal with > this issue. And again, this only works if by the time ISR/debounce > runs the key is already released. What if it is still pressed? You still > going to observe KEY_POWER and need to suppress turning off the screen. > >> >> Like this: >> >> diff --git a/drivers/input/keyboard/gpio_keys.c >> b/drivers/input/keyboard/gpio_keys.c >> index 773aa5294d269..66e788d381956 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >> *dev_id) >> * already released by the time we got interrupt >> * handler to run. >> */ >> - input_report_key(bdata->input, button->code, 1); >> + if (button->code == KEY_POWER) >> + input_report_key(bdata->input, KEY_WAKEUP, >> 1); > > Just FYI: Here your KEY_WAKEUP is stuck forever. > >> + else >> + input_report_key(bdata->input, button->code, >> 1); >> } >> } >> >> >> >>> >>> You need to fix your userspace. Even with your tweak it is possible for >>> userspace to get a normal key event "too early" and turn off the screen >>> again, so you still need to handle this situation. >>> >>> Thanks. >>> >> >> I want to note this driver works quite differently than how ACPI power >> button does. >> >> You can see in acpi_button_notify() that the "keypress" is only forwarded >> when not suspended [1]. Otherwise it's just wakeup event (which is what my >> patch was modeling). >> >> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >> [1] > > If you check acpi_button_resume() you will see that the events are sent > from there. Except that for some reason they chose to use KEY_WAKEUP and > not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > multiple other platforms. Interesting, but the ACPI button code presumably only does this on resume for a normal press while the system is awake it does use KEY_POWER, right ? Regards, Hans > > Thanks. > ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:57 ` Hans de Goede @ 2025-06-26 19:14 ` Dmitry Torokhov 2025-06-26 19:16 ` Hans de Goede 0 siblings, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 19:14 UTC (permalink / raw) To: Hans de Goede Cc: Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > Hi, > > On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > >> On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: > >>> On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: > >>>> > >>>> > >>>> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > >>>>> Hi Mario, > >>>>> > >>>>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > >>>>>> > >>>>>> > >>>>>> On 6/26/25 3:35 AM, Hans de Goede wrote: > >>>>>>> Hi Mario, > >>>>>>> > >>>>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: > >>>>>>>> From: Mario Limonciello <mario.limonciello@amd.com> > >>>>>>>> > >>>>>>>> Sending an input event to wake a system does wake it, but userspace picks > >>>>>>>> up the keypress and processes it. This isn't the intended behavior as it > >>>>>>>> causes a suspended system to wake up and then potentially turn off if > >>>>>>>> userspace is configured to turn off on power button presses. > >>>>>>>> > >>>>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. > >>>>>>>> > >>>>>>>> Cc: Hans de Goede <hansg@kernel.org> > >>>>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > >>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > >>>>>>>> --- > >>>>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ > >>>>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) > >>>>>>>> > >>>>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > >>>>>>>> index 773aa5294d269..4c6876b099c43 100644 > >>>>>>>> --- a/drivers/input/keyboard/gpio_keys.c > >>>>>>>> +++ b/drivers/input/keyboard/gpio_keys.c > >>>>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > >>>>>>>> pm_stay_awake(bdata->input->dev.parent); > >>>>>>>> if (bdata->suspended && > >>>>>>>> (button->type == 0 || button->type == EV_KEY)) { > >>>>>>>> - /* > >>>>>>>> - * Simulate wakeup key press in case the key has > >>>>>>>> - * already released by the time we got interrupt > >>>>>>>> - * handler to run. > >>>>>>>> - */ > >>>>>>>> - input_report_key(bdata->input, button->code, 1); > >>>>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); > >>>>> > >>>>> There is already pm_stay_awake() above. > >>>> > >>>> But that doesn't help with the fact that userspace gets KEY_POWER from this > >>>> and reacts to it. > >>>> > >>>>> > >>>>>>>> } > >>>>>>>> } > >>>>>>> > >>>>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail > >>>>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. > >>>>>>> Android userspace actually needs the button-press (evdev) event to not > >>>>>>> immediately go back to sleep, so a similar patch has been nacked in > >>>>>>> the past. > >>>>>>> > >>>>>>> At least for GNOME this has been fixed in userspace by ignoring > >>>>>>> power-button events the first few seconds after a resume from suspend. > >>>>>>> > >>>>>> > >>>>>> The default behavior for logind is: > >>>>>> > >>>>>> HandlePowerKey=poweroff > >>>>>> > >>>>>> Can you share more about what version of GNOME has a workaround? > >>>>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. > >>>>>> > >>>>>> Nonetheless if this is dependent on an Android userspace problem could we > >>>>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > >>>>> > >>>>> No it is not only Android, other userspace may want to distinguish > >>>>> between normal and "dark" resume based on keyboard or other user > >>>>> activity. > >>>>> > >>>>> Thanks. > >>>>> > >>>> In this specific case does the key passed up to satisfy this userspace > >>>> requirement and keep it awake need to specifically be a fabricated > >>>> KEY_POWER? > >>>> > >>>> Or could we find a key that doesn't require some userspace to ignore > >>>> KEY_POWER? > >>>> > >>>> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? > >>> > >>> The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. > >>> It simply passes event to userspace for processing. > >> > >> Right. I don't expect a problem with most keys, but my proposal is to > >> special case KEY_POWER while suspended. If a key press event must be sent > >> to keep Android and other userspace happy I suggest sending something > >> different just for that situation. > > > > I do not know if userspace specifically looks for KEY_POWER or if it > > looks for user input in general, and I'd rather be on safe side and not > > mangle user input. > > > > As Hans mentioned, at least some userspace already prepared to deal with > > this issue. And again, this only works if by the time ISR/debounce > > runs the key is already released. What if it is still pressed? You still > > going to observe KEY_POWER and need to suppress turning off the screen. > > > >> > >> Like this: > >> > >> diff --git a/drivers/input/keyboard/gpio_keys.c > >> b/drivers/input/keyboard/gpio_keys.c > >> index 773aa5294d269..66e788d381956 100644 > >> --- a/drivers/input/keyboard/gpio_keys.c > >> +++ b/drivers/input/keyboard/gpio_keys.c > >> @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void > >> *dev_id) > >> * already released by the time we got interrupt > >> * handler to run. > >> */ > >> - input_report_key(bdata->input, button->code, 1); > >> + if (button->code == KEY_POWER) > >> + input_report_key(bdata->input, KEY_WAKEUP, > >> 1); > > > > Just FYI: Here your KEY_WAKEUP is stuck forever. > > > >> + else > >> + input_report_key(bdata->input, button->code, > >> 1); > >> } > >> } > >> > >> > >> > >>> > >>> You need to fix your userspace. Even with your tweak it is possible for > >>> userspace to get a normal key event "too early" and turn off the screen > >>> again, so you still need to handle this situation. > >>> > >>> Thanks. > >>> > >> > >> I want to note this driver works quite differently than how ACPI power > >> button does. > >> > >> You can see in acpi_button_notify() that the "keypress" is only forwarded > >> when not suspended [1]. Otherwise it's just wakeup event (which is what my > >> patch was modeling). > >> > >> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > >> [1] > > > > If you check acpi_button_resume() you will see that the events are sent > > from there. Except that for some reason they chose to use KEY_WAKEUP and > > not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > multiple other platforms. > > Interesting, but the ACPI button code presumably only does this on resume > for a normal press while the system is awake it does use KEY_POWER, right ? Yes. It is unclear to me why they chose to mangle the event on wakeup, it does not seem to be captured in the email discussions or in the patch description. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:14 ` Dmitry Torokhov @ 2025-06-26 19:16 ` Hans de Goede 2025-06-26 19:18 ` Rafael J. Wysocki 0 siblings, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-26 19:16 UTC (permalink / raw) To: Dmitry Torokhov Cc: Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 26-Jun-25 21:14, Dmitry Torokhov wrote: > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: >> Hi, >> >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >>>> On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: >>>>> On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: >>>>>> >>>>>> >>>>>> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: >>>>>>> Hi Mario, >>>>>>> >>>>>>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >>>>>>>> >>>>>>>> >>>>>>>> On 6/26/25 3:35 AM, Hans de Goede wrote: >>>>>>>>> Hi Mario, >>>>>>>>> >>>>>>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>>>>>>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>>>>>>>> >>>>>>>>>> Sending an input event to wake a system does wake it, but userspace picks >>>>>>>>>> up the keypress and processes it. This isn't the intended behavior as it >>>>>>>>>> causes a suspended system to wake up and then potentially turn off if >>>>>>>>>> userspace is configured to turn off on power button presses. >>>>>>>>>> >>>>>>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>>>>>>>> >>>>>>>>>> Cc: Hans de Goede <hansg@kernel.org> >>>>>>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>>>>>>>> --- >>>>>>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>>>>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>>>>>>>> >>>>>>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>>>>>>>> index 773aa5294d269..4c6876b099c43 100644 >>>>>>>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>>>>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>>>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>>>>>>>> pm_stay_awake(bdata->input->dev.parent); >>>>>>>>>> if (bdata->suspended && >>>>>>>>>> (button->type == 0 || button->type == EV_KEY)) { >>>>>>>>>> - /* >>>>>>>>>> - * Simulate wakeup key press in case the key has >>>>>>>>>> - * already released by the time we got interrupt >>>>>>>>>> - * handler to run. >>>>>>>>>> - */ >>>>>>>>>> - input_report_key(bdata->input, button->code, 1); >>>>>>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>>>>>> >>>>>>> There is already pm_stay_awake() above. >>>>>> >>>>>> But that doesn't help with the fact that userspace gets KEY_POWER from this >>>>>> and reacts to it. >>>>>> >>>>>>> >>>>>>>>>> } >>>>>>>>>> } >>>>>>>>> >>>>>>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>>>>>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>>>>>>>> Android userspace actually needs the button-press (evdev) event to not >>>>>>>>> immediately go back to sleep, so a similar patch has been nacked in >>>>>>>>> the past. >>>>>>>>> >>>>>>>>> At least for GNOME this has been fixed in userspace by ignoring >>>>>>>>> power-button events the first few seconds after a resume from suspend. >>>>>>>>> >>>>>>>> >>>>>>>> The default behavior for logind is: >>>>>>>> >>>>>>>> HandlePowerKey=poweroff >>>>>>>> >>>>>>>> Can you share more about what version of GNOME has a workaround? >>>>>>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >>>>>>>> >>>>>>>> Nonetheless if this is dependent on an Android userspace problem could we >>>>>>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? >>>>>>> >>>>>>> No it is not only Android, other userspace may want to distinguish >>>>>>> between normal and "dark" resume based on keyboard or other user >>>>>>> activity. >>>>>>> >>>>>>> Thanks. >>>>>>> >>>>>> In this specific case does the key passed up to satisfy this userspace >>>>>> requirement and keep it awake need to specifically be a fabricated >>>>>> KEY_POWER? >>>>>> >>>>>> Or could we find a key that doesn't require some userspace to ignore >>>>>> KEY_POWER? >>>>>> >>>>>> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? >>>>> >>>>> The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. >>>>> It simply passes event to userspace for processing. >>>> >>>> Right. I don't expect a problem with most keys, but my proposal is to >>>> special case KEY_POWER while suspended. If a key press event must be sent >>>> to keep Android and other userspace happy I suggest sending something >>>> different just for that situation. >>> >>> I do not know if userspace specifically looks for KEY_POWER or if it >>> looks for user input in general, and I'd rather be on safe side and not >>> mangle user input. >>> >>> As Hans mentioned, at least some userspace already prepared to deal with >>> this issue. And again, this only works if by the time ISR/debounce >>> runs the key is already released. What if it is still pressed? You still >>> going to observe KEY_POWER and need to suppress turning off the screen. >>> >>>> >>>> Like this: >>>> >>>> diff --git a/drivers/input/keyboard/gpio_keys.c >>>> b/drivers/input/keyboard/gpio_keys.c >>>> index 773aa5294d269..66e788d381956 100644 >>>> --- a/drivers/input/keyboard/gpio_keys.c >>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>> @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >>>> *dev_id) >>>> * already released by the time we got interrupt >>>> * handler to run. >>>> */ >>>> - input_report_key(bdata->input, button->code, 1); >>>> + if (button->code == KEY_POWER) >>>> + input_report_key(bdata->input, KEY_WAKEUP, >>>> 1); >>> >>> Just FYI: Here your KEY_WAKEUP is stuck forever. >>> >>>> + else >>>> + input_report_key(bdata->input, button->code, >>>> 1); >>>> } >>>> } >>>> >>>> >>>> >>>>> >>>>> You need to fix your userspace. Even with your tweak it is possible for >>>>> userspace to get a normal key event "too early" and turn off the screen >>>>> again, so you still need to handle this situation. >>>>> >>>>> Thanks. >>>>> >>>> >>>> I want to note this driver works quite differently than how ACPI power >>>> button does. >>>> >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my >>>> patch was modeling). >>>> >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >>>> [1] >>> >>> If you check acpi_button_resume() you will see that the events are sent >>> from there. Except that for some reason they chose to use KEY_WAKEUP and >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on >>> multiple other platforms. >> >> Interesting, but the ACPI button code presumably only does this on resume >> for a normal press while the system is awake it does use KEY_POWER, right ? > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > it does not seem to be captured in the email discussions or in the patch > description. I assume they did this to avoid the immediate re-suspend on wakeup by power-button issue. GNOME has a workaround for this, but I assume that some userspace desktop environments are still going to have a problem with this. Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:16 ` Hans de Goede @ 2025-06-26 19:18 ` Rafael J. Wysocki 2025-06-26 19:28 ` Dmitry Torokhov 2025-06-26 19:28 ` Rafael J. Wysocki 0 siblings, 2 replies; 53+ messages in thread From: Rafael J. Wysocki @ 2025-06-26 19:18 UTC (permalink / raw) To: Hans de Goede Cc: Dmitry Torokhov, Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > Hi, > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > >> Hi, > >> > >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > >>>> On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: > >>>>> On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: > >>>>>> > >>>>>> > >>>>>> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > >>>>>>> Hi Mario, > >>>>>>> > >>>>>>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > >>>>>>>> > >>>>>>>> > >>>>>>>> On 6/26/25 3:35 AM, Hans de Goede wrote: > >>>>>>>>> Hi Mario, > >>>>>>>>> > >>>>>>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: > >>>>>>>>>> From: Mario Limonciello <mario.limonciello@amd.com> > >>>>>>>>>> > >>>>>>>>>> Sending an input event to wake a system does wake it, but userspace picks > >>>>>>>>>> up the keypress and processes it. This isn't the intended behavior as it > >>>>>>>>>> causes a suspended system to wake up and then potentially turn off if > >>>>>>>>>> userspace is configured to turn off on power button presses. > >>>>>>>>>> > >>>>>>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. > >>>>>>>>>> > >>>>>>>>>> Cc: Hans de Goede <hansg@kernel.org> > >>>>>>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > >>>>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > >>>>>>>>>> --- > >>>>>>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ > >>>>>>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) > >>>>>>>>>> > >>>>>>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > >>>>>>>>>> index 773aa5294d269..4c6876b099c43 100644 > >>>>>>>>>> --- a/drivers/input/keyboard/gpio_keys.c > >>>>>>>>>> +++ b/drivers/input/keyboard/gpio_keys.c > >>>>>>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > >>>>>>>>>> pm_stay_awake(bdata->input->dev.parent); > >>>>>>>>>> if (bdata->suspended && > >>>>>>>>>> (button->type == 0 || button->type == EV_KEY)) { > >>>>>>>>>> - /* > >>>>>>>>>> - * Simulate wakeup key press in case the key has > >>>>>>>>>> - * already released by the time we got interrupt > >>>>>>>>>> - * handler to run. > >>>>>>>>>> - */ > >>>>>>>>>> - input_report_key(bdata->input, button->code, 1); > >>>>>>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); > >>>>>>> > >>>>>>> There is already pm_stay_awake() above. > >>>>>> > >>>>>> But that doesn't help with the fact that userspace gets KEY_POWER from this > >>>>>> and reacts to it. > >>>>>> > >>>>>>> > >>>>>>>>>> } > >>>>>>>>>> } > >>>>>>>>> > >>>>>>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail > >>>>>>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. > >>>>>>>>> Android userspace actually needs the button-press (evdev) event to not > >>>>>>>>> immediately go back to sleep, so a similar patch has been nacked in > >>>>>>>>> the past. > >>>>>>>>> > >>>>>>>>> At least for GNOME this has been fixed in userspace by ignoring > >>>>>>>>> power-button events the first few seconds after a resume from suspend. > >>>>>>>>> > >>>>>>>> > >>>>>>>> The default behavior for logind is: > >>>>>>>> > >>>>>>>> HandlePowerKey=poweroff > >>>>>>>> > >>>>>>>> Can you share more about what version of GNOME has a workaround? > >>>>>>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. > >>>>>>>> > >>>>>>>> Nonetheless if this is dependent on an Android userspace problem could we > >>>>>>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > >>>>>>> > >>>>>>> No it is not only Android, other userspace may want to distinguish > >>>>>>> between normal and "dark" resume based on keyboard or other user > >>>>>>> activity. > >>>>>>> > >>>>>>> Thanks. > >>>>>>> > >>>>>> In this specific case does the key passed up to satisfy this userspace > >>>>>> requirement and keep it awake need to specifically be a fabricated > >>>>>> KEY_POWER? > >>>>>> > >>>>>> Or could we find a key that doesn't require some userspace to ignore > >>>>>> KEY_POWER? > >>>>>> > >>>>>> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? > >>>>> > >>>>> The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. > >>>>> It simply passes event to userspace for processing. > >>>> > >>>> Right. I don't expect a problem with most keys, but my proposal is to > >>>> special case KEY_POWER while suspended. If a key press event must be sent > >>>> to keep Android and other userspace happy I suggest sending something > >>>> different just for that situation. > >>> > >>> I do not know if userspace specifically looks for KEY_POWER or if it > >>> looks for user input in general, and I'd rather be on safe side and not > >>> mangle user input. > >>> > >>> As Hans mentioned, at least some userspace already prepared to deal with > >>> this issue. And again, this only works if by the time ISR/debounce > >>> runs the key is already released. What if it is still pressed? You still > >>> going to observe KEY_POWER and need to suppress turning off the screen. > >>> > >>>> > >>>> Like this: > >>>> > >>>> diff --git a/drivers/input/keyboard/gpio_keys.c > >>>> b/drivers/input/keyboard/gpio_keys.c > >>>> index 773aa5294d269..66e788d381956 100644 > >>>> --- a/drivers/input/keyboard/gpio_keys.c > >>>> +++ b/drivers/input/keyboard/gpio_keys.c > >>>> @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void > >>>> *dev_id) > >>>> * already released by the time we got interrupt > >>>> * handler to run. > >>>> */ > >>>> - input_report_key(bdata->input, button->code, 1); > >>>> + if (button->code == KEY_POWER) > >>>> + input_report_key(bdata->input, KEY_WAKEUP, > >>>> 1); > >>> > >>> Just FYI: Here your KEY_WAKEUP is stuck forever. > >>> > >>>> + else > >>>> + input_report_key(bdata->input, button->code, > >>>> 1); > >>>> } > >>>> } > >>>> > >>>> > >>>> > >>>>> > >>>>> You need to fix your userspace. Even with your tweak it is possible for > >>>>> userspace to get a normal key event "too early" and turn off the screen > >>>>> again, so you still need to handle this situation. > >>>>> > >>>>> Thanks. > >>>>> > >>>> > >>>> I want to note this driver works quite differently than how ACPI power > >>>> button does. > >>>> > >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > >>>> patch was modeling). > >>>> > >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > >>>> [1] > >>> > >>> If you check acpi_button_resume() you will see that the events are sent > >>> from there. Except that for some reason they chose to use KEY_WAKEUP and > >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > >>> multiple other platforms. > >> > >> Interesting, but the ACPI button code presumably only does this on resume > >> for a normal press while the system is awake it does use KEY_POWER, right ? > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > it does not seem to be captured in the email discussions or in the patch > > description. > > I assume they did this to avoid the immediate re-suspend on wakeup by > power-button issue. GNOME has a workaround for this, but I assume that > some userspace desktop environments are still going to have a problem > with this. It was done for this reason IIRC, but it should have been documented more thoroughly. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:18 ` Rafael J. Wysocki @ 2025-06-26 19:28 ` Dmitry Torokhov 2025-06-26 19:31 ` Rafael J. Wysocki 2025-06-26 19:28 ` Rafael J. Wysocki 1 sibling, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 19:28 UTC (permalink / raw) To: Rafael J. Wysocki Cc: Hans de Goede, Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > > > Hi, > > > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > > >> Hi, > > >> > > >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: [...] > > >>>> I want to note this driver works quite differently than how ACPI power > > >>>> button does. > > >>>> > > >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > > >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > > >>>> patch was modeling). > > >>>> > > >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > >>>> [1] > > >>> > > >>> If you check acpi_button_resume() you will see that the events are sent > > >>> from there. Except that for some reason they chose to use KEY_WAKEUP and > > >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > >>> multiple other platforms. > > >> > > >> Interesting, but the ACPI button code presumably only does this on resume > > >> for a normal press while the system is awake it does use KEY_POWER, right ? > > > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > > it does not seem to be captured in the email discussions or in the patch > > > description. > > > > I assume they did this to avoid the immediate re-suspend on wakeup by > > power-button issue. GNOME has a workaround for this, but I assume that > > some userspace desktop environments are still going to have a problem > > with this. > > It was done for this reason IIRC, but it should have been documented > more thoroughly. I assert that it should not have been done and instead dealt with in userspace. There are numerous drivers in the kernel emitting KEY_POWER. Let userspace decide how to handle this, what keys to ignore, what keys to process and when. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:28 ` Dmitry Torokhov @ 2025-06-26 19:31 ` Rafael J. Wysocki 2025-06-26 19:40 ` Dmitry Torokhov 0 siblings, 1 reply; 53+ messages in thread From: Rafael J. Wysocki @ 2025-06-26 19:31 UTC (permalink / raw) To: Dmitry Torokhov Cc: Rafael J. Wysocki, Hans de Goede, Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > > On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > > On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > > > > > Hi, > > > > > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > > > >> Hi, > > > >> > > > >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > > >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > [...] > > > >>>> I want to note this driver works quite differently than how ACPI power > > > >>>> button does. > > > >>>> > > > >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > > > >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > > > >>>> patch was modeling). > > > >>>> > > > >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > > >>>> [1] > > > >>> > > > >>> If you check acpi_button_resume() you will see that the events are sent > > > >>> from there. Except that for some reason they chose to use KEY_WAKEUP and > > > >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > > >>> multiple other platforms. > > > >> > > > >> Interesting, but the ACPI button code presumably only does this on resume > > > >> for a normal press while the system is awake it does use KEY_POWER, right ? > > > > > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > > > it does not seem to be captured in the email discussions or in the patch > > > > description. > > > > > > I assume they did this to avoid the immediate re-suspend on wakeup by > > > power-button issue. GNOME has a workaround for this, but I assume that > > > some userspace desktop environments are still going to have a problem > > > with this. > > > > It was done for this reason IIRC, but it should have been documented > > more thoroughly. > > I assert that it should not have been done and instead dealt with in > userspace. There are numerous drivers in the kernel emitting > KEY_POWER. Let userspace decide how to handle this, what keys to ignore, > what keys to process and when. Please see my last message in this thread (just sent) and see the changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key events"). This appears to be about cases when no event would be signaled to user space at all (power button wakeup from ACPI S3). ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:31 ` Rafael J. Wysocki @ 2025-06-26 19:40 ` Dmitry Torokhov 2025-06-26 22:21 ` Mario Limonciello 2025-06-27 10:36 ` Rafael J. Wysocki 0 siblings, 2 replies; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-26 19:40 UTC (permalink / raw) To: Rafael J. Wysocki Cc: Hans de Goede, Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: > On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov > <dmitry.torokhov@gmail.com> wrote: > > > > On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > > > On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > > > > > > > Hi, > > > > > > > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > > > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > > > > >> Hi, > > > > >> > > > > >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > > > >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > > [...] > > > > >>>> I want to note this driver works quite differently than how ACPI power > > > > >>>> button does. > > > > >>>> > > > > >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > > > > >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > > > > >>>> patch was modeling). > > > > >>>> > > > > >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > > > >>>> [1] > > > > >>> > > > > >>> If you check acpi_button_resume() you will see that the events are sent > > > > >>> from there. Except that for some reason they chose to use KEY_WAKEUP and > > > > >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > > > >>> multiple other platforms. > > > > >> > > > > >> Interesting, but the ACPI button code presumably only does this on resume > > > > >> for a normal press while the system is awake it does use KEY_POWER, right ? > > > > > > > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > > > > it does not seem to be captured in the email discussions or in the patch > > > > > description. > > > > > > > > I assume they did this to avoid the immediate re-suspend on wakeup by > > > > power-button issue. GNOME has a workaround for this, but I assume that > > > > some userspace desktop environments are still going to have a problem > > > > with this. > > > > > > It was done for this reason IIRC, but it should have been documented > > > more thoroughly. > > > > I assert that it should not have been done and instead dealt with in > > userspace. There are numerous drivers in the kernel emitting > > KEY_POWER. Let userspace decide how to handle this, what keys to ignore, > > what keys to process and when. > > Please see my last message in this thread (just sent) and see the > changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key > events"). > > This appears to be about cases when no event would be signaled to user > space at all (power button wakeup from ACPI S3). Ahh, in S3 we do not know if we've been woken up with Sleep or Power button, right? So we can not send the "right" event code and use "neutral" KEY_WAKEUP for both. Is this right? Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:40 ` Dmitry Torokhov @ 2025-06-26 22:21 ` Mario Limonciello 2025-06-27 4:56 ` Dmitry Torokhov 2025-06-27 10:36 ` Rafael J. Wysocki 1 sibling, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 22:21 UTC (permalink / raw) To: Dmitry Torokhov, Rafael J. Wysocki Cc: Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: > On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: >> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov >> <dmitry.torokhov@gmail.com> wrote: >>> >>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: >>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: >>>>> >>>>> Hi, >>>>> >>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: >>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: >>>>>>> Hi, >>>>>>> >>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: >>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >>> [...] >>>>>>>>> I want to note this driver works quite differently than how ACPI power >>>>>>>>> button does. >>>>>>>>> >>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded >>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my >>>>>>>>> patch was modeling). >>>>>>>>> >>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >>>>>>>>> [1] >>>>>>>> >>>>>>>> If you check acpi_button_resume() you will see that the events are sent >>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and >>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on >>>>>>>> multiple other platforms. >>>>>>> >>>>>>> Interesting, but the ACPI button code presumably only does this on resume >>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? >>>>>> >>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, >>>>>> it does not seem to be captured in the email discussions or in the patch >>>>>> description. >>>>> >>>>> I assume they did this to avoid the immediate re-suspend on wakeup by >>>>> power-button issue. GNOME has a workaround for this, but I assume that >>>>> some userspace desktop environments are still going to have a problem >>>>> with this. >>>> >>>> It was done for this reason IIRC, but it should have been documented >>>> more thoroughly. >>> >>> I assert that it should not have been done and instead dealt with in >>> userspace. There are numerous drivers in the kernel emitting >>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, >>> what keys to process and when. >> >> Please see my last message in this thread (just sent) and see the >> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key >> events"). >> >> This appears to be about cases when no event would be signaled to user >> space at all (power button wakeup from ACPI S3). > > Ahh, in S3 we do not know if we've been woken up with Sleep or Power > button, right? So we can not send the "right" event code and use > "neutral" KEY_WAKEUP for both. Is this right? > > Thanks. > I did some more experiments with this affected system that started this thread (which uses s2idle). I only applied patch 3 in this series to help the debounce behavior and figure out impacts from patch 4 with existing Linux userspace. If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 the GNOME workaround mitigates this problem and no visible impact. If I suspend by hand using the kernel interface and then press power button to wake: # echo mem | sudo tee /sys/power/state: * When GNOME is running: I get the shutdown popup and it eventually shuts down. * When GNOME isn't running (just on a VT): System shuts down. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 22:21 ` Mario Limonciello @ 2025-06-27 4:56 ` Dmitry Torokhov 2025-06-27 14:06 ` Mario Limonciello 0 siblings, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-27 4:56 UTC (permalink / raw) To: Mario Limonciello Cc: Rafael J. Wysocki, Hans de Goede, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: > On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: > > On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: > > > On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov > > > <dmitry.torokhov@gmail.com> wrote: > > > > > > > > On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > > > > > On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > > > > > > > > > > > Hi, > > > > > > > > > > > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > > > > > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > > > > > > > > Hi, > > > > > > > > > > > > > > > > On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > > > > > > > > On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > > > > [...] > > > > > > > > > > I want to note this driver works quite differently than how ACPI power > > > > > > > > > > button does. > > > > > > > > > > > > > > > > > > > > You can see in acpi_button_notify() that the "keypress" is only forwarded > > > > > > > > > > when not suspended [1]. Otherwise it's just wakeup event (which is what my > > > > > > > > > > patch was modeling). > > > > > > > > > > > > > > > > > > > > https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > > > > > > > > > [1] > > > > > > > > > > > > > > > > > > If you check acpi_button_resume() you will see that the events are sent > > > > > > > > > from there. Except that for some reason they chose to use KEY_WAKEUP and > > > > > > > > > not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > > > > > > > > multiple other platforms. > > > > > > > > > > > > > > > > Interesting, but the ACPI button code presumably only does this on resume > > > > > > > > for a normal press while the system is awake it does use KEY_POWER, right ? > > > > > > > > > > > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > > > > > > it does not seem to be captured in the email discussions or in the patch > > > > > > > description. > > > > > > > > > > > > I assume they did this to avoid the immediate re-suspend on wakeup by > > > > > > power-button issue. GNOME has a workaround for this, but I assume that > > > > > > some userspace desktop environments are still going to have a problem > > > > > > with this. > > > > > > > > > > It was done for this reason IIRC, but it should have been documented > > > > > more thoroughly. > > > > > > > > I assert that it should not have been done and instead dealt with in > > > > userspace. There are numerous drivers in the kernel emitting > > > > KEY_POWER. Let userspace decide how to handle this, what keys to ignore, > > > > what keys to process and when. > > > > > > Please see my last message in this thread (just sent) and see the > > > changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key > > > events"). > > > > > > This appears to be about cases when no event would be signaled to user > > > space at all (power button wakeup from ACPI S3). > > > > Ahh, in S3 we do not know if we've been woken up with Sleep or Power > > button, right? So we can not send the "right" event code and use > > "neutral" KEY_WAKEUP for both. Is this right? > > > > Thanks. > > > > I did some more experiments with this affected system that started this > thread (which uses s2idle). > > I only applied patch 3 in this series to help the debounce behavior and > figure out impacts from patch 4 with existing Linux userspace. > > If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 > the GNOME workaround mitigates this problem and no visible impact. > > If I suspend by hand using the kernel interface and then press power button > to wake: > > # echo mem | sudo tee /sys/power/state: > > * When GNOME is running: > I get the shutdown popup and it eventually shuts down. > > * When GNOME isn't running (just on a VT): > System shuts down. For the latter you may want to raise an issue with systemd, and for the former I guess it is being too clever and does not activate the workaround if suspend was not initiated by it? I think Gnome is being too careful. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 4:56 ` Dmitry Torokhov @ 2025-06-27 14:06 ` Mario Limonciello 2025-06-27 14:14 ` Hans de Goede 0 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-27 14:06 UTC (permalink / raw) To: Dmitry Torokhov, Hans de Goede Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: > On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: >> On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: >>> On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: >>>> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov >>>> <dmitry.torokhov@gmail.com> wrote: >>>>> >>>>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: >>>>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: >>>>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: >>>>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >>>>> [...] >>>>>>>>>>> I want to note this driver works quite differently than how ACPI power >>>>>>>>>>> button does. >>>>>>>>>>> >>>>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded >>>>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my >>>>>>>>>>> patch was modeling). >>>>>>>>>>> >>>>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >>>>>>>>>>> [1] >>>>>>>>>> >>>>>>>>>> If you check acpi_button_resume() you will see that the events are sent >>>>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and >>>>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on >>>>>>>>>> multiple other platforms. >>>>>>>>> >>>>>>>>> Interesting, but the ACPI button code presumably only does this on resume >>>>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? >>>>>>>> >>>>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, >>>>>>>> it does not seem to be captured in the email discussions or in the patch >>>>>>>> description. >>>>>>> >>>>>>> I assume they did this to avoid the immediate re-suspend on wakeup by >>>>>>> power-button issue. GNOME has a workaround for this, but I assume that >>>>>>> some userspace desktop environments are still going to have a problem >>>>>>> with this. >>>>>> >>>>>> It was done for this reason IIRC, but it should have been documented >>>>>> more thoroughly. >>>>> >>>>> I assert that it should not have been done and instead dealt with in >>>>> userspace. There are numerous drivers in the kernel emitting >>>>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, >>>>> what keys to process and when. >>>> >>>> Please see my last message in this thread (just sent) and see the >>>> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key >>>> events"). >>>> >>>> This appears to be about cases when no event would be signaled to user >>>> space at all (power button wakeup from ACPI S3). >>> >>> Ahh, in S3 we do not know if we've been woken up with Sleep or Power >>> button, right? So we can not send the "right" event code and use >>> "neutral" KEY_WAKEUP for both. Is this right? >>> >>> Thanks. >>> >> >> I did some more experiments with this affected system that started this >> thread (which uses s2idle). >> >> I only applied patch 3 in this series to help the debounce behavior and >> figure out impacts from patch 4 with existing Linux userspace. >> >> If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 >> the GNOME workaround mitigates this problem and no visible impact. >> >> If I suspend by hand using the kernel interface and then press power button >> to wake: >> >> # echo mem | sudo tee /sys/power/state: >> >> * When GNOME is running: >> I get the shutdown popup and it eventually shuts down. >> >> * When GNOME isn't running (just on a VT): >> System shuts down. > > For the latter you may want to raise an issue with systemd, and for the > former I guess it is being too clever and does not activate the > workaround if suspend was not initiated by it? I think Gnome is being > too careful. > > Thanks. > Sure I could file bugs with both the projects. But before I do if all userspace needs to account for this with a series of workarounds at resume time, you still think that is that really the best way forward? Hans, you have a lot of experience in the GNOME community. Your thoughts? ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 14:06 ` Mario Limonciello @ 2025-06-27 14:14 ` Hans de Goede 2025-06-27 14:44 ` Dmitry Torokhov 0 siblings, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-27 14:14 UTC (permalink / raw) To: Mario Limonciello, Dmitry Torokhov Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 27-Jun-25 4:06 PM, Mario Limonciello wrote: > On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: >> On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: >>> On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: >>>> On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: >>>>> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov >>>>> <dmitry.torokhov@gmail.com> wrote: >>>>>> >>>>>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: >>>>>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: >>>>>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: >>>>>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >>>>>> [...] >>>>>>>>>>>> I want to note this driver works quite differently than how ACPI power >>>>>>>>>>>> button does. >>>>>>>>>>>> >>>>>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded >>>>>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my >>>>>>>>>>>> patch was modeling). >>>>>>>>>>>> >>>>>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >>>>>>>>>>>> [1] >>>>>>>>>>> >>>>>>>>>>> If you check acpi_button_resume() you will see that the events are sent >>>>>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and >>>>>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on >>>>>>>>>>> multiple other platforms. >>>>>>>>>> >>>>>>>>>> Interesting, but the ACPI button code presumably only does this on resume >>>>>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? >>>>>>>>> >>>>>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, >>>>>>>>> it does not seem to be captured in the email discussions or in the patch >>>>>>>>> description. >>>>>>>> >>>>>>>> I assume they did this to avoid the immediate re-suspend on wakeup by >>>>>>>> power-button issue. GNOME has a workaround for this, but I assume that >>>>>>>> some userspace desktop environments are still going to have a problem >>>>>>>> with this. >>>>>>> >>>>>>> It was done for this reason IIRC, but it should have been documented >>>>>>> more thoroughly. >>>>>> >>>>>> I assert that it should not have been done and instead dealt with in >>>>>> userspace. There are numerous drivers in the kernel emitting >>>>>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, >>>>>> what keys to process and when. >>>>> >>>>> Please see my last message in this thread (just sent) and see the >>>>> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key >>>>> events"). >>>>> >>>>> This appears to be about cases when no event would be signaled to user >>>>> space at all (power button wakeup from ACPI S3). >>>> >>>> Ahh, in S3 we do not know if we've been woken up with Sleep or Power >>>> button, right? So we can not send the "right" event code and use >>>> "neutral" KEY_WAKEUP for both. Is this right? >>>> >>>> Thanks. >>>> >>> >>> I did some more experiments with this affected system that started this >>> thread (which uses s2idle). >>> >>> I only applied patch 3 in this series to help the debounce behavior and >>> figure out impacts from patch 4 with existing Linux userspace. >>> >>> If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 >>> the GNOME workaround mitigates this problem and no visible impact. >>> >>> If I suspend by hand using the kernel interface and then press power button >>> to wake: >>> >>> # echo mem | sudo tee /sys/power/state: >>> >>> * When GNOME is running: >>> I get the shutdown popup and it eventually shuts down. >>> >>> * When GNOME isn't running (just on a VT): >>> System shuts down. >> >> For the latter you may want to raise an issue with systemd, and for the >> former I guess it is being too clever and does not activate the >> workaround if suspend was not initiated by it? I think Gnome is being >> too careful. >> >> Thanks. >> > > Sure I could file bugs with both the projects. > > But before I do if all userspace needs to account for this with a series of workarounds at resume time, you still think that is that really the best way forward? > > Hans, you have a lot of experience in the GNOME community. Your thoughts? I guess it would be good to fix this in the kernel, sending KEY_WAKEUP from gpio_key when the event is KEY_POWER and we are going through the special wakeup path in gpio_keys. When this was discussed quite a while ago the ACPI button driver simply did not send any event at all on wkaeup by ACPI power-button. Know that it does send an event it would be good to mimic this, at least when the gpio_key devices where instantiated by soc_button_array. So maybe add a new field to struct gpio_keys_button called wakeup_code and when that is not 0 use that instead of the plain "code" member on wakeups ? That would keep the gpio_keys code generic while allowing to mimic the ACPI button behavior. And then set wakeup_code to KEY_WAKEUP for the power-button in soc_button_array. To me this sounds better then trying to fix all userspace code which does something on KEY_POWER of which there is quite a lot. The special GNOME power-button handling was always a workaround because last time a kernel fix was nacked. But now with the KEY_WAKEUP done by the ACPI button code it looks like we do have a good way to fix this in the kernel, so that would be better IMHO. Dmitry, what do you think of adding a wakeup_code field to struct gpio_keys_button and let the code creating the gpio_keys_button decide if a different code should be used on wakeup or not ? Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 14:14 ` Hans de Goede @ 2025-06-27 14:44 ` Dmitry Torokhov 2025-06-27 15:56 ` Hans de Goede 0 siblings, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-27 14:44 UTC (permalink / raw) To: Hans de Goede Cc: Mario Limonciello, Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: > Hi, > > On 27-Jun-25 4:06 PM, Mario Limonciello wrote: > > On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: > >> On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: > >>> On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: > >>>> On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: > >>>>> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov > >>>>> <dmitry.torokhov@gmail.com> wrote: > >>>>>> > >>>>>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > >>>>>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > >>>>>>>> > >>>>>>>> Hi, > >>>>>>>> > >>>>>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: > >>>>>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > >>>>>>>>>> Hi, > >>>>>>>>>> > >>>>>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > >>>>>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > >>>>>> [...] > >>>>>>>>>>>> I want to note this driver works quite differently than how ACPI power > >>>>>>>>>>>> button does. > >>>>>>>>>>>> > >>>>>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > >>>>>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > >>>>>>>>>>>> patch was modeling). > >>>>>>>>>>>> > >>>>>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > >>>>>>>>>>>> [1] > >>>>>>>>>>> > >>>>>>>>>>> If you check acpi_button_resume() you will see that the events are sent > >>>>>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and > >>>>>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > >>>>>>>>>>> multiple other platforms. > >>>>>>>>>> > >>>>>>>>>> Interesting, but the ACPI button code presumably only does this on resume > >>>>>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? > >>>>>>>>> > >>>>>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, > >>>>>>>>> it does not seem to be captured in the email discussions or in the patch > >>>>>>>>> description. > >>>>>>>> > >>>>>>>> I assume they did this to avoid the immediate re-suspend on wakeup by > >>>>>>>> power-button issue. GNOME has a workaround for this, but I assume that > >>>>>>>> some userspace desktop environments are still going to have a problem > >>>>>>>> with this. > >>>>>>> > >>>>>>> It was done for this reason IIRC, but it should have been documented > >>>>>>> more thoroughly. > >>>>>> > >>>>>> I assert that it should not have been done and instead dealt with in > >>>>>> userspace. There are numerous drivers in the kernel emitting > >>>>>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, > >>>>>> what keys to process and when. > >>>>> > >>>>> Please see my last message in this thread (just sent) and see the > >>>>> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key > >>>>> events"). > >>>>> > >>>>> This appears to be about cases when no event would be signaled to user > >>>>> space at all (power button wakeup from ACPI S3). > >>>> > >>>> Ahh, in S3 we do not know if we've been woken up with Sleep or Power > >>>> button, right? So we can not send the "right" event code and use > >>>> "neutral" KEY_WAKEUP for both. Is this right? > >>>> > >>>> Thanks. > >>>> > >>> > >>> I did some more experiments with this affected system that started this > >>> thread (which uses s2idle). > >>> > >>> I only applied patch 3 in this series to help the debounce behavior and > >>> figure out impacts from patch 4 with existing Linux userspace. > >>> > >>> If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 > >>> the GNOME workaround mitigates this problem and no visible impact. > >>> > >>> If I suspend by hand using the kernel interface and then press power button > >>> to wake: > >>> > >>> # echo mem | sudo tee /sys/power/state: > >>> > >>> * When GNOME is running: > >>> I get the shutdown popup and it eventually shuts down. > >>> > >>> * When GNOME isn't running (just on a VT): > >>> System shuts down. > >> > >> For the latter you may want to raise an issue with systemd, and for the > >> former I guess it is being too clever and does not activate the > >> workaround if suspend was not initiated by it? I think Gnome is being > >> too careful. > >> > >> Thanks. > >> > > > > Sure I could file bugs with both the projects. > > > > But before I do if all userspace needs to account for this with a series of workarounds at resume time, you still think that is that really the best way forward? > > > > Hans, you have a lot of experience in the GNOME community. Your thoughts? > > I guess it would be good to fix this in the kernel, sending > KEY_WAKEUP from gpio_key when the event is KEY_POWER and > we are going through the special wakeup path in gpio_keys. > > When this was discussed quite a while ago the ACPI button > driver simply did not send any event at all on wkaeup > by ACPI power-button. Know that it does send an event > it would be good to mimic this, at least when the gpio_key > devices where instantiated by soc_button_array. > > So maybe add a new field to struct gpio_keys_button > called wakeup_code and when that is not 0 use that > instead of the plain "code" member on wakeups ? > > That would keep the gpio_keys code generic while > allowing to mimic the ACPI button behavior. > > And then set wakeup_code to KEY_WAKEUP for > the power-button in soc_button_array. > > To me this sounds better then trying to fix all userspace > code which does something on KEY_POWER of which there > is quite a lot. > > The special GNOME power-button handling was always > a workaround because last time a kernel fix was > nacked. But now with the KEY_WAKEUP done by the ACPI > button code it looks like we do have a good way > to fix this in the kernel, so that would be better > IMHO. > > Dmitry, what do you think of adding a wakeup_code > field to struct gpio_keys_button and let the code > creating the gpio_keys_button decide if a different > code should be used on wakeup or not ? And what is the plan on dealing with all other drivers that emit KEY_POWER? What about acpi button behavior when using S0ix? What about holding power button for too long so that normal reporting "catches" the pressed state? Kernel reports hardware events, interpreting them and applying certain policies is task for userspace. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 14:44 ` Dmitry Torokhov @ 2025-06-27 15:56 ` Hans de Goede 2025-06-27 16:12 ` Andy Shevchenko 2025-06-27 18:36 ` Dmitry Torokhov 0 siblings, 2 replies; 53+ messages in thread From: Hans de Goede @ 2025-06-27 15:56 UTC (permalink / raw) To: Dmitry Torokhov Cc: Mario Limonciello, Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi Dmitry, On 27-Jun-25 4:44 PM, Dmitry Torokhov wrote: > On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: >> Hi, >> >> On 27-Jun-25 4:06 PM, Mario Limonciello wrote: >>> On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: >>>> On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: >>>>> On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: >>>>>> On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: >>>>>>> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov >>>>>>> <dmitry.torokhov@gmail.com> wrote: >>>>>>>> >>>>>>>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: >>>>>>>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: >>>>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: >>>>>>>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: >>>>>>>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >>>>>>>> [...] >>>>>>>>>>>>>> I want to note this driver works quite differently than how ACPI power >>>>>>>>>>>>>> button does. >>>>>>>>>>>>>> >>>>>>>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded >>>>>>>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my >>>>>>>>>>>>>> patch was modeling). >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >>>>>>>>>>>>>> [1] >>>>>>>>>>>>> >>>>>>>>>>>>> If you check acpi_button_resume() you will see that the events are sent >>>>>>>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and >>>>>>>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on >>>>>>>>>>>>> multiple other platforms. >>>>>>>>>>>> >>>>>>>>>>>> Interesting, but the ACPI button code presumably only does this on resume >>>>>>>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? >>>>>>>>>>> >>>>>>>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, >>>>>>>>>>> it does not seem to be captured in the email discussions or in the patch >>>>>>>>>>> description. >>>>>>>>>> >>>>>>>>>> I assume they did this to avoid the immediate re-suspend on wakeup by >>>>>>>>>> power-button issue. GNOME has a workaround for this, but I assume that >>>>>>>>>> some userspace desktop environments are still going to have a problem >>>>>>>>>> with this. >>>>>>>>> >>>>>>>>> It was done for this reason IIRC, but it should have been documented >>>>>>>>> more thoroughly. >>>>>>>> >>>>>>>> I assert that it should not have been done and instead dealt with in >>>>>>>> userspace. There are numerous drivers in the kernel emitting >>>>>>>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, >>>>>>>> what keys to process and when. >>>>>>> >>>>>>> Please see my last message in this thread (just sent) and see the >>>>>>> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key >>>>>>> events"). >>>>>>> >>>>>>> This appears to be about cases when no event would be signaled to user >>>>>>> space at all (power button wakeup from ACPI S3). >>>>>> >>>>>> Ahh, in S3 we do not know if we've been woken up with Sleep or Power >>>>>> button, right? So we can not send the "right" event code and use >>>>>> "neutral" KEY_WAKEUP for both. Is this right? >>>>>> >>>>>> Thanks. >>>>>> >>>>> >>>>> I did some more experiments with this affected system that started this >>>>> thread (which uses s2idle). >>>>> >>>>> I only applied patch 3 in this series to help the debounce behavior and >>>>> figure out impacts from patch 4 with existing Linux userspace. >>>>> >>>>> If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 >>>>> the GNOME workaround mitigates this problem and no visible impact. >>>>> >>>>> If I suspend by hand using the kernel interface and then press power button >>>>> to wake: >>>>> >>>>> # echo mem | sudo tee /sys/power/state: >>>>> >>>>> * When GNOME is running: >>>>> I get the shutdown popup and it eventually shuts down. >>>>> >>>>> * When GNOME isn't running (just on a VT): >>>>> System shuts down. >>>> >>>> For the latter you may want to raise an issue with systemd, and for the >>>> former I guess it is being too clever and does not activate the >>>> workaround if suspend was not initiated by it? I think Gnome is being >>>> too careful. >>>> >>>> Thanks. >>>> >>> >>> Sure I could file bugs with both the projects. >>> >>> But before I do if all userspace needs to account for this with a series of workarounds at resume time, you still think that is that really the best way forward? >>> >>> Hans, you have a lot of experience in the GNOME community. Your thoughts? >> >> I guess it would be good to fix this in the kernel, sending >> KEY_WAKEUP from gpio_key when the event is KEY_POWER and >> we are going through the special wakeup path in gpio_keys. >> >> When this was discussed quite a while ago the ACPI button >> driver simply did not send any event at all on wkaeup >> by ACPI power-button. Know that it does send an event >> it would be good to mimic this, at least when the gpio_key >> devices where instantiated by soc_button_array. >> >> So maybe add a new field to struct gpio_keys_button >> called wakeup_code and when that is not 0 use that >> instead of the plain "code" member on wakeups ? >> >> That would keep the gpio_keys code generic while >> allowing to mimic the ACPI button behavior. >> >> And then set wakeup_code to KEY_WAKEUP for >> the power-button in soc_button_array. >> >> To me this sounds better then trying to fix all userspace >> code which does something on KEY_POWER of which there >> is quite a lot. >> >> The special GNOME power-button handling was always >> a workaround because last time a kernel fix was >> nacked. But now with the KEY_WAKEUP done by the ACPI >> button code it looks like we do have a good way >> to fix this in the kernel, so that would be better >> IMHO. >> >> Dmitry, what do you think of adding a wakeup_code >> field to struct gpio_keys_button and let the code >> creating the gpio_keys_button decide if a different >> code should be used on wakeup or not ? > > And what is the plan on dealing with all other drivers that emit > KEY_POWER? There actually aren't that many that I'm aware of. Note that this gpio_keys KEY_POWER evdev event generation on resume issue goes way back until the last time we had this conversation and it still has not really been fixed. And I've not seen any bug-reports about the same problem with any other drivers. > What about acpi button behavior when using S0ix? AFAIK it is the same as with S3, at least it is not causing any issues. I've never seen the ACPI button code cause re-suspend immediately on wakeup by what for all intends and purposes is a spurious KEY_POWER event. Last time we discussed this I wasn't really happy with the outcome of the discussion but I just went for it because of Android's reliance on the event and we lacked a better plan. Now that we've a fix for this in the form of KEY_WAKEUP it is time to properly fix this instead of doing userspace kludges. > What about > holding power button for too long so that normal reporting "catches" the > pressed state? The key-down event is send as KEY_WAKEUP instead, so userspace sees KEY_WAKEUP pressed not KEY_POWER. > Kernel reports hardware events, interpreting them and applying certain > policies is task for userspace. And atm it is actually doing a shitty job of reporting hwevents because there is no way for userspace to be able to differentiate between: 1. User pressed power-button to wakeup system 2. User pressed power-button after resume to do power-button-action (e.g. suspend system) Even though *the kernel* does *know* the difference. So the suggested change actually makes the kernel do its job of reporting hw-events better by making the reporting more accurate. ATM if I resume say a tablet with GNOME and then change my mind and press the power button within 3 seconds of resume to suspend it again the second power-button press will outright be ignored The current userspace workaround is racy like this, again the whole workaround in GNOME is just an ugly kludge which I did back then because we couldn't agree on a better way to deal with this in the kernel / because just suppressing sending KEY_POWER would break Android. The suggested use of KEY_WAKEUP is lightyears better then doing ignore KEY_POWER events for xx seconds after resume which is simply always going to be racy and always was just an ugly hack / never was a great solution. Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 15:56 ` Hans de Goede @ 2025-06-27 16:12 ` Andy Shevchenko 2025-06-27 17:59 ` Hans de Goede 2025-06-27 18:36 ` Dmitry Torokhov 1 sibling, 1 reply; 53+ messages in thread From: Andy Shevchenko @ 2025-06-27 16:12 UTC (permalink / raw) To: Hans de Goede Cc: Dmitry Torokhov, Mario Limonciello, Rafael J. Wysocki, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: > On 27-Jun-25 4:44 PM, Dmitry Torokhov wrote: > > On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: > >> On 27-Jun-25 4:06 PM, Mario Limonciello wrote: > >>> On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: ... > >>> Hans, you have a lot of experience in the GNOME community. Your thoughts? > >> > >> I guess it would be good to fix this in the kernel, sending > >> KEY_WAKEUP from gpio_key when the event is KEY_POWER and > >> we are going through the special wakeup path in gpio_keys. > >> > >> When this was discussed quite a while ago the ACPI button > >> driver simply did not send any event at all on wkaeup > >> by ACPI power-button. Know that it does send an event > >> it would be good to mimic this, at least when the gpio_key > >> devices where instantiated by soc_button_array. > >> > >> So maybe add a new field to struct gpio_keys_button > >> called wakeup_code and when that is not 0 use that > >> instead of the plain "code" member on wakeups ? > >> > >> That would keep the gpio_keys code generic while > >> allowing to mimic the ACPI button behavior. > >> > >> And then set wakeup_code to KEY_WAKEUP for > >> the power-button in soc_button_array. > >> > >> To me this sounds better then trying to fix all userspace > >> code which does something on KEY_POWER of which there > >> is quite a lot. > >> > >> The special GNOME power-button handling was always > >> a workaround because last time a kernel fix was > >> nacked. But now with the KEY_WAKEUP done by the ACPI > >> button code it looks like we do have a good way > >> to fix this in the kernel, so that would be better > >> IMHO. > >> > >> Dmitry, what do you think of adding a wakeup_code > >> field to struct gpio_keys_button and let the code > >> creating the gpio_keys_button decide if a different > >> code should be used on wakeup or not ? > > > > And what is the plan on dealing with all other drivers that emit > > KEY_POWER? > > There actually aren't that many that I'm aware of. > > Note that this gpio_keys KEY_POWER evdev event generation > on resume issue goes way back until the last time we had > this conversation and it still has not really been fixed. > > And I've not seen any bug-reports about the same problem > with any other drivers. > > > What about acpi button behavior when using S0ix? > > AFAIK it is the same as with S3, at least it is not > causing any issues. I've never seen the ACPI button code > cause re-suspend immediately on wakeup by what for all > intends and purposes is a spurious KEY_POWER event. > > Last time we discussed this I wasn't really happy with > the outcome of the discussion but I just went for it > because of Android's reliance on the event and we > lacked a better plan. > > Now that we've a fix for this in the form of KEY_WAKEUP > it is time to properly fix this instead of doing userspace > kludges. > > > What about > > holding power button for too long so that normal reporting "catches" the > > pressed state? > > The key-down event is send as KEY_WAKEUP instead, > so userspace sees KEY_WAKEUP pressed not KEY_POWER. > > > Kernel reports hardware events, interpreting them and applying certain > > policies is task for userspace. > > And atm it is actually doing a shitty job of reporting > hwevents because there is no way for userspace to be able > to differentiate between: > > 1. User pressed power-button to wakeup system > 2. User pressed power-button after resume to do > power-button-action (e.g. suspend system) > > Even though *the kernel* does *know* the difference. > > So the suggested change actually makes the kernel > do its job of reporting hw-events better by making > the reporting more accurate. > > ATM if I resume say a tablet with GNOME and then > change my mind and press the power button within > 3 seconds of resume to suspend it again the second > power-button press will outright be ignored > > The current userspace workaround is racy like this, > again the whole workaround in GNOME is just an ugly > kludge which I did back then because we couldn't > agree on a better way to deal with this in the kernel / > because just suppressing sending KEY_POWER would break > Android. > > The suggested use of KEY_WAKEUP is lightyears better > then doing ignore KEY_POWER events for xx seconds > after resume which is simply always going to be racy > and always was just an ugly hack / never was > a great solution. My take away from this discussion that in a sleep state the power button (or actually any wakeup source) should tell userspace "hey, we want to wake up". It doesn't tell "hey, we want to wake to power off". This sounds good to me as a user. Yes, if laptop is sleeping we need to wake it up to continue, the power off is just a next step of this flow. The expected hot topic here is the longer presses of power button, but I think if we have a timer and tell after say 3 second that the K_WUP was up and K_PW is down is not a solution, it will be always flaky. Just my 2c. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 16:12 ` Andy Shevchenko @ 2025-06-27 17:59 ` Hans de Goede 2025-06-27 18:47 ` Dmitry Torokhov 0 siblings, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-27 17:59 UTC (permalink / raw) To: Andy Shevchenko Cc: Dmitry Torokhov, Mario Limonciello, Rafael J. Wysocki, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 27-Jun-25 6:12 PM, Andy Shevchenko wrote: > On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: >> On 27-Jun-25 4:44 PM, Dmitry Torokhov wrote: >>> On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: >>>> On 27-Jun-25 4:06 PM, Mario Limonciello wrote: >>>>> On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: > > ... > >>>>> Hans, you have a lot of experience in the GNOME community. Your thoughts? >>>> >>>> I guess it would be good to fix this in the kernel, sending >>>> KEY_WAKEUP from gpio_key when the event is KEY_POWER and >>>> we are going through the special wakeup path in gpio_keys. >>>> >>>> When this was discussed quite a while ago the ACPI button >>>> driver simply did not send any event at all on wkaeup >>>> by ACPI power-button. Know that it does send an event >>>> it would be good to mimic this, at least when the gpio_key >>>> devices where instantiated by soc_button_array. >>>> >>>> So maybe add a new field to struct gpio_keys_button >>>> called wakeup_code and when that is not 0 use that >>>> instead of the plain "code" member on wakeups ? >>>> >>>> That would keep the gpio_keys code generic while >>>> allowing to mimic the ACPI button behavior. >>>> >>>> And then set wakeup_code to KEY_WAKEUP for >>>> the power-button in soc_button_array. >>>> >>>> To me this sounds better then trying to fix all userspace >>>> code which does something on KEY_POWER of which there >>>> is quite a lot. >>>> >>>> The special GNOME power-button handling was always >>>> a workaround because last time a kernel fix was >>>> nacked. But now with the KEY_WAKEUP done by the ACPI >>>> button code it looks like we do have a good way >>>> to fix this in the kernel, so that would be better >>>> IMHO. >>>> >>>> Dmitry, what do you think of adding a wakeup_code >>>> field to struct gpio_keys_button and let the code >>>> creating the gpio_keys_button decide if a different >>>> code should be used on wakeup or not ? >>> >>> And what is the plan on dealing with all other drivers that emit >>> KEY_POWER? >> >> There actually aren't that many that I'm aware of. >> >> Note that this gpio_keys KEY_POWER evdev event generation >> on resume issue goes way back until the last time we had >> this conversation and it still has not really been fixed. >> >> And I've not seen any bug-reports about the same problem >> with any other drivers. >> >>> What about acpi button behavior when using S0ix? >> >> AFAIK it is the same as with S3, at least it is not >> causing any issues. I've never seen the ACPI button code >> cause re-suspend immediately on wakeup by what for all >> intends and purposes is a spurious KEY_POWER event. >> >> Last time we discussed this I wasn't really happy with >> the outcome of the discussion but I just went for it >> because of Android's reliance on the event and we >> lacked a better plan. >> >> Now that we've a fix for this in the form of KEY_WAKEUP >> it is time to properly fix this instead of doing userspace >> kludges. >> >>> What about >>> holding power button for too long so that normal reporting "catches" the >>> pressed state? >> >> The key-down event is send as KEY_WAKEUP instead, >> so userspace sees KEY_WAKEUP pressed not KEY_POWER. >> >>> Kernel reports hardware events, interpreting them and applying certain >>> policies is task for userspace. >> >> And atm it is actually doing a shitty job of reporting >> hwevents because there is no way for userspace to be able >> to differentiate between: >> >> 1. User pressed power-button to wakeup system >> 2. User pressed power-button after resume to do >> power-button-action (e.g. suspend system) >> >> Even though *the kernel* does *know* the difference. >> >> So the suggested change actually makes the kernel >> do its job of reporting hw-events better by making >> the reporting more accurate. >> >> ATM if I resume say a tablet with GNOME and then >> change my mind and press the power button within >> 3 seconds of resume to suspend it again the second >> power-button press will outright be ignored >> >> The current userspace workaround is racy like this, >> again the whole workaround in GNOME is just an ugly >> kludge which I did back then because we couldn't >> agree on a better way to deal with this in the kernel / >> because just suppressing sending KEY_POWER would break >> Android. >> >> The suggested use of KEY_WAKEUP is lightyears better >> then doing ignore KEY_POWER events for xx seconds >> after resume which is simply always going to be racy >> and always was just an ugly hack / never was >> a great solution. > > My take away from this discussion that in a sleep state the power button > (or actually any wakeup source) should tell userspace "hey, we want to wake > up". It doesn't tell "hey, we want to wake to power off". > This sounds good to me as a user. Yes, if laptop is sleeping we need to wake > it up to continue, the power off is just a next step of this flow. Exactly. These are really 2 different events and the problem is that atm the kernel reports this as one and the same event type. It really is as simple as this. Note that I'm not proposing on making this change something which all gpio_keys drivers will get automatically. My idea of adding a wakeup_code field to struct gpio_keys_button allows individual gpio_keys users to opt-in to the behavior of sending KEY_SOMETHINGELSE on wakeup-by-gpio-button-press. Since soc_button_array is only used on x86/ACPI platforms and since by far the most x86/ACPI platforms use the ACPI button code for the power-button, which already behaves this way I do not expect any userspace problems from doing such a change in soc_button_array because if that were a problem then we would already have bug reports because of the ACPI button code's behavior. > The expected hot topic here is the longer presses of power button, but I think > if we have a timer and tell after say 3 second that the K_WUP was up and K_PW > is down is not a solution, it will be always flaky. If users do a long power-button press on x86 they are *always* trying to do a forced power-off and after 4s (or longer in some special cases) the hw itself will do such a forced poweroff. So I do not believe that we need to worry about long presses since those have a very specific meaning on x86/ACPI platforms. Also if there is a long press userspace will simply see KEY_WAKEUP never getting released, which is actually an accurate representation of things, the user woke up the system through the power-button and never released ir. Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 17:59 ` Hans de Goede @ 2025-06-27 18:47 ` Dmitry Torokhov 0 siblings, 0 replies; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-27 18:47 UTC (permalink / raw) To: Hans de Goede Cc: Andy Shevchenko, Mario Limonciello, Rafael J. Wysocki, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Fri, Jun 27, 2025 at 07:59:56PM +0200, Hans de Goede wrote: > Hi, > > On 27-Jun-25 6:12 PM, Andy Shevchenko wrote: > > On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: > >> On 27-Jun-25 4:44 PM, Dmitry Torokhov wrote: > >>> On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: > >>>> On 27-Jun-25 4:06 PM, Mario Limonciello wrote: > >>>>> On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: > > > > ... > > > >>>>> Hans, you have a lot of experience in the GNOME community. Your thoughts? > >>>> > >>>> I guess it would be good to fix this in the kernel, sending > >>>> KEY_WAKEUP from gpio_key when the event is KEY_POWER and > >>>> we are going through the special wakeup path in gpio_keys. > >>>> > >>>> When this was discussed quite a while ago the ACPI button > >>>> driver simply did not send any event at all on wkaeup > >>>> by ACPI power-button. Know that it does send an event > >>>> it would be good to mimic this, at least when the gpio_key > >>>> devices where instantiated by soc_button_array. > >>>> > >>>> So maybe add a new field to struct gpio_keys_button > >>>> called wakeup_code and when that is not 0 use that > >>>> instead of the plain "code" member on wakeups ? > >>>> > >>>> That would keep the gpio_keys code generic while > >>>> allowing to mimic the ACPI button behavior. > >>>> > >>>> And then set wakeup_code to KEY_WAKEUP for > >>>> the power-button in soc_button_array. > >>>> > >>>> To me this sounds better then trying to fix all userspace > >>>> code which does something on KEY_POWER of which there > >>>> is quite a lot. > >>>> > >>>> The special GNOME power-button handling was always > >>>> a workaround because last time a kernel fix was > >>>> nacked. But now with the KEY_WAKEUP done by the ACPI > >>>> button code it looks like we do have a good way > >>>> to fix this in the kernel, so that would be better > >>>> IMHO. > >>>> > >>>> Dmitry, what do you think of adding a wakeup_code > >>>> field to struct gpio_keys_button and let the code > >>>> creating the gpio_keys_button decide if a different > >>>> code should be used on wakeup or not ? > >>> > >>> And what is the plan on dealing with all other drivers that emit > >>> KEY_POWER? > >> > >> There actually aren't that many that I'm aware of. > >> > >> Note that this gpio_keys KEY_POWER evdev event generation > >> on resume issue goes way back until the last time we had > >> this conversation and it still has not really been fixed. > >> > >> And I've not seen any bug-reports about the same problem > >> with any other drivers. > >> > >>> What about acpi button behavior when using S0ix? > >> > >> AFAIK it is the same as with S3, at least it is not > >> causing any issues. I've never seen the ACPI button code > >> cause re-suspend immediately on wakeup by what for all > >> intends and purposes is a spurious KEY_POWER event. > >> > >> Last time we discussed this I wasn't really happy with > >> the outcome of the discussion but I just went for it > >> because of Android's reliance on the event and we > >> lacked a better plan. > >> > >> Now that we've a fix for this in the form of KEY_WAKEUP > >> it is time to properly fix this instead of doing userspace > >> kludges. > >> > >>> What about > >>> holding power button for too long so that normal reporting "catches" the > >>> pressed state? > >> > >> The key-down event is send as KEY_WAKEUP instead, > >> so userspace sees KEY_WAKEUP pressed not KEY_POWER. > >> > >>> Kernel reports hardware events, interpreting them and applying certain > >>> policies is task for userspace. > >> > >> And atm it is actually doing a shitty job of reporting > >> hwevents because there is no way for userspace to be able > >> to differentiate between: > >> > >> 1. User pressed power-button to wakeup system > >> 2. User pressed power-button after resume to do > >> power-button-action (e.g. suspend system) > >> > >> Even though *the kernel* does *know* the difference. > >> > >> So the suggested change actually makes the kernel > >> do its job of reporting hw-events better by making > >> the reporting more accurate. > >> > >> ATM if I resume say a tablet with GNOME and then > >> change my mind and press the power button within > >> 3 seconds of resume to suspend it again the second > >> power-button press will outright be ignored > >> > >> The current userspace workaround is racy like this, > >> again the whole workaround in GNOME is just an ugly > >> kludge which I did back then because we couldn't > >> agree on a better way to deal with this in the kernel / > >> because just suppressing sending KEY_POWER would break > >> Android. > >> > >> The suggested use of KEY_WAKEUP is lightyears better > >> then doing ignore KEY_POWER events for xx seconds > >> after resume which is simply always going to be racy > >> and always was just an ugly hack / never was > >> a great solution. > > > > My take away from this discussion that in a sleep state the power button > > (or actually any wakeup source) should tell userspace "hey, we want to wake > > up". It doesn't tell "hey, we want to wake to power off". > > This sounds good to me as a user. Yes, if laptop is sleeping we need to wake > > it up to continue, the power off is just a next step of this flow. > > Exactly. > > These are really 2 different events and the problem > is that atm the kernel reports this as one and > the same event type. It really is as simple as this. > > Note that I'm not proposing on making this change > something which all gpio_keys drivers will get > automatically. > > My idea of adding a wakeup_code field to > struct gpio_keys_button allows individual gpio_keys > users to opt-in to the behavior of > sending KEY_SOMETHINGELSE on wakeup-by-gpio-button-press. > > Since soc_button_array is only used on x86/ACPI platforms > and since by far the most x86/ACPI platforms use > the ACPI button code for the power-button, which already > behaves this way I do not expect any userspace problems > from doing such a change in soc_button_array because > if that were a problem then we would already have bug > reports because of the ACPI button code's behavior. ACPI/x86 system does not necessarily mean something running generic Linux distribution, and it may have different set of devices and drivers. Or it may even use soc_button_array and still not want this behavior. > > > The expected hot topic here is the longer presses of power button, but I think > > if we have a timer and tell after say 3 second that the K_WUP was up and K_PW > > is down is not a solution, it will be always flaky. > > If users do a long power-button press on x86 they are > *always* trying to do a forced power-off and after 4s > (or longer in some special cases) the hw itself will > do such a forced poweroff. So I do not believe that > we need to worry about long presses since those > have a very specific meaning on x86/ACPI platforms. You only consider one environment: Gnome. There are other alternatives. For example on Chrome OS pressing power button for longish time (but shorter that forced power off) will result in orderly system shutdown. > > Also if there is a long press userspace will simply > see KEY_WAKEUP never getting released, which is > actually an accurate representation of things, > the user woke up the system through the power-button > and never released ir. Yeah, it will break everyone who is monitoring user activity. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 15:56 ` Hans de Goede 2025-06-27 16:12 ` Andy Shevchenko @ 2025-06-27 18:36 ` Dmitry Torokhov 2025-06-27 18:56 ` Mario Limonciello 1 sibling, 1 reply; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-27 18:36 UTC (permalink / raw) To: Hans de Goede Cc: Mario Limonciello, Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: > Hi Dmitry, > > On 27-Jun-25 4:44 PM, Dmitry Torokhov wrote: > > On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: > >> Hi, > >> > >> On 27-Jun-25 4:06 PM, Mario Limonciello wrote: > >>> On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: > >>>> On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: > >>>>> On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: > >>>>>> On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: > >>>>>>> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov > >>>>>>> <dmitry.torokhov@gmail.com> wrote: > >>>>>>>> > >>>>>>>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > >>>>>>>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > >>>>>>>>>> > >>>>>>>>>> Hi, > >>>>>>>>>> > >>>>>>>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: > >>>>>>>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > >>>>>>>>>>>> Hi, > >>>>>>>>>>>> > >>>>>>>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > >>>>>>>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > >>>>>>>> [...] > >>>>>>>>>>>>>> I want to note this driver works quite differently than how ACPI power > >>>>>>>>>>>>>> button does. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > >>>>>>>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > >>>>>>>>>>>>>> patch was modeling). > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > >>>>>>>>>>>>>> [1] > >>>>>>>>>>>>> > >>>>>>>>>>>>> If you check acpi_button_resume() you will see that the events are sent > >>>>>>>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and > >>>>>>>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > >>>>>>>>>>>>> multiple other platforms. > >>>>>>>>>>>> > >>>>>>>>>>>> Interesting, but the ACPI button code presumably only does this on resume > >>>>>>>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? > >>>>>>>>>>> > >>>>>>>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, > >>>>>>>>>>> it does not seem to be captured in the email discussions or in the patch > >>>>>>>>>>> description. > >>>>>>>>>> > >>>>>>>>>> I assume they did this to avoid the immediate re-suspend on wakeup by > >>>>>>>>>> power-button issue. GNOME has a workaround for this, but I assume that > >>>>>>>>>> some userspace desktop environments are still going to have a problem > >>>>>>>>>> with this. > >>>>>>>>> > >>>>>>>>> It was done for this reason IIRC, but it should have been documented > >>>>>>>>> more thoroughly. > >>>>>>>> > >>>>>>>> I assert that it should not have been done and instead dealt with in > >>>>>>>> userspace. There are numerous drivers in the kernel emitting > >>>>>>>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, > >>>>>>>> what keys to process and when. > >>>>>>> > >>>>>>> Please see my last message in this thread (just sent) and see the > >>>>>>> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key > >>>>>>> events"). > >>>>>>> > >>>>>>> This appears to be about cases when no event would be signaled to user > >>>>>>> space at all (power button wakeup from ACPI S3). > >>>>>> > >>>>>> Ahh, in S3 we do not know if we've been woken up with Sleep or Power > >>>>>> button, right? So we can not send the "right" event code and use > >>>>>> "neutral" KEY_WAKEUP for both. Is this right? > >>>>>> > >>>>>> Thanks. > >>>>>> > >>>>> > >>>>> I did some more experiments with this affected system that started this > >>>>> thread (which uses s2idle). > >>>>> > >>>>> I only applied patch 3 in this series to help the debounce behavior and > >>>>> figure out impacts from patch 4 with existing Linux userspace. > >>>>> > >>>>> If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 > >>>>> the GNOME workaround mitigates this problem and no visible impact. > >>>>> > >>>>> If I suspend by hand using the kernel interface and then press power button > >>>>> to wake: > >>>>> > >>>>> # echo mem | sudo tee /sys/power/state: > >>>>> > >>>>> * When GNOME is running: > >>>>> I get the shutdown popup and it eventually shuts down. > >>>>> > >>>>> * When GNOME isn't running (just on a VT): > >>>>> System shuts down. > >>>> > >>>> For the latter you may want to raise an issue with systemd, and for the > >>>> former I guess it is being too clever and does not activate the > >>>> workaround if suspend was not initiated by it? I think Gnome is being > >>>> too careful. > >>>> > >>>> Thanks. > >>>> > >>> > >>> Sure I could file bugs with both the projects. > >>> > >>> But before I do if all userspace needs to account for this with a series of workarounds at resume time, you still think that is that really the best way forward? > >>> > >>> Hans, you have a lot of experience in the GNOME community. Your thoughts? > >> > >> I guess it would be good to fix this in the kernel, sending > >> KEY_WAKEUP from gpio_key when the event is KEY_POWER and > >> we are going through the special wakeup path in gpio_keys. > >> > >> When this was discussed quite a while ago the ACPI button > >> driver simply did not send any event at all on wkaeup > >> by ACPI power-button. Know that it does send an event > >> it would be good to mimic this, at least when the gpio_key > >> devices where instantiated by soc_button_array. > >> > >> So maybe add a new field to struct gpio_keys_button > >> called wakeup_code and when that is not 0 use that > >> instead of the plain "code" member on wakeups ? > >> > >> That would keep the gpio_keys code generic while > >> allowing to mimic the ACPI button behavior. > >> > >> And then set wakeup_code to KEY_WAKEUP for > >> the power-button in soc_button_array. > >> > >> To me this sounds better then trying to fix all userspace > >> code which does something on KEY_POWER of which there > >> is quite a lot. > >> > >> The special GNOME power-button handling was always > >> a workaround because last time a kernel fix was > >> nacked. But now with the KEY_WAKEUP done by the ACPI > >> button code it looks like we do have a good way > >> to fix this in the kernel, so that would be better > >> IMHO. > >> > >> Dmitry, what do you think of adding a wakeup_code > >> field to struct gpio_keys_button and let the code > >> creating the gpio_keys_button decide if a different > >> code should be used on wakeup or not ? > > > > And what is the plan on dealing with all other drivers that emit > > KEY_POWER? > > There actually aren't that many that I'm aware of. dtor@dtor-ws:~/kernel/work $ git grep -l KEY_POWER -- drivers/{input,hid,platform}/ | wc -l 51 Additionally: dtor@dtor-ws:~/kernel/work $ git grep -l KEY_POWER -- arch/arm*/boot/dts | wc -l 254 > > Note that this gpio_keys KEY_POWER evdev event generation > on resume issue goes way back until the last time we had > this conversation and it still has not really been fixed. I am sorry to hear that. I am not involved in Gnome so I am not sure why it takes so long, I guess not tablets or detachables are a minority of deployments so it is not prioritized? Android seems to have a handle on this as does Chrome OS... > > And I've not seen any bug-reports about the same problem > with any other drivers. I guess you will next want to patch cros_ec_keyb in case someone uses generic distro with x86 Chromebooks, and then matrix keypad, and then all drivers that are used outside of x86. > > > What about acpi button behavior when using S0ix? > > AFAIK it is the same as with S3, at least it is not > causing any issues. I've never seen the ACPI button code > cause re-suspend immediately on wakeup by what for all > intends and purposes is a spurious KEY_POWER event. Rafael has made assertion that in S3 it is impossible to differentiate whether the button is power button or not. But looking at this I do not think it is correct assertion. "Notify Wake" is sent for a given button. Or maybe I misunderstood and he meant that the *state* if button is not available in "Notify Wake"? In fact, I think login in the ACPI button is pretty broken and needs to be undone/reverted: 1. The driver sends KEY_WAKEUP events on every resume. It does not matter if wakeup is done by pressing power button, wake or lan packet, or an act of God, it will send KEY_WAKEUP as part of the button *device* resume. 2. There is a patch from Mario (a8605b0ed187) suppressing sending KEY_POWER as part of "normal" wakeup handling, pretty much the same as what he and you are proposing to do in gpio-keys (and eventually in every driver keyboard or button driver in the kernel). This means we no longer can tell if wakeup is done by power button or sleep button (on systems with dual-button models, see ACPI 4.8.3.1). To me it seems we are piling workarounds on top of workarounds. We should report either KEY_POWER or KEY_SLEEP in the notify event for both "Notify Wake" and "Notify State", and let userspace make decision on how to handle this best. > > Last time we discussed this I wasn't really happy with > the outcome of the discussion but I just went for it > because of Android's reliance on the event and we > lacked a better plan. > > Now that we've a fix for this in the form of KEY_WAKEUP > it is time to properly fix this instead of doing userspace > kludges. I do not understand why you call KEY_WAKEUP being "proper". Especially with gpio-keys you do not know if wakeup is really due to this particular button being pressed, or the system woke up for some other reason and user also happened to have the button pressed. ACPI button is really an outlier here because firmware interface defines a dedicated event for waking up. > > > What about > > holding power button for too long so that normal reporting "catches" the > > pressed state? > > The key-down event is send as KEY_WAKEUP instead, > so userspace sees KEY_WAKEUP pressed not KEY_POWER. This assumes the driver does not report state between press and release, which is not guaranteed. Or we now require drivers to keep track whether release for KEY_WAKEUP has been done and that it can return to reporting KEY_POWER. > > > Kernel reports hardware events, interpreting them and applying certain > > policies is task for userspace. > > And atm it is actually doing a shitty job of reporting > hwevents because there is no way for userspace to be able > to differentiate between: > > 1. User pressed power-button to wakeup system > 2. User pressed power-button after resume to do > power-button-action (e.g. suspend system) > > Even though *the kernel* does *know* the difference. Does it really? Aside of ACPI button you have no idea if button press coincided with some other event waking up the system. You can guess, but that is it, a guess. > > So the suggested change actually makes the kernel > do its job of reporting hw-events better by making > the reporting more accurate. No, you are making assumptions, but instead of doing it in userspace where you can give user choice to adjust the behavior you are hard-coding it. > > ATM if I resume say a tablet with GNOME and then > change my mind and press the power button within > 3 seconds of resume to suspend it again the second > power-button press will outright be ignored Please fix Gnome. It is possible to handle rapid power button presses (because other OSed/environments do that). > > The current userspace workaround is racy like this, > again the whole workaround in GNOME is just an ugly > kludge which I did back then because we couldn't > agree on a better way to deal with this in the kernel / > because just suppressing sending KEY_POWER would break > Android. > > The suggested use of KEY_WAKEUP is lightyears better > then doing ignore KEY_POWER events for xx seconds > after resume which is simply always going to be racy > and always was just an ugly hack / never was > a great solution. My opinion is that KEY_WAKEUP is not much better and we are actually losing information if we try to implement that (again, because you do not know if button press was the real cause of wakeup or it simply coincided with something else). Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 18:36 ` Dmitry Torokhov @ 2025-06-27 18:56 ` Mario Limonciello 2025-06-27 19:18 ` Dmitry Torokhov 0 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-27 18:56 UTC (permalink / raw) To: Dmitry Torokhov, Hans de Goede Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: > On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: >> Hi Dmitry, >> >> On 27-Jun-25 4:44 PM, Dmitry Torokhov wrote: >>> On Fri, Jun 27, 2025 at 04:14:38PM +0200, Hans de Goede wrote: >>>> Hi, >>>> >>>> On 27-Jun-25 4:06 PM, Mario Limonciello wrote: >>>>> On 6/26/2025 11:56 PM, Dmitry Torokhov wrote: >>>>>> On Thu, Jun 26, 2025 at 05:21:35PM -0500, Mario Limonciello wrote: >>>>>>> On 6/26/2025 2:40 PM, Dmitry Torokhov wrote: >>>>>>>> On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: >>>>>>>>> On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov >>>>>>>>> <dmitry.torokhov@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>> On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: >>>>>>>>>>> On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> On 26-Jun-25 21:14, Dmitry Torokhov wrote: >>>>>>>>>>>>> On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: >>>>>>>>>>>>>> Hi, >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 26-Jun-25 20:48, Dmitry Torokhov wrote: >>>>>>>>>>>>>>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: >>>>>>>>>> [...] >>>>>>>>>>>>>>>> I want to note this driver works quite differently than how ACPI power >>>>>>>>>>>>>>>> button does. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> You can see in acpi_button_notify() that the "keypress" is only forwarded >>>>>>>>>>>>>>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my >>>>>>>>>>>>>>>> patch was modeling). >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 >>>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> If you check acpi_button_resume() you will see that the events are sent >>>>>>>>>>>>>>> from there. Except that for some reason they chose to use KEY_WAKEUP and >>>>>>>>>>>>>>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on >>>>>>>>>>>>>>> multiple other platforms. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Interesting, but the ACPI button code presumably only does this on resume >>>>>>>>>>>>>> for a normal press while the system is awake it does use KEY_POWER, right ? >>>>>>>>>>>>> >>>>>>>>>>>>> Yes. It is unclear to me why they chose to mangle the event on wakeup, >>>>>>>>>>>>> it does not seem to be captured in the email discussions or in the patch >>>>>>>>>>>>> description. >>>>>>>>>>>> >>>>>>>>>>>> I assume they did this to avoid the immediate re-suspend on wakeup by >>>>>>>>>>>> power-button issue. GNOME has a workaround for this, but I assume that >>>>>>>>>>>> some userspace desktop environments are still going to have a problem >>>>>>>>>>>> with this. >>>>>>>>>>> >>>>>>>>>>> It was done for this reason IIRC, but it should have been documented >>>>>>>>>>> more thoroughly. >>>>>>>>>> >>>>>>>>>> I assert that it should not have been done and instead dealt with in >>>>>>>>>> userspace. There are numerous drivers in the kernel emitting >>>>>>>>>> KEY_POWER. Let userspace decide how to handle this, what keys to ignore, >>>>>>>>>> what keys to process and when. >>>>>>>>> >>>>>>>>> Please see my last message in this thread (just sent) and see the >>>>>>>>> changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key >>>>>>>>> events"). >>>>>>>>> >>>>>>>>> This appears to be about cases when no event would be signaled to user >>>>>>>>> space at all (power button wakeup from ACPI S3). >>>>>>>> >>>>>>>> Ahh, in S3 we do not know if we've been woken up with Sleep or Power >>>>>>>> button, right? So we can not send the "right" event code and use >>>>>>>> "neutral" KEY_WAKEUP for both. Is this right? >>>>>>>> >>>>>>>> Thanks. >>>>>>>> >>>>>>> >>>>>>> I did some more experiments with this affected system that started this >>>>>>> thread (which uses s2idle). >>>>>>> >>>>>>> I only applied patch 3 in this series to help the debounce behavior and >>>>>>> figure out impacts from patch 4 with existing Linux userspace. >>>>>>> >>>>>>> If suspended using systemd in GNOME (click the GUI button) on Ubuntu 24.04 >>>>>>> the GNOME workaround mitigates this problem and no visible impact. >>>>>>> >>>>>>> If I suspend by hand using the kernel interface and then press power button >>>>>>> to wake: >>>>>>> >>>>>>> # echo mem | sudo tee /sys/power/state: >>>>>>> >>>>>>> * When GNOME is running: >>>>>>> I get the shutdown popup and it eventually shuts down. >>>>>>> >>>>>>> * When GNOME isn't running (just on a VT): >>>>>>> System shuts down. >>>>>> >>>>>> For the latter you may want to raise an issue with systemd, and for the >>>>>> former I guess it is being too clever and does not activate the >>>>>> workaround if suspend was not initiated by it? I think Gnome is being >>>>>> too careful. >>>>>> >>>>>> Thanks. >>>>>> >>>>> >>>>> Sure I could file bugs with both the projects. >>>>> >>>>> But before I do if all userspace needs to account for this with a series of workarounds at resume time, you still think that is that really the best way forward? >>>>> >>>>> Hans, you have a lot of experience in the GNOME community. Your thoughts? >>>> >>>> I guess it would be good to fix this in the kernel, sending >>>> KEY_WAKEUP from gpio_key when the event is KEY_POWER and >>>> we are going through the special wakeup path in gpio_keys. >>>> >>>> When this was discussed quite a while ago the ACPI button >>>> driver simply did not send any event at all on wkaeup >>>> by ACPI power-button. Know that it does send an event >>>> it would be good to mimic this, at least when the gpio_key >>>> devices where instantiated by soc_button_array. >>>> >>>> So maybe add a new field to struct gpio_keys_button >>>> called wakeup_code and when that is not 0 use that >>>> instead of the plain "code" member on wakeups ? >>>> >>>> That would keep the gpio_keys code generic while >>>> allowing to mimic the ACPI button behavior. >>>> >>>> And then set wakeup_code to KEY_WAKEUP for >>>> the power-button in soc_button_array. >>>> >>>> To me this sounds better then trying to fix all userspace >>>> code which does something on KEY_POWER of which there >>>> is quite a lot. >>>> >>>> The special GNOME power-button handling was always >>>> a workaround because last time a kernel fix was >>>> nacked. But now with the KEY_WAKEUP done by the ACPI >>>> button code it looks like we do have a good way >>>> to fix this in the kernel, so that would be better >>>> IMHO. >>>> >>>> Dmitry, what do you think of adding a wakeup_code >>>> field to struct gpio_keys_button and let the code >>>> creating the gpio_keys_button decide if a different >>>> code should be used on wakeup or not ? >>> >>> And what is the plan on dealing with all other drivers that emit >>> KEY_POWER? >> >> There actually aren't that many that I'm aware of. > > dtor@dtor-ws:~/kernel/work $ git grep -l KEY_POWER -- drivers/{input,hid,platform}/ | wc -l > 51 > > Additionally: > > dtor@dtor-ws:~/kernel/work $ git grep -l KEY_POWER -- arch/arm*/boot/dts | wc -l > 254 > >> >> Note that this gpio_keys KEY_POWER evdev event generation >> on resume issue goes way back until the last time we had >> this conversation and it still has not really been fixed. > > I am sorry to hear that. I am not involved in Gnome so I am not sure why > it takes so long, I guess not tablets or detachables are a minority of > deployments so it is not prioritized? Android seems to have a handle on > this as does Chrome OS... > >> >> And I've not seen any bug-reports about the same problem >> with any other drivers. > > I guess you will next want to patch cros_ec_keyb in case someone uses > generic distro with x86 Chromebooks, and then matrix keypad, and then > all drivers that are used outside of x86. > >> >>> What about acpi button behavior when using S0ix? >> >> AFAIK it is the same as with S3, at least it is not >> causing any issues. I've never seen the ACPI button code >> cause re-suspend immediately on wakeup by what for all >> intends and purposes is a spurious KEY_POWER event. > > Rafael has made assertion that in S3 it is impossible to differentiate > whether the button is power button or not. But looking at this I do not > think it is correct assertion. "Notify Wake" is sent for a given > button. Or maybe I misunderstood and he meant that the *state* if button > is not available in "Notify Wake"? > > In fact, I think login in the ACPI button is pretty broken and needs to > be undone/reverted: > > 1. The driver sends KEY_WAKEUP events on every resume. It does not > matter if wakeup is done by pressing power button, wake or lan packet, > or an act of God, it will send KEY_WAKEUP as part of the button *device* > resume. This seems like a real bug. IMO you're right it should only be sending it when the key was received. > > 2. There is a patch from Mario (a8605b0ed187) suppressing sending > KEY_POWER as part of "normal" wakeup handling, pretty much the same as > what he and you are proposing to do in gpio-keys (and eventually in > every driver keyboard or button driver in the kernel). This means we no > longer can tell if wakeup is done by power button or sleep button (on > systems with dual-button models, see ACPI 4.8.3.1). Actually a8605b0ed187 was about a runtime regression not a suspend regression. I didn't change anything with sending KEY_POWER during wakeup handling. > > To me it seems we are piling workarounds on top of workarounds. We > should report either KEY_POWER or KEY_SLEEP in the notify event for both > "Notify Wake" and "Notify State", and let userspace make decision on how > to handle this best. > >> >> Last time we discussed this I wasn't really happy with >> the outcome of the discussion but I just went for it >> because of Android's reliance on the event and we >> lacked a better plan. >> >> Now that we've a fix for this in the form of KEY_WAKEUP >> it is time to properly fix this instead of doing userspace >> kludges. > > I do not understand why you call KEY_WAKEUP being "proper". Especially > with gpio-keys you do not know if wakeup is really due to this > particular button being pressed, or the system woke up for some other > reason and user also happened to have the button pressed. ACPI button is > really an outlier here because firmware interface defines a dedicated > event for waking up. > >> >>> What about >>> holding power button for too long so that normal reporting "catches" the >>> pressed state? >> >> The key-down event is send as KEY_WAKEUP instead, >> so userspace sees KEY_WAKEUP pressed not KEY_POWER. > > This assumes the driver does not report state between press and release, > which is not guaranteed. Or we now require drivers to keep track whether > release for KEY_WAKEUP has been done and that it can return to reporting > KEY_POWER. > >> >>> Kernel reports hardware events, interpreting them and applying certain >>> policies is task for userspace. >> >> And atm it is actually doing a shitty job of reporting >> hwevents because there is no way for userspace to be able >> to differentiate between: >> >> 1. User pressed power-button to wakeup system >> 2. User pressed power-button after resume to do >> power-button-action (e.g. suspend system) >> >> Even though *the kernel* does *know* the difference. > > Does it really? Aside of ACPI button you have no idea if button press > coincided with some other event waking up the system. You can guess, but > that is it, a guess. > >> >> So the suggested change actually makes the kernel >> do its job of reporting hw-events better by making >> the reporting more accurate. > > No, you are making assumptions, but instead of doing it in userspace > where you can give user choice to adjust the behavior you are > hard-coding it. > >> >> ATM if I resume say a tablet with GNOME and then >> change my mind and press the power button within >> 3 seconds of resume to suspend it again the second >> power-button press will outright be ignored > > Please fix Gnome. It is possible to handle rapid power button presses > (because other OSed/environments do that). > >> >> The current userspace workaround is racy like this, >> again the whole workaround in GNOME is just an ugly >> kludge which I did back then because we couldn't >> agree on a better way to deal with this in the kernel / >> because just suppressing sending KEY_POWER would break >> Android. >> >> The suggested use of KEY_WAKEUP is lightyears better >> then doing ignore KEY_POWER events for xx seconds >> after resume which is simply always going to be racy >> and always was just an ugly hack / never was >> a great solution. > > My opinion is that KEY_WAKEUP is not much better and we are actually > losing information if we try to implement that (again, because you do > not know if button press was the real cause of wakeup or it simply > coincided with something else). > > Thanks. > FTR I did test Hans suggestion and it does work effectively (code below). diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index f9db86da0818b..3bc8c95e9943b 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) * already released by the time we got interrupt * handler to run. */ - input_report_key(bdata->input, button->code, 1); + input_report_key(bdata->input, *bdata->code, 1); + input_sync(bdata->input); } } @@ -644,6 +645,14 @@ static int gpio_keys_setup_key(struct platform_device *pdev, bdata->code = &ddata->keymap[idx]; *bdata->code = button->code; input_set_capability(input, button->type ?: EV_KEY, *bdata->code); + if (button->wakeup_code) { + /* + * If wakeup_code is specified, we use it to report + * the button press during resume from suspend. + */ + input_set_capability(input, button->type ?: EV_KEY, + button->wakeup_code); + } /* * Install custom action to cancel release timer and @@ -1009,6 +1018,8 @@ gpio_keys_enable_wakeup(struct gpio_keys_drvdata *ddata) if (error) goto err_out; } + *bdata->code = bdata->button->wakeup_code ? + bdata->button->wakeup_code : bdata->button->code; bdata->suspended = true; } @@ -1034,6 +1045,7 @@ gpio_keys_disable_wakeup(struct gpio_keys_drvdata *ddata) for (i = 0; i < ddata->pdata->nbuttons; i++) { bdata = &ddata->data[i]; bdata->suspended = false; + *bdata->code = bdata->button->code; if (irqd_is_wakeup_set(irq_get_irq_data(bdata->irq))) gpio_keys_button_disable_wakeup(bdata); } diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index b8cad415c62ca..7afebc23b6f85 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c @@ -216,6 +216,8 @@ soc_button_device_create(struct platform_device *pdev, gpio_keys[n_buttons].type = info->event_type; gpio_keys[n_buttons].code = info->event_code; + if (info->event_code == KEY_POWER) + gpio_keys[n_buttons].wakeup_code = KEY_WAKEUP; gpio_keys[n_buttons].active_low = info->active_low; gpio_keys[n_buttons].desc = info->name; gpio_keys[n_buttons].wakeup = info->wakeup; diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index 80fa930b04c67..9759f2d4015f9 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h @@ -22,6 +22,7 @@ struct device; * @value: axis value for %EV_ABS * @irq: Irq number in case of interrupt keys * @wakeirq: Optional dedicated wake-up interrupt + * @wakeup_code: code to report when the button is during resume from suspend */ struct gpio_keys_button { unsigned int code; @@ -36,6 +37,7 @@ struct gpio_keys_button { int value; unsigned int irq; unsigned int wakeirq; + unsigned int wakeup_code; }; /** ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 18:56 ` Mario Limonciello @ 2025-06-27 19:18 ` Dmitry Torokhov 2025-06-27 19:38 ` Hans de Goede 2025-06-27 19:45 ` Mario Limonciello 0 siblings, 2 replies; 53+ messages in thread From: Dmitry Torokhov @ 2025-06-27 19:18 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Fri, Jun 27, 2025 at 01:56:53PM -0500, Mario Limonciello wrote: > On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: > > On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: [ ... trim ... ] > > > > 2. There is a patch from Mario (a8605b0ed187) suppressing sending > > KEY_POWER as part of "normal" wakeup handling, pretty much the same as > > what he and you are proposing to do in gpio-keys (and eventually in > > every driver keyboard or button driver in the kernel). This means we no > > longer can tell if wakeup is done by power button or sleep button (on > > systems with dual-button models, see ACPI 4.8.3.1). > > Actually a8605b0ed187 was about a runtime regression not a suspend > regression. I didn't change anything with sending KEY_POWER during wakeup > handling. Ah, right, ignorng events for "suspended" buttons was done in e71eeb2a6bcc ("ACPI / button: Do not propagate wakeup-from-suspend events"). Again trying to add heuristic to the kernel instead of enlightening userspace. I am curious why the system is sending "Notify Wake" events when not sleeping though? [ .. skip .. ] > > FTR I did test Hans suggestion and it does work effectively (code below). > > diff --git a/drivers/input/keyboard/gpio_keys.c > b/drivers/input/keyboard/gpio_keys.c > index f9db86da0818b..3bc8c95e9943b 100644 > --- a/drivers/input/keyboard/gpio_keys.c > +++ b/drivers/input/keyboard/gpio_keys.c > @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void > *dev_id) > * already released by the time we got interrupt > * handler to run. > */ > - input_report_key(bdata->input, button->code, 1); > + input_report_key(bdata->input, *bdata->code, 1); > + input_sync(bdata->input); I start wondering if we should keep the fake press given that we do not know for sure if wakeup truly happened because of this button press... Can we track back to the wakeup source and determine this? It will not help your problem, but I still believe userspace is where policy should live. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 19:18 ` Dmitry Torokhov @ 2025-06-27 19:38 ` Hans de Goede 2025-06-27 19:44 ` Mario Limonciello 2025-06-27 19:45 ` Mario Limonciello 1 sibling, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-27 19:38 UTC (permalink / raw) To: Dmitry Torokhov, Mario Limonciello Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 27-Jun-25 9:18 PM, Dmitry Torokhov wrote: > On Fri, Jun 27, 2025 at 01:56:53PM -0500, Mario Limonciello wrote: >> On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: >>> On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: > > [ ... trim ... ] > >>> >>> 2. There is a patch from Mario (a8605b0ed187) suppressing sending >>> KEY_POWER as part of "normal" wakeup handling, pretty much the same as >>> what he and you are proposing to do in gpio-keys (and eventually in >>> every driver keyboard or button driver in the kernel). This means we no >>> longer can tell if wakeup is done by power button or sleep button (on >>> systems with dual-button models, see ACPI 4.8.3.1). >> >> Actually a8605b0ed187 was about a runtime regression not a suspend >> regression. I didn't change anything with sending KEY_POWER during wakeup >> handling. > > Ah, right, ignorng events for "suspended" buttons was done in > e71eeb2a6bcc ("ACPI / button: Do not propagate wakeup-from-suspend > events"). Again trying to add heuristic to the kernel instead of > enlightening userspace. > > I am curious why the system is sending "Notify Wake" events when not > sleeping though? > > [ .. skip .. ] > >> >> FTR I did test Hans suggestion and it does work effectively (code below). >> >> diff --git a/drivers/input/keyboard/gpio_keys.c >> b/drivers/input/keyboard/gpio_keys.c >> index f9db86da0818b..3bc8c95e9943b 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >> *dev_id) >> * already released by the time we got interrupt >> * handler to run. >> */ >> - input_report_key(bdata->input, button->code, 1); >> + input_report_key(bdata->input, *bdata->code, 1); >> + input_sync(bdata->input); > > I start wondering if we should keep the fake press given that we do not > know for sure if wakeup truly happened because of this button press... AFAIK we cannot drop the fake press because then Android userspace will immediately go back to sleep again assuming the wakeup was e.g. just some data coming in from the modem which did not result in a notification to show, so no need to turn on the display, but instead immediately go back to sleep. IIRC last time we had this discussion (man years ago) the reason to send KEY_POWER was to let Android know that it should actualy turn on the display and show the unlock screen because the user wants that to happen. I believe this is also what the KEY_WAKEUP thing in the ACPI button code is for. > Can we track back to the wakeup source and determine this? It will not > help your problem, but I still believe userspace is where policy should > live. There is /sys/power/pm_wakeup_irq we could correlate that to the IRQ number of the ISR and then AFAICT we will definitively know if the power-button was the wakeup source ? Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 19:38 ` Hans de Goede @ 2025-06-27 19:44 ` Mario Limonciello 2025-06-27 20:25 ` Hans de Goede 0 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-27 19:44 UTC (permalink / raw) To: Hans de Goede, Dmitry Torokhov Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/27/2025 2:38 PM, Hans de Goede wrote: > Hi, > > On 27-Jun-25 9:18 PM, Dmitry Torokhov wrote: >> On Fri, Jun 27, 2025 at 01:56:53PM -0500, Mario Limonciello wrote: >>> On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: >>>> On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: >> >> [ ... trim ... ] >> >>>> >>>> 2. There is a patch from Mario (a8605b0ed187) suppressing sending >>>> KEY_POWER as part of "normal" wakeup handling, pretty much the same as >>>> what he and you are proposing to do in gpio-keys (and eventually in >>>> every driver keyboard or button driver in the kernel). This means we no >>>> longer can tell if wakeup is done by power button or sleep button (on >>>> systems with dual-button models, see ACPI 4.8.3.1). >>> >>> Actually a8605b0ed187 was about a runtime regression not a suspend >>> regression. I didn't change anything with sending KEY_POWER during wakeup >>> handling. >> >> Ah, right, ignorng events for "suspended" buttons was done in >> e71eeb2a6bcc ("ACPI / button: Do not propagate wakeup-from-suspend >> events"). Again trying to add heuristic to the kernel instead of >> enlightening userspace. >> >> I am curious why the system is sending "Notify Wake" events when not >> sleeping though? >> >> [ .. skip .. ] >> >>> >>> FTR I did test Hans suggestion and it does work effectively (code below). >>> >>> diff --git a/drivers/input/keyboard/gpio_keys.c >>> b/drivers/input/keyboard/gpio_keys.c >>> index f9db86da0818b..3bc8c95e9943b 100644 >>> --- a/drivers/input/keyboard/gpio_keys.c >>> +++ b/drivers/input/keyboard/gpio_keys.c >>> @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >>> *dev_id) >>> * already released by the time we got interrupt >>> * handler to run. >>> */ >>> - input_report_key(bdata->input, button->code, 1); >>> + input_report_key(bdata->input, *bdata->code, 1); >>> + input_sync(bdata->input); >> >> I start wondering if we should keep the fake press given that we do not >> know for sure if wakeup truly happened because of this button press... > > AFAIK we cannot drop the fake press because then Android userspace > will immediately go back to sleep again assuming the wakeup was > e.g. just some data coming in from the modem which did not result > in a notification to show, so no need to turn on the display, > but instead immediately go back to sleep. > > IIRC last time we had this discussion (man years ago) the reason > to send KEY_POWER was to let Android know that it should actualy > turn on the display and show the unlock screen because the user > wants that to happen. > > I believe this is also what the KEY_WAKEUP thing in the ACPI button > code is for. > >> Can we track back to the wakeup source and determine this? It will not >> help your problem, but I still believe userspace is where policy should >> live. > > There is /sys/power/pm_wakeup_irq we could correlate that to the IRQ > number of the ISR and then AFAICT we will definitively know if > the power-button was the wakeup source ? > So at least in my case when woken up by this power button press the IRQ isn't the one for the GPIO itself, but rather for the GPIO controller master interrupt. # cat /sys/power/pm_wakeup_irq 7 # grep . /sys/kernel/irq/7/* /sys/kernel/irq/7/actions:pinctrl_amd /sys/kernel/irq/7/chip_name:IR-IO-APIC /sys/kernel/irq/7/hwirq:7 /sys/kernel/irq/7/name:fasteoi /sys/kernel/irq/7/per_cpu_count:0,0,0,0,0,5,0,0 /sys/kernel/irq/7/type:level /sys/kernel/irq/7/wakeup:enabled # grep . /sys/kernel/irq/102/* /sys/kernel/irq/102/actions:power /sys/kernel/irq/102/chip_name:amd_gpio /sys/kernel/irq/102/hwirq:0 /sys/kernel/irq/102/per_cpu_count:0,1,0,2,1,0,0,1 /sys/kernel/irq/102/type:edge /sys/kernel/irq/102/wakeup:disabled ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 19:44 ` Mario Limonciello @ 2025-06-27 20:25 ` Hans de Goede 2025-06-27 20:29 ` Mario Limonciello 0 siblings, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-27 20:25 UTC (permalink / raw) To: Mario Limonciello, Dmitry Torokhov Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello Hi, On 27-Jun-25 9:44 PM, Mario Limonciello wrote: > On 6/27/2025 2:38 PM, Hans de Goede wrote: >> Hi, >> >> On 27-Jun-25 9:18 PM, Dmitry Torokhov wrote: >>> On Fri, Jun 27, 2025 at 01:56:53PM -0500, Mario Limonciello wrote: >>>> On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: >>>>> On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: >>> >>> [ ... trim ... ] >>> >>>>> >>>>> 2. There is a patch from Mario (a8605b0ed187) suppressing sending >>>>> KEY_POWER as part of "normal" wakeup handling, pretty much the same as >>>>> what he and you are proposing to do in gpio-keys (and eventually in >>>>> every driver keyboard or button driver in the kernel). This means we no >>>>> longer can tell if wakeup is done by power button or sleep button (on >>>>> systems with dual-button models, see ACPI 4.8.3.1). >>>> >>>> Actually a8605b0ed187 was about a runtime regression not a suspend >>>> regression. I didn't change anything with sending KEY_POWER during wakeup >>>> handling. >>> >>> Ah, right, ignorng events for "suspended" buttons was done in >>> e71eeb2a6bcc ("ACPI / button: Do not propagate wakeup-from-suspend >>> events"). Again trying to add heuristic to the kernel instead of >>> enlightening userspace. >>> >>> I am curious why the system is sending "Notify Wake" events when not >>> sleeping though? >>> >>> [ .. skip .. ] >>> >>>> >>>> FTR I did test Hans suggestion and it does work effectively (code below). >>>> >>>> diff --git a/drivers/input/keyboard/gpio_keys.c >>>> b/drivers/input/keyboard/gpio_keys.c >>>> index f9db86da0818b..3bc8c95e9943b 100644 >>>> --- a/drivers/input/keyboard/gpio_keys.c >>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>> @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >>>> *dev_id) >>>> * already released by the time we got interrupt >>>> * handler to run. >>>> */ >>>> - input_report_key(bdata->input, button->code, 1); >>>> + input_report_key(bdata->input, *bdata->code, 1); >>>> + input_sync(bdata->input); >>> >>> I start wondering if we should keep the fake press given that we do not >>> know for sure if wakeup truly happened because of this button press... >> >> AFAIK we cannot drop the fake press because then Android userspace >> will immediately go back to sleep again assuming the wakeup was >> e.g. just some data coming in from the modem which did not result >> in a notification to show, so no need to turn on the display, >> but instead immediately go back to sleep. >> >> IIRC last time we had this discussion (man years ago) the reason >> to send KEY_POWER was to let Android know that it should actualy >> turn on the display and show the unlock screen because the user >> wants that to happen. >> >> I believe this is also what the KEY_WAKEUP thing in the ACPI button >> code is for. >> >>> Can we track back to the wakeup source and determine this? It will not >>> help your problem, but I still believe userspace is where policy should >>> live. >> >> There is /sys/power/pm_wakeup_irq we could correlate that to the IRQ >> number of the ISR and then AFAICT we will definitively know if >> the power-button was the wakeup source ? >> > > So at least in my case when woken up by this power button press the IRQ isn't the one for the GPIO itself, but rather for the GPIO controller master interrupt. > > # cat /sys/power/pm_wakeup_irq > 7 > # grep . /sys/kernel/irq/7/* > /sys/kernel/irq/7/actions:pinctrl_amd > /sys/kernel/irq/7/chip_name:IR-IO-APIC > /sys/kernel/irq/7/hwirq:7 > /sys/kernel/irq/7/name:fasteoi > /sys/kernel/irq/7/per_cpu_count:0,0,0,0,0,5,0,0 > /sys/kernel/irq/7/type:level > /sys/kernel/irq/7/wakeup:enabled > > # grep . /sys/kernel/irq/102/* > /sys/kernel/irq/102/actions:power > /sys/kernel/irq/102/chip_name:amd_gpio > /sys/kernel/irq/102/hwirq:0 > /sys/kernel/irq/102/per_cpu_count:0,1,0,2,1,0,0,1 > /sys/kernel/irq/102/type:edge > /sys/kernel/irq/102/wakeup:disabled Ah, right. But thinking more about this I do not think believe that wakeup racing is really a big issue here. Wakeup racing only hits if the button ISR runs before gpio_keys_resume() has run and cleared the bdata->suspended flag. IOW the button was pressed before the system has completely resumed in that case the users intend to me very clearly was to wakeup the system. So I still believe that sending key-wakeup for the simulated keypress is the right thing to do in wakeup race cases even if the system was actually woken up by e.g. network traffic. As for Mario's patch from earlier in the thread that needs some more work because it will release the wrong code if the release ISR runs after gpio_keys_resume(). But working further on that only is useful if we can get agreement from Dmitry on that approach. Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 20:25 ` Hans de Goede @ 2025-06-27 20:29 ` Mario Limonciello 0 siblings, 0 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-27 20:29 UTC (permalink / raw) To: Hans de Goede, Dmitry Torokhov Cc: Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/27/2025 3:25 PM, Hans de Goede wrote: > Hi, > > On 27-Jun-25 9:44 PM, Mario Limonciello wrote: >> On 6/27/2025 2:38 PM, Hans de Goede wrote: >>> Hi, >>> >>> On 27-Jun-25 9:18 PM, Dmitry Torokhov wrote: >>>> On Fri, Jun 27, 2025 at 01:56:53PM -0500, Mario Limonciello wrote: >>>>> On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: >>>>>> On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: >>>> >>>> [ ... trim ... ] >>>> >>>>>> >>>>>> 2. There is a patch from Mario (a8605b0ed187) suppressing sending >>>>>> KEY_POWER as part of "normal" wakeup handling, pretty much the same as >>>>>> what he and you are proposing to do in gpio-keys (and eventually in >>>>>> every driver keyboard or button driver in the kernel). This means we no >>>>>> longer can tell if wakeup is done by power button or sleep button (on >>>>>> systems with dual-button models, see ACPI 4.8.3.1). >>>>> >>>>> Actually a8605b0ed187 was about a runtime regression not a suspend >>>>> regression. I didn't change anything with sending KEY_POWER during wakeup >>>>> handling. >>>> >>>> Ah, right, ignorng events for "suspended" buttons was done in >>>> e71eeb2a6bcc ("ACPI / button: Do not propagate wakeup-from-suspend >>>> events"). Again trying to add heuristic to the kernel instead of >>>> enlightening userspace. >>>> >>>> I am curious why the system is sending "Notify Wake" events when not >>>> sleeping though? >>>> >>>> [ .. skip .. ] >>>> >>>>> >>>>> FTR I did test Hans suggestion and it does work effectively (code below). >>>>> >>>>> diff --git a/drivers/input/keyboard/gpio_keys.c >>>>> b/drivers/input/keyboard/gpio_keys.c >>>>> index f9db86da0818b..3bc8c95e9943b 100644 >>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>> @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >>>>> *dev_id) >>>>> * already released by the time we got interrupt >>>>> * handler to run. >>>>> */ >>>>> - input_report_key(bdata->input, button->code, 1); >>>>> + input_report_key(bdata->input, *bdata->code, 1); >>>>> + input_sync(bdata->input); >>>> >>>> I start wondering if we should keep the fake press given that we do not >>>> know for sure if wakeup truly happened because of this button press... >>> >>> AFAIK we cannot drop the fake press because then Android userspace >>> will immediately go back to sleep again assuming the wakeup was >>> e.g. just some data coming in from the modem which did not result >>> in a notification to show, so no need to turn on the display, >>> but instead immediately go back to sleep. >>> >>> IIRC last time we had this discussion (man years ago) the reason >>> to send KEY_POWER was to let Android know that it should actualy >>> turn on the display and show the unlock screen because the user >>> wants that to happen. >>> >>> I believe this is also what the KEY_WAKEUP thing in the ACPI button >>> code is for. >>> >>>> Can we track back to the wakeup source and determine this? It will not >>>> help your problem, but I still believe userspace is where policy should >>>> live. >>> >>> There is /sys/power/pm_wakeup_irq we could correlate that to the IRQ >>> number of the ISR and then AFAICT we will definitively know if >>> the power-button was the wakeup source ? >>> >> >> So at least in my case when woken up by this power button press the IRQ isn't the one for the GPIO itself, but rather for the GPIO controller master interrupt. >> >> # cat /sys/power/pm_wakeup_irq >> 7 >> # grep . /sys/kernel/irq/7/* >> /sys/kernel/irq/7/actions:pinctrl_amd >> /sys/kernel/irq/7/chip_name:IR-IO-APIC >> /sys/kernel/irq/7/hwirq:7 >> /sys/kernel/irq/7/name:fasteoi >> /sys/kernel/irq/7/per_cpu_count:0,0,0,0,0,5,0,0 >> /sys/kernel/irq/7/type:level >> /sys/kernel/irq/7/wakeup:enabled >> >> # grep . /sys/kernel/irq/102/* >> /sys/kernel/irq/102/actions:power >> /sys/kernel/irq/102/chip_name:amd_gpio >> /sys/kernel/irq/102/hwirq:0 >> /sys/kernel/irq/102/per_cpu_count:0,1,0,2,1,0,0,1 >> /sys/kernel/irq/102/type:edge >> /sys/kernel/irq/102/wakeup:disabled > > Ah, right. > > But thinking more about this I do not think believe > that wakeup racing is really a big issue here. > > Wakeup racing only hits if the button ISR runs before > gpio_keys_resume() has run and cleared the bdata->suspended > flag. IOW the button was pressed before the system has > completely resumed in that case the users intend to me > very clearly was to wakeup the system. > > So I still believe that sending key-wakeup for the simulated > keypress is the right thing to do in wakeup race cases even > if the system was actually woken up by e.g. network traffic. > > As for Mario's patch from earlier in the thread that needs > some more work because it will release the wrong code if > the release ISR runs after gpio_keys_resume(). > > But working further on that only is useful if we can get > agreement from Dmitry on that approach. > Right; good catch. I had thought this was a risk but didn't want to over-invest in solving it until we had alignment. I mostly wanted to share it to demonstrate the idea works. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-27 19:18 ` Dmitry Torokhov 2025-06-27 19:38 ` Hans de Goede @ 2025-06-27 19:45 ` Mario Limonciello 1 sibling, 0 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-27 19:45 UTC (permalink / raw) To: Dmitry Torokhov Cc: Hans de Goede, Rafael J. Wysocki, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/27/2025 2:18 PM, Dmitry Torokhov wrote: > On Fri, Jun 27, 2025 at 01:56:53PM -0500, Mario Limonciello wrote: >> On 6/27/2025 1:36 PM, Dmitry Torokhov wrote: >>> On Fri, Jun 27, 2025 at 05:56:05PM +0200, Hans de Goede wrote: > > [ ... trim ... ] > >>> >>> 2. There is a patch from Mario (a8605b0ed187) suppressing sending >>> KEY_POWER as part of "normal" wakeup handling, pretty much the same as >>> what he and you are proposing to do in gpio-keys (and eventually in >>> every driver keyboard or button driver in the kernel). This means we no >>> longer can tell if wakeup is done by power button or sleep button (on >>> systems with dual-button models, see ACPI 4.8.3.1). >> >> Actually a8605b0ed187 was about a runtime regression not a suspend >> regression. I didn't change anything with sending KEY_POWER during wakeup >> handling. > > Ah, right, ignorng events for "suspended" buttons was done in > e71eeb2a6bcc ("ACPI / button: Do not propagate wakeup-from-suspend > events"). Again trying to add heuristic to the kernel instead of > enlightening userspace. > > I am curious why the system is sending "Notify Wake" events when not > sleeping though? I wondered the same thing. My guess is this is a BIOS bug. > > [ .. skip .. ] > >> >> FTR I did test Hans suggestion and it does work effectively (code below). >> >> diff --git a/drivers/input/keyboard/gpio_keys.c >> b/drivers/input/keyboard/gpio_keys.c >> index f9db86da0818b..3bc8c95e9943b 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -425,7 +425,8 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void >> *dev_id) >> * already released by the time we got interrupt >> * handler to run. >> */ >> - input_report_key(bdata->input, button->code, 1); >> + input_report_key(bdata->input, *bdata->code, 1); >> + input_sync(bdata->input); > > I start wondering if we should keep the fake press given that we do not > know for sure if wakeup truly happened because of this button press... > > Can we track back to the wakeup source and determine this? It will not > help your problem, but I still believe userspace is where policy should > live. > > Thanks. > ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:40 ` Dmitry Torokhov 2025-06-26 22:21 ` Mario Limonciello @ 2025-06-27 10:36 ` Rafael J. Wysocki 1 sibling, 0 replies; 53+ messages in thread From: Rafael J. Wysocki @ 2025-06-27 10:36 UTC (permalink / raw) To: Dmitry Torokhov Cc: Rafael J. Wysocki, Hans de Goede, Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Thu, Jun 26, 2025 at 9:40 PM Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > > On Thu, Jun 26, 2025 at 09:31:12PM +0200, Rafael J. Wysocki wrote: > > On Thu, Jun 26, 2025 at 9:28 PM Dmitry Torokhov > > <dmitry.torokhov@gmail.com> wrote: > > > > > > On Thu, Jun 26, 2025 at 09:18:56PM +0200, Rafael J. Wysocki wrote: > > > > On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > > > > > > > > > Hi, > > > > > > > > > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > > > > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > > > > > >> Hi, > > > > > >> > > > > > >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > > > > >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > > > [...] > > > > > >>>> I want to note this driver works quite differently than how ACPI power > > > > > >>>> button does. > > > > > >>>> > > > > > >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > > > > > >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > > > > > >>>> patch was modeling). > > > > > >>>> > > > > > >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > > > > >>>> [1] > > > > > >>> > > > > > >>> If you check acpi_button_resume() you will see that the events are sent > > > > > >>> from there. Except that for some reason they chose to use KEY_WAKEUP and > > > > > >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > > > > >>> multiple other platforms. > > > > > >> > > > > > >> Interesting, but the ACPI button code presumably only does this on resume > > > > > >> for a normal press while the system is awake it does use KEY_POWER, right ? > > > > > > > > > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > > > > > it does not seem to be captured in the email discussions or in the patch > > > > > > description. > > > > > > > > > > I assume they did this to avoid the immediate re-suspend on wakeup by > > > > > power-button issue. GNOME has a workaround for this, but I assume that > > > > > some userspace desktop environments are still going to have a problem > > > > > with this. > > > > > > > > It was done for this reason IIRC, but it should have been documented > > > > more thoroughly. > > > > > > I assert that it should not have been done and instead dealt with in > > > userspace. There are numerous drivers in the kernel emitting > > > KEY_POWER. Let userspace decide how to handle this, what keys to ignore, > > > what keys to process and when. > > > > Please see my last message in this thread (just sent) and see the > > changelog of commit 16f70feaabe9 ("ACPI: button: trigger wakeup key > > events"). > > > > This appears to be about cases when no event would be signaled to user > > space at all (power button wakeup from ACPI S3). > > Ahh, in S3 we do not know if we've been woken up with Sleep or Power > button, right? So we can not send the "right" event code and use > "neutral" KEY_WAKEUP for both. Is this right? Yes, it is, AFAICS. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 19:18 ` Rafael J. Wysocki 2025-06-26 19:28 ` Dmitry Torokhov @ 2025-06-26 19:28 ` Rafael J. Wysocki 1 sibling, 0 replies; 53+ messages in thread From: Rafael J. Wysocki @ 2025-06-26 19:28 UTC (permalink / raw) To: Hans de Goede Cc: Dmitry Torokhov, Mario Limonciello, Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello, Ken Xue On Thu, Jun 26, 2025 at 9:18 PM Rafael J. Wysocki <rafael@kernel.org> wrote: > > On Thu, Jun 26, 2025 at 9:16 PM Hans de Goede <hansg@kernel.org> wrote: > > > > Hi, > > > > On 26-Jun-25 21:14, Dmitry Torokhov wrote: > > > On Thu, Jun 26, 2025 at 08:57:30PM +0200, Hans de Goede wrote: > > >> Hi, > > >> > > >> On 26-Jun-25 20:48, Dmitry Torokhov wrote: > > >>> On Thu, Jun 26, 2025 at 01:20:54PM -0500, Mario Limonciello wrote: > > >>>> On 6/26/2025 1:07 PM, Dmitry Torokhov wrote: > > >>>>> On Thu, Jun 26, 2025 at 12:53:02PM -0500, Mario Limonciello wrote: > > >>>>>> > > >>>>>> > > >>>>>> On 6/26/25 12:44 PM, Dmitry Torokhov wrote: > > >>>>>>> Hi Mario, > > >>>>>>> > > >>>>>>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> On 6/26/25 3:35 AM, Hans de Goede wrote: > > >>>>>>>>> Hi Mario, > > >>>>>>>>> > > >>>>>>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: > > >>>>>>>>>> From: Mario Limonciello <mario.limonciello@amd.com> > > >>>>>>>>>> > > >>>>>>>>>> Sending an input event to wake a system does wake it, but userspace picks > > >>>>>>>>>> up the keypress and processes it. This isn't the intended behavior as it > > >>>>>>>>>> causes a suspended system to wake up and then potentially turn off if > > >>>>>>>>>> userspace is configured to turn off on power button presses. > > >>>>>>>>>> > > >>>>>>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. > > >>>>>>>>>> > > >>>>>>>>>> Cc: Hans de Goede <hansg@kernel.org> > > >>>>>>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > > >>>>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > >>>>>>>>>> --- > > >>>>>>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ > > >>>>>>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) > > >>>>>>>>>> > > >>>>>>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > > >>>>>>>>>> index 773aa5294d269..4c6876b099c43 100644 > > >>>>>>>>>> --- a/drivers/input/keyboard/gpio_keys.c > > >>>>>>>>>> +++ b/drivers/input/keyboard/gpio_keys.c > > >>>>>>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > > >>>>>>>>>> pm_stay_awake(bdata->input->dev.parent); > > >>>>>>>>>> if (bdata->suspended && > > >>>>>>>>>> (button->type == 0 || button->type == EV_KEY)) { > > >>>>>>>>>> - /* > > >>>>>>>>>> - * Simulate wakeup key press in case the key has > > >>>>>>>>>> - * already released by the time we got interrupt > > >>>>>>>>>> - * handler to run. > > >>>>>>>>>> - */ > > >>>>>>>>>> - input_report_key(bdata->input, button->code, 1); > > >>>>>>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); > > >>>>>>> > > >>>>>>> There is already pm_stay_awake() above. > > >>>>>> > > >>>>>> But that doesn't help with the fact that userspace gets KEY_POWER from this > > >>>>>> and reacts to it. > > >>>>>> > > >>>>>>> > > >>>>>>>>>> } > > >>>>>>>>>> } > > >>>>>>>>> > > >>>>>>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail > > >>>>>>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. > > >>>>>>>>> Android userspace actually needs the button-press (evdev) event to not > > >>>>>>>>> immediately go back to sleep, so a similar patch has been nacked in > > >>>>>>>>> the past. > > >>>>>>>>> > > >>>>>>>>> At least for GNOME this has been fixed in userspace by ignoring > > >>>>>>>>> power-button events the first few seconds after a resume from suspend. > > >>>>>>>>> > > >>>>>>>> > > >>>>>>>> The default behavior for logind is: > > >>>>>>>> > > >>>>>>>> HandlePowerKey=poweroff > > >>>>>>>> > > >>>>>>>> Can you share more about what version of GNOME has a workaround? > > >>>>>>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. > > >>>>>>>> > > >>>>>>>> Nonetheless if this is dependent on an Android userspace problem could we > > >>>>>>>> perhaps conditionalize it on CONFIG_ANDROID_BINDER_DEVICES? > > >>>>>>> > > >>>>>>> No it is not only Android, other userspace may want to distinguish > > >>>>>>> between normal and "dark" resume based on keyboard or other user > > >>>>>>> activity. > > >>>>>>> > > >>>>>>> Thanks. > > >>>>>>> > > >>>>>> In this specific case does the key passed up to satisfy this userspace > > >>>>>> requirement and keep it awake need to specifically be a fabricated > > >>>>>> KEY_POWER? > > >>>>>> > > >>>>>> Or could we find a key that doesn't require some userspace to ignore > > >>>>>> KEY_POWER? > > >>>>>> > > >>>>>> Maybe something like KEY_RESERVED, KEY_FN, or KEY_POWER2? > > >>>>> > > >>>>> The code makes no distinction between KEY_POWER and KEY_A or KEY_B, etc. > > >>>>> It simply passes event to userspace for processing. > > >>>> > > >>>> Right. I don't expect a problem with most keys, but my proposal is to > > >>>> special case KEY_POWER while suspended. If a key press event must be sent > > >>>> to keep Android and other userspace happy I suggest sending something > > >>>> different just for that situation. > > >>> > > >>> I do not know if userspace specifically looks for KEY_POWER or if it > > >>> looks for user input in general, and I'd rather be on safe side and not > > >>> mangle user input. > > >>> > > >>> As Hans mentioned, at least some userspace already prepared to deal with > > >>> this issue. And again, this only works if by the time ISR/debounce > > >>> runs the key is already released. What if it is still pressed? You still > > >>> going to observe KEY_POWER and need to suppress turning off the screen. > > >>> > > >>>> > > >>>> Like this: > > >>>> > > >>>> diff --git a/drivers/input/keyboard/gpio_keys.c > > >>>> b/drivers/input/keyboard/gpio_keys.c > > >>>> index 773aa5294d269..66e788d381956 100644 > > >>>> --- a/drivers/input/keyboard/gpio_keys.c > > >>>> +++ b/drivers/input/keyboard/gpio_keys.c > > >>>> @@ -425,7 +425,10 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void > > >>>> *dev_id) > > >>>> * already released by the time we got interrupt > > >>>> * handler to run. > > >>>> */ > > >>>> - input_report_key(bdata->input, button->code, 1); > > >>>> + if (button->code == KEY_POWER) > > >>>> + input_report_key(bdata->input, KEY_WAKEUP, > > >>>> 1); > > >>> > > >>> Just FYI: Here your KEY_WAKEUP is stuck forever. > > >>> > > >>>> + else > > >>>> + input_report_key(bdata->input, button->code, > > >>>> 1); > > >>>> } > > >>>> } > > >>>> > > >>>> > > >>>> > > >>>>> > > >>>>> You need to fix your userspace. Even with your tweak it is possible for > > >>>>> userspace to get a normal key event "too early" and turn off the screen > > >>>>> again, so you still need to handle this situation. > > >>>>> > > >>>>> Thanks. > > >>>>> > > >>>> > > >>>> I want to note this driver works quite differently than how ACPI power > > >>>> button does. > > >>>> > > >>>> You can see in acpi_button_notify() that the "keypress" is only forwarded > > >>>> when not suspended [1]. Otherwise it's just wakeup event (which is what my > > >>>> patch was modeling). > > >>>> > > >>>> https://github.com/torvalds/linux/blob/v6.16-rc3/drivers/acpi/button.c#L461 > > >>>> [1] > > >>> > > >>> If you check acpi_button_resume() you will see that the events are sent > > >>> from there. Except that for some reason they chose to use KEY_WAKEUP and > > >>> not KEY_POWER, oh well. Unlike acpi button driver gpio_keys is used on > > >>> multiple other platforms. > > >> > > >> Interesting, but the ACPI button code presumably only does this on resume > > >> for a normal press while the system is awake it does use KEY_POWER, right ? > > > > > > Yes. It is unclear to me why they chose to mangle the event on wakeup, > > > it does not seem to be captured in the email discussions or in the patch > > > description. > > > > I assume they did this to avoid the immediate re-suspend on wakeup by > > power-button issue. GNOME has a workaround for this, but I assume that > > some userspace desktop environments are still going to have a problem > > with this. > > It was done for this reason IIRC, but it should have been documented > more thoroughly. Actually, I'm thinking that this should only be done on S3 resume, not on s2idle resume. On S3 resume, there is no indication from the kernel to user space which event has caused the wakeup if it is the power button and so commit 16f70feaabe9 ("ACPI: button: trigger wakeup key events") attempted to mitigate this. However, on s2idle wakeup the actual input event is sent to user space, so there is no need to make up one. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 11:33 ` Mario Limonciello 2025-06-26 17:44 ` Dmitry Torokhov @ 2025-06-26 18:37 ` Hans de Goede 2025-06-26 18:42 ` Mario Limonciello 1 sibling, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-26 18:37 UTC (permalink / raw) To: Mario Limonciello Cc: Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello, Dmitry Torokhov Hi Mario, On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: > > > On 6/26/25 3:35 AM, Hans de Goede wrote: > > Hi Mario, > > > > On 25-Jun-25 23:58, Mario Limonciello wrote: > > > From: Mario Limonciello <mario.limonciello@amd.com> > > > > > > Sending an input event to wake a system does wake it, but userspace picks > > > up the keypress and processes it. This isn't the intended behavior as it > > > causes a suspended system to wake up and then potentially turn off if > > > userspace is configured to turn off on power button presses. > > > > > > Instead send a PM wakeup event for the PM core to handle waking the system. > > > > > > Cc: Hans de Goede <hansg@kernel.org> > > > Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") > > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > > > --- > > > drivers/input/keyboard/gpio_keys.c | 7 +------ > > > 1 file changed, 1 insertion(+), 6 deletions(-) > > > > > > diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c > > > index 773aa5294d269..4c6876b099c43 100644 > > > --- a/drivers/input/keyboard/gpio_keys.c > > > +++ b/drivers/input/keyboard/gpio_keys.c > > > @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) > > > pm_stay_awake(bdata->input->dev.parent); > > > if (bdata->suspended && > > > (button->type == 0 || button->type == EV_KEY)) { > > > - /* > > > - * Simulate wakeup key press in case the key has > > > - * already released by the time we got interrupt > > > - * handler to run. > > > - */ > > > - input_report_key(bdata->input, button->code, 1); > > > + pm_wakeup_event(bdata->input->dev.parent, 0); > > > } > > > } > > > > Hmm, we have the same problem on many Bay Trail / Cherry Trail > > windows 8 / win10 tablets, so this has been discussed before and e.g. > > Android userspace actually needs the button-press (evdev) event to not > > immediately go back to sleep, so a similar patch has been nacked in > > the past. > > > > At least for GNOME this has been fixed in userspace by ignoring > > power-button events the first few seconds after a resume from suspend. > > > > The default behavior for logind is: > > HandlePowerKey=poweroff Right note poweroff not suspend, GNOME inhibits logind's power-button handling and substitutes its own handling which is done by gsd-media-keys. > Can you share more about what version of GNOME has a workaround? > This was actually GNOME (on Ubuntu 24.04) that I found this issue. See: https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/blob/main/plugins/media-keys/gsd-media-keys-manager.c?ref_type=heads#L94 and the code in that file using that define. Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:37 ` Hans de Goede @ 2025-06-26 18:42 ` Mario Limonciello 2025-06-26 18:45 ` Hans de Goede 0 siblings, 1 reply; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 18:42 UTC (permalink / raw) To: Hans de Goede Cc: Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello, Dmitry Torokhov On 6/26/2025 1:37 PM, Hans de Goede wrote: > Hi Mario, > > On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >> >> >> On 6/26/25 3:35 AM, Hans de Goede wrote: >>> Hi Mario, >>> >>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>> >>>> Sending an input event to wake a system does wake it, but userspace picks >>>> up the keypress and processes it. This isn't the intended behavior as it >>>> causes a suspended system to wake up and then potentially turn off if >>>> userspace is configured to turn off on power button presses. >>>> >>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>> >>>> Cc: Hans de Goede <hansg@kernel.org> >>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>> --- >>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>> >>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>> index 773aa5294d269..4c6876b099c43 100644 >>>> --- a/drivers/input/keyboard/gpio_keys.c >>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>> pm_stay_awake(bdata->input->dev.parent); >>>> if (bdata->suspended && >>>> (button->type == 0 || button->type == EV_KEY)) { >>>> - /* >>>> - * Simulate wakeup key press in case the key has >>>> - * already released by the time we got interrupt >>>> - * handler to run. >>>> - */ >>>> - input_report_key(bdata->input, button->code, 1); >>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>>> } >>>> } >>> >>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>> Android userspace actually needs the button-press (evdev) event to not >>> immediately go back to sleep, so a similar patch has been nacked in >>> the past. >>> >>> At least for GNOME this has been fixed in userspace by ignoring >>> power-button events the first few seconds after a resume from suspend. >>> >> >> The default behavior for logind is: >> >> HandlePowerKey=poweroff > > Right note poweroff not suspend, GNOME inhibits logind's power-button > handling and substitutes its own handling which is done by gsd-media-keys. > >> Can you share more about what version of GNOME has a workaround? >> This was actually GNOME (on Ubuntu 24.04) that I found this issue. > > See: > > https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/blob/main/plugins/media-keys/gsd-media-keys-manager.c?ref_type=heads#L94 > > and the code in that file using that define. > > Regards, > > Hans > This is pretty ancient, it's part of GNOME 40 and later. Ubuntu 24.04 is GNOME 46. I have a hypothesis why the issue is happening. I wasn't suspending using logind; I was using rtcwake (in case power button didn't work I needed a means to wake the system). So this power button disable/enable delay code didn't get activated. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:42 ` Mario Limonciello @ 2025-06-26 18:45 ` Hans de Goede 2025-06-26 18:47 ` Mario Limonciello 0 siblings, 1 reply; 53+ messages in thread From: Hans de Goede @ 2025-06-26 18:45 UTC (permalink / raw) To: Mario Limonciello Cc: Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello, Dmitry Torokhov Hi, On 26-Jun-25 20:42, Mario Limonciello wrote: > On 6/26/2025 1:37 PM, Hans de Goede wrote: >> Hi Mario, >> >> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >>> >>> >>> On 6/26/25 3:35 AM, Hans de Goede wrote: >>>> Hi Mario, >>>> >>>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>>> >>>>> Sending an input event to wake a system does wake it, but userspace picks >>>>> up the keypress and processes it. This isn't the intended behavior as it >>>>> causes a suspended system to wake up and then potentially turn off if >>>>> userspace is configured to turn off on power button presses. >>>>> >>>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>>> >>>>> Cc: Hans de Goede <hansg@kernel.org> >>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>>> --- >>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>>> >>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>>> index 773aa5294d269..4c6876b099c43 100644 >>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>>> pm_stay_awake(bdata->input->dev.parent); >>>>> if (bdata->suspended && >>>>> (button->type == 0 || button->type == EV_KEY)) { >>>>> - /* >>>>> - * Simulate wakeup key press in case the key has >>>>> - * already released by the time we got interrupt >>>>> - * handler to run. >>>>> - */ >>>>> - input_report_key(bdata->input, button->code, 1); >>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>>>> } >>>>> } >>>> >>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>>> Android userspace actually needs the button-press (evdev) event to not >>>> immediately go back to sleep, so a similar patch has been nacked in >>>> the past. >>>> >>>> At least for GNOME this has been fixed in userspace by ignoring >>>> power-button events the first few seconds after a resume from suspend. >>>> >>> >>> The default behavior for logind is: >>> >>> HandlePowerKey=poweroff >> >> Right note poweroff not suspend, GNOME inhibits logind's power-button >> handling and substitutes its own handling which is done by gsd-media-keys. >> >>> Can you share more about what version of GNOME has a workaround? >>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >> >> See: >> >> https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/blob/main/plugins/media-keys/gsd-media-keys-manager.c?ref_type=heads#L94 >> >> and the code in that file using that define. >> >> Regards, >> >> Hans >> > > This is pretty ancient, it's part of GNOME 40 and later. Ubuntu 24.04 is GNOME 46. Right, this power-button evdev key event on resume causing an immediate suspend again is a pretty old problem. When I said "discussed before" I meant discussed quite a while ago :) Regards, Hans ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-26 18:45 ` Hans de Goede @ 2025-06-26 18:47 ` Mario Limonciello 0 siblings, 0 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 18:47 UTC (permalink / raw) To: Hans de Goede Cc: Mika Westerberg, Andy Shevchenko, Linus Walleij, Bartosz Golaszewski, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello, Dmitry Torokhov On 6/26/2025 1:45 PM, Hans de Goede wrote: > Hi, > > On 26-Jun-25 20:42, Mario Limonciello wrote: >> On 6/26/2025 1:37 PM, Hans de Goede wrote: >>> Hi Mario, >>> >>> On Thu, Jun 26, 2025 at 06:33:08AM -0500, Mario Limonciello wrote: >>>> >>>> >>>> On 6/26/25 3:35 AM, Hans de Goede wrote: >>>>> Hi Mario, >>>>> >>>>> On 25-Jun-25 23:58, Mario Limonciello wrote: >>>>>> From: Mario Limonciello <mario.limonciello@amd.com> >>>>>> >>>>>> Sending an input event to wake a system does wake it, but userspace picks >>>>>> up the keypress and processes it. This isn't the intended behavior as it >>>>>> causes a suspended system to wake up and then potentially turn off if >>>>>> userspace is configured to turn off on power button presses. >>>>>> >>>>>> Instead send a PM wakeup event for the PM core to handle waking the system. >>>>>> >>>>>> Cc: Hans de Goede <hansg@kernel.org> >>>>>> Fixes: 0f107573da417 ("Input: gpio_keys - handle the missing key press event in resume phase") >>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> >>>>>> --- >>>>>> drivers/input/keyboard/gpio_keys.c | 7 +------ >>>>>> 1 file changed, 1 insertion(+), 6 deletions(-) >>>>>> >>>>>> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c >>>>>> index 773aa5294d269..4c6876b099c43 100644 >>>>>> --- a/drivers/input/keyboard/gpio_keys.c >>>>>> +++ b/drivers/input/keyboard/gpio_keys.c >>>>>> @@ -420,12 +420,7 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) >>>>>> pm_stay_awake(bdata->input->dev.parent); >>>>>> if (bdata->suspended && >>>>>> (button->type == 0 || button->type == EV_KEY)) { >>>>>> - /* >>>>>> - * Simulate wakeup key press in case the key has >>>>>> - * already released by the time we got interrupt >>>>>> - * handler to run. >>>>>> - */ >>>>>> - input_report_key(bdata->input, button->code, 1); >>>>>> + pm_wakeup_event(bdata->input->dev.parent, 0); >>>>>> } >>>>>> } >>>>> >>>>> Hmm, we have the same problem on many Bay Trail / Cherry Trail >>>>> windows 8 / win10 tablets, so this has been discussed before and e.g. >>>>> Android userspace actually needs the button-press (evdev) event to not >>>>> immediately go back to sleep, so a similar patch has been nacked in >>>>> the past. >>>>> >>>>> At least for GNOME this has been fixed in userspace by ignoring >>>>> power-button events the first few seconds after a resume from suspend. >>>>> >>>> >>>> The default behavior for logind is: >>>> >>>> HandlePowerKey=poweroff >>> >>> Right note poweroff not suspend, GNOME inhibits logind's power-button >>> handling and substitutes its own handling which is done by gsd-media-keys. >>> >>>> Can you share more about what version of GNOME has a workaround? >>>> This was actually GNOME (on Ubuntu 24.04) that I found this issue. >>> >>> See: >>> >>> https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/blob/main/plugins/media-keys/gsd-media-keys-manager.c?ref_type=heads#L94 >>> >>> and the code in that file using that define. >>> >>> Regards, >>> >>> Hans >>> >> >> This is pretty ancient, it's part of GNOME 40 and later. Ubuntu 24.04 is GNOME 46. > > Right, this power-button evdev key event on resume causing an immediate > suspend again is a pretty old problem. When I said "discussed before" > I meant discussed quite a while ago :) > > Regards, > > Hans > :) I'm quite used to most platforms using ACPI power button which doesn't send a key press event during the resume sequence, so this is the first exposure for me to it. ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 4/4] Input: Don't send fake button presses to wake system 2025-06-25 21:58 ` [PATCH v3 4/4] Input: Don't send fake button presses to wake system Mario Limonciello 2025-06-26 8:35 ` Hans de Goede @ 2025-06-26 14:37 ` Andy Shevchenko 1 sibling, 0 replies; 53+ messages in thread From: Andy Shevchenko @ 2025-06-26 14:37 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Wed, Jun 25, 2025 at 04:58:13PM -0500, Mario Limonciello wrote: > > Sending an input event to wake a system does wake it, but userspace picks > up the keypress and processes it. This isn't the intended behavior as it > causes a suspended system to wake up and then potentially turn off if > userspace is configured to turn off on power button presses. > > Instead send a PM wakeup event for the PM core to handle waking the system. It seems the Subject is incorrect WRT the pattern used in input subsystem (in this and in the previous patches). Should be something like: Input: $driver - $summary where $driver and $summary the exact driver name and summary you want to put. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 0/4] Fix soc-button-array debounce 2025-06-25 21:58 [PATCH v3 0/4] Fix soc-button-array debounce Mario Limonciello ` (3 preceding siblings ...) 2025-06-25 21:58 ` [PATCH v3 4/4] Input: Don't send fake button presses to wake system Mario Limonciello @ 2025-06-26 14:35 ` Andy Shevchenko 2025-06-26 15:59 ` Mario Limonciello 4 siblings, 1 reply; 53+ messages in thread From: Andy Shevchenko @ 2025-06-26 14:35 UTC (permalink / raw) To: Mario Limonciello Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On Wed, Jun 25, 2025 at 04:58:09PM -0500, Mario Limonciello wrote: > From: Mario Limonciello <mario.limonciello@amd.com> > > I have some hardware in front of me that uses the soc-button-array > driver but the power button doesn't work. > > Digging into it, it's because the ASL prescribes a debounce of 0 for > the power button, but the soc-button-array driver hardcodes 50ms. > > Hardcoding it to what the ASL expects the power button works. > > I looked at the callpath into the GPIO core and I believe it's > because the debounce value from _CRS is never programmed to the > hardware the way that the GPIO gets setup. > > This series add that programming path and then sets the hardcoded > value on on some quirked systems. Hopefully Hans can confirm this > continues to work on the hardware that he originally developed the > hardcoding for. There is no a note about routing the patch in upstream. My proposal to take GPIO ACPI library patch and provide and immutable tag for others. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v3 0/4] Fix soc-button-array debounce 2025-06-26 14:35 ` [PATCH v3 0/4] Fix soc-button-array debounce Andy Shevchenko @ 2025-06-26 15:59 ` Mario Limonciello 0 siblings, 0 replies; 53+ messages in thread From: Mario Limonciello @ 2025-06-26 15:59 UTC (permalink / raw) To: Andy Shevchenko Cc: Hans de Goede, Mika Westerberg, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, open list:GPIO ACPI SUPPORT, open list:GPIO ACPI SUPPORT, open list, open list:INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN)..., Mario Limonciello On 6/26/2025 9:35 AM, Andy Shevchenko wrote: > On Wed, Jun 25, 2025 at 04:58:09PM -0500, Mario Limonciello wrote: >> From: Mario Limonciello <mario.limonciello@amd.com> >> >> I have some hardware in front of me that uses the soc-button-array >> driver but the power button doesn't work. >> >> Digging into it, it's because the ASL prescribes a debounce of 0 for >> the power button, but the soc-button-array driver hardcodes 50ms. >> >> Hardcoding it to what the ASL expects the power button works. >> >> I looked at the callpath into the GPIO core and I believe it's >> because the debounce value from _CRS is never programmed to the >> hardware the way that the GPIO gets setup. >> >> This series add that programming path and then sets the hardcoded >> value on on some quirked systems. Hopefully Hans can confirm this >> continues to work on the hardware that he originally developed the >> hardcoding for. > > There is no a note about routing the patch in upstream. My proposal to take > GPIO ACPI library patch and provide and immutable tag for others. > Sure. I don't feel strongly on how this needs to go, fine by me. I'll add a note in cover letter for this for v4. ^ permalink raw reply [flat|nested] 53+ messages in thread
end of thread, other threads:[~2025-06-27 20:29 UTC | newest] Thread overview: 53+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-25 21:58 [PATCH v3 0/4] Fix soc-button-array debounce Mario Limonciello 2025-06-25 21:58 ` [PATCH v3 1/4] gpiolib: acpi: Add a helper for programming debounce Mario Limonciello 2025-06-26 14:29 ` Andy Shevchenko 2025-06-26 16:04 ` Mario Limonciello 2025-06-25 21:58 ` [PATCH v3 2/4] gpiolib: acpi: Program debounce when finding GPIO Mario Limonciello 2025-06-26 14:31 ` Andy Shevchenko 2025-06-25 21:58 ` [PATCH v3 3/4] Input: Don't program hw debounce for soc_button_array devices Mario Limonciello 2025-06-26 8:27 ` Hans de Goede 2025-06-26 14:33 ` Andy Shevchenko 2025-06-25 21:58 ` [PATCH v3 4/4] Input: Don't send fake button presses to wake system Mario Limonciello 2025-06-26 8:35 ` Hans de Goede 2025-06-26 11:33 ` Mario Limonciello 2025-06-26 17:44 ` Dmitry Torokhov 2025-06-26 17:53 ` Mario Limonciello 2025-06-26 18:07 ` Dmitry Torokhov 2025-06-26 18:20 ` Mario Limonciello 2025-06-26 18:48 ` Dmitry Torokhov 2025-06-26 18:55 ` Mario Limonciello 2025-06-26 19:06 ` Dmitry Torokhov 2025-06-26 19:37 ` Andy Shevchenko 2025-06-26 18:57 ` Hans de Goede 2025-06-26 19:14 ` Dmitry Torokhov 2025-06-26 19:16 ` Hans de Goede 2025-06-26 19:18 ` Rafael J. Wysocki 2025-06-26 19:28 ` Dmitry Torokhov 2025-06-26 19:31 ` Rafael J. Wysocki 2025-06-26 19:40 ` Dmitry Torokhov 2025-06-26 22:21 ` Mario Limonciello 2025-06-27 4:56 ` Dmitry Torokhov 2025-06-27 14:06 ` Mario Limonciello 2025-06-27 14:14 ` Hans de Goede 2025-06-27 14:44 ` Dmitry Torokhov 2025-06-27 15:56 ` Hans de Goede 2025-06-27 16:12 ` Andy Shevchenko 2025-06-27 17:59 ` Hans de Goede 2025-06-27 18:47 ` Dmitry Torokhov 2025-06-27 18:36 ` Dmitry Torokhov 2025-06-27 18:56 ` Mario Limonciello 2025-06-27 19:18 ` Dmitry Torokhov 2025-06-27 19:38 ` Hans de Goede 2025-06-27 19:44 ` Mario Limonciello 2025-06-27 20:25 ` Hans de Goede 2025-06-27 20:29 ` Mario Limonciello 2025-06-27 19:45 ` Mario Limonciello 2025-06-27 10:36 ` Rafael J. Wysocki 2025-06-26 19:28 ` Rafael J. Wysocki 2025-06-26 18:37 ` Hans de Goede 2025-06-26 18:42 ` Mario Limonciello 2025-06-26 18:45 ` Hans de Goede 2025-06-26 18:47 ` Mario Limonciello 2025-06-26 14:37 ` Andy Shevchenko 2025-06-26 14:35 ` [PATCH v3 0/4] Fix soc-button-array debounce Andy Shevchenko 2025-06-26 15:59 ` 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).