build/patch/kernel/archive/sunxi-6.2/patches.megous/mfd-axp20x-Improve-interrupt-order-for-POK-handling-during-slee.patch

87 lines
2.8 KiB
Diff

From 7cdccb8da536a285742c8cb1b040ad519688734e Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Thu, 10 Nov 2022 23:01:54 +0100
Subject: [PATCH 232/391] mfd: axp20x: Improve interrupt order for POK handling
during sleep
When the individual interrupt is not handled immediately and the
user manages to press and release the POK before interrupt handler
fires, the interrupts will get sent up the stack in the order defined
in the *regmap_irqs array. For POK, this means that release event
will get sent before the press event, and in that case the key
may get stuck in pressed mode even when the user is not holding
the key anymore.
Of course if interrupt handler doesn't run for multiple press/release
cycles, we may not know the physical state of the button, because the
flags are not getting cleared, but it's preferable to err on released
state, instead of pressed state, because that causes fewer issues
for the user. If we err on pressed state (current behavior), userspace
may simply decide to power off the users's device due to "long press"
of the power button, if the users resumes the device by pressing
and releasing the power key quickly enough, before interrupt handler
runs.
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
include/linux/mfd/axp20x.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index 6b01f3e48..b64923577 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -433,8 +433,8 @@ enum {
AXP152_IRQ_PEK_SHORT,
AXP152_IRQ_PEK_LONG,
AXP152_IRQ_TIMER,
- AXP152_IRQ_PEK_RIS_EDGE,
AXP152_IRQ_PEK_FAL_EDGE,
+ AXP152_IRQ_PEK_RIS_EDGE,
AXP152_IRQ_GPIO3_INPUT,
AXP152_IRQ_GPIO2_INPUT,
AXP152_IRQ_GPIO1_INPUT,
@@ -473,8 +473,8 @@ enum {
AXP20X_IRQ_LOW_PWR_LVL1,
AXP20X_IRQ_LOW_PWR_LVL2,
AXP20X_IRQ_TIMER,
- AXP20X_IRQ_PEK_RIS_EDGE,
AXP20X_IRQ_PEK_FAL_EDGE,
+ AXP20X_IRQ_PEK_RIS_EDGE,
AXP20X_IRQ_GPIO3_INPUT,
AXP20X_IRQ_GPIO2_INPUT,
AXP20X_IRQ_GPIO1_INPUT,
@@ -503,8 +503,8 @@ enum axp22x_irqs {
AXP22X_IRQ_LOW_PWR_LVL1,
AXP22X_IRQ_LOW_PWR_LVL2,
AXP22X_IRQ_TIMER,
- AXP22X_IRQ_PEK_RIS_EDGE,
AXP22X_IRQ_PEK_FAL_EDGE,
+ AXP22X_IRQ_PEK_RIS_EDGE,
AXP22X_IRQ_GPIO1_INPUT,
AXP22X_IRQ_GPIO0_INPUT,
};
@@ -572,8 +572,8 @@ enum axp803_irqs {
AXP803_IRQ_LOW_PWR_LVL1,
AXP803_IRQ_LOW_PWR_LVL2,
AXP803_IRQ_TIMER,
- AXP803_IRQ_PEK_RIS_EDGE,
AXP803_IRQ_PEK_FAL_EDGE,
+ AXP803_IRQ_PEK_RIS_EDGE,
AXP803_IRQ_PEK_SHORT,
AXP803_IRQ_PEK_LONG,
AXP803_IRQ_PEK_OVER_OFF,
@@ -624,8 +624,8 @@ enum axp809_irqs {
AXP809_IRQ_LOW_PWR_LVL1,
AXP809_IRQ_LOW_PWR_LVL2,
AXP809_IRQ_TIMER,
- AXP809_IRQ_PEK_RIS_EDGE,
AXP809_IRQ_PEK_FAL_EDGE,
+ AXP809_IRQ_PEK_RIS_EDGE,
AXP809_IRQ_PEK_SHORT,
AXP809_IRQ_PEK_LONG,
AXP809_IRQ_PEK_OVER_OFF,
--
2.35.3