mfd: axp20x: Fix order of pek rise and fall events
authorAren Moynihan <aren@peacevolution.org>
Thu, 8 Dec 2022 22:02:26 +0000 (17:02 -0500)
committerLee Jones <lee@kernel.org>
Wed, 22 Feb 2023 08:25:51 +0000 (08:25 +0000)
The power button can get "stuck" if the rising edge and falling edge irq
are read in the same pass. This can often be triggered when resuming
from suspend if the power button is released before the kernel handles
the interrupt.

Swapping the order of the rise and fall events makes sure that the press
event is handled first, which prevents this situation.

Signed-off-by: Aren Moynihan <aren@peacevolution.org>
Reviewed-by: Samuel Holland <samuel@sholland.org>
Tested-by: Samuel Holland <samuel@sholland.org>
Acked-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20221208220225.635414-1-aren@peacevolution.org
include/linux/mfd/axp20x.h

index 9ab0e2fca7eac247590d04598e50850b77011481..2058194807bd2cc2861932bf22749d938918928c 100644 (file)
@@ -432,8 +432,9 @@ enum {
        AXP152_IRQ_PEK_SHORT,
        AXP152_IRQ_PEK_LONG,
        AXP152_IRQ_TIMER,
-       AXP152_IRQ_PEK_RIS_EDGE,
+       /* out of bit order to make sure the press event is handled first */
        AXP152_IRQ_PEK_FAL_EDGE,
+       AXP152_IRQ_PEK_RIS_EDGE,
        AXP152_IRQ_GPIO3_INPUT,
        AXP152_IRQ_GPIO2_INPUT,
        AXP152_IRQ_GPIO1_INPUT,
@@ -472,8 +473,9 @@ enum {
        AXP20X_IRQ_LOW_PWR_LVL1,
        AXP20X_IRQ_LOW_PWR_LVL2,
        AXP20X_IRQ_TIMER,
-       AXP20X_IRQ_PEK_RIS_EDGE,
+       /* out of bit order to make sure the press event is handled first */
        AXP20X_IRQ_PEK_FAL_EDGE,
+       AXP20X_IRQ_PEK_RIS_EDGE,
        AXP20X_IRQ_GPIO3_INPUT,
        AXP20X_IRQ_GPIO2_INPUT,
        AXP20X_IRQ_GPIO1_INPUT,
@@ -502,8 +504,9 @@ enum axp22x_irqs {
        AXP22X_IRQ_LOW_PWR_LVL1,
        AXP22X_IRQ_LOW_PWR_LVL2,
        AXP22X_IRQ_TIMER,
-       AXP22X_IRQ_PEK_RIS_EDGE,
+       /* out of bit order to make sure the press event is handled first */
        AXP22X_IRQ_PEK_FAL_EDGE,
+       AXP22X_IRQ_PEK_RIS_EDGE,
        AXP22X_IRQ_GPIO1_INPUT,
        AXP22X_IRQ_GPIO0_INPUT,
 };
@@ -571,8 +574,9 @@ enum axp803_irqs {
        AXP803_IRQ_LOW_PWR_LVL1,
        AXP803_IRQ_LOW_PWR_LVL2,
        AXP803_IRQ_TIMER,
-       AXP803_IRQ_PEK_RIS_EDGE,
+       /* out of bit order to make sure the press event is handled first */
        AXP803_IRQ_PEK_FAL_EDGE,
+       AXP803_IRQ_PEK_RIS_EDGE,
        AXP803_IRQ_PEK_SHORT,
        AXP803_IRQ_PEK_LONG,
        AXP803_IRQ_PEK_OVER_OFF,
@@ -623,8 +627,9 @@ enum axp809_irqs {
        AXP809_IRQ_LOW_PWR_LVL1,
        AXP809_IRQ_LOW_PWR_LVL2,
        AXP809_IRQ_TIMER,
-       AXP809_IRQ_PEK_RIS_EDGE,
+       /* out of bit order to make sure the press event is handled first */
        AXP809_IRQ_PEK_FAL_EDGE,
+       AXP809_IRQ_PEK_RIS_EDGE,
        AXP809_IRQ_PEK_SHORT,
        AXP809_IRQ_PEK_LONG,
        AXP809_IRQ_PEK_OVER_OFF,