87 lines
2.8 KiB
Diff
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
|
|
|