apm821xx: fix bogus key-presses on boot
authorChristian Lamparter <chunkeey@gmail.com>
Sat, 15 Jun 2019 17:13:30 +0000 (19:13 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Thu, 20 Jun 2019 17:58:27 +0000 (19:58 +0200)
"There are often transient line events when
the system is powered up and initialized and it
is often necessary for the gpio_chip driver to
clear any interrupt flags in hardware before
setting up the gpio chip, especially the
irqchip portions of it."
<http://lists.infradead.org/pipermail/openwrt-devel/2019-June/017630.html>

This patch adds a fix for the APM821XX's interrupt
controller to clear any bogus pending toggled
interrupts that happens on various APM821XX boards
on boot.

The patch also changes the debouce-interval from the
default 5ms debounce interval to 60ms all around.
The default setting caused on occasions that the button
state became stuck in a pressed state, even though the
button was released.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
target/linux/apm821xx/dts/meraki-mr24.dts
target/linux/apm821xx/dts/meraki-mx60.dts
target/linux/apm821xx/dts/netgear-wndap6x0.dtsi
target/linux/apm821xx/dts/netgear-wndr4700.dts
target/linux/apm821xx/patches-4.14/100-powerpc-4xx-uic-clear-pending-interrupt-after-irq-ty.patch [new file with mode: 0644]
target/linux/apm821xx/patches-4.19/100-powerpc-4xx-uic-clear-pending-interrupt-after-irq-ty.patch [new file with mode: 0644]

index 144c6f0eb36dbc59fcb2d7a5e693843f3ae71a1e..8fdef7c171c4a3644d8ed44c131e310dae0dbb4f 100644 (file)
                        interrupt-parent = <&UIC1>;
                        interrupts = <0x15 IRQ_TYPE_EDGE_FALLING>;
                        gpios = <&GPIO0 16 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
                };
        };
 };
index 2550d259ab4c29dc1d5f42b75499290392a8823f..3620005e4d250bdd76bef574ccc9b5947ff1fbf0 100644 (file)
                        gpios = <&GPIO0 16 GPIO_ACTIVE_LOW>;
                        interrupt-parent = <&UIC1>;
                        interrupts = <0x15 IRQ_TYPE_EDGE_FALLING>;
+                       debounce-interval = <60>;
                };
        };
 };
index c39f4ad83b0aeb713815a5276c2697431e2aaa86..2d135d64da4ab1b156aba0a00e16cabb6def3b03 100644 (file)
                        linux,code = <KEY_RESTART>;
                        interrupt-parent = <&UIC1>;
                        interrupts = <0x15 IRQ_TYPE_EDGE_FALLING>;
+                       debounce-interval = <60>;
                };
        };
 
index 24d5c33f9061a49d993d2403228a3928391c796f..a9ec36adad34e1a9549902cffec28844e1aed3d2 100644 (file)
                        linux,code = <KEY_RESTART>;
                        interrupt-parent = <&UIC1>;
                        interrupts = <0x14 IRQ_TYPE_EDGE_FALLING>;
+                       debounce-interval = <60>;
                };
 
                backup_hd {
                        linux,code = <BTN_0>;
                        interrupt-parent = <&UIC1>;
                        interrupts = <0x1e IRQ_TYPE_EDGE_FALLING>;
+                       debounce-interval = <60>;
                };
 
                rfkill {
                        linux,code = <KEY_RFKILL>;
                        interrupt-parent = <&UIC1>;
                        interrupts = <0x1f IRQ_TYPE_EDGE_FALLING>;
+                       debounce-interval = <60>;
                };
 
                wps {
                        linux,code = <KEY_WPS_BUTTON>;
                        interrupt-parent = <&UIC2>;
                        interrupts = <0x19 IRQ_TYPE_EDGE_FALLING>;
+                       debounce-interval = <60>;
                };
        };
 
diff --git a/target/linux/apm821xx/patches-4.14/100-powerpc-4xx-uic-clear-pending-interrupt-after-irq-ty.patch b/target/linux/apm821xx/patches-4.14/100-powerpc-4xx-uic-clear-pending-interrupt-after-irq-ty.patch
new file mode 100644 (file)
index 0000000..ee4eeb6
--- /dev/null
@@ -0,0 +1,30 @@
+From 9b84ad676e248a3e3c81db7f5d39e1739b3780aa Mon Sep 17 00:00:00 2001
+From: Christian Lamparter <chunkeey@gmail.com>
+Date: Sat, 15 Jun 2019 16:35:26 +0200
+Subject: [PATCH] powerpc/4xx/uic: clear pending interrupt after irq type/pol
+ change
+
+When testing out gpio-keys with a button, a spurious
+interrupt (and therefore a key press or release event)
+gets triggered as soon as the driver enables the irq
+line for the first time.
+
+This patch clears any potential bogus generated interrupt
+that was caused by the switching of the associated irq's
+type and polarity.
+
+Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
+---
+ arch/powerpc/platforms/4xx/uic.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/powerpc/platforms/4xx/uic.c
++++ b/arch/powerpc/platforms/4xx/uic.c
+@@ -158,6 +158,7 @@ static int uic_set_irq_type(struct irq_d
+       mtdcr(uic->dcrbase + UIC_PR, pr);
+       mtdcr(uic->dcrbase + UIC_TR, tr);
++      mtdcr(uic->dcrbase + UIC_SR, ~mask);
+       raw_spin_unlock_irqrestore(&uic->lock, flags);
diff --git a/target/linux/apm821xx/patches-4.19/100-powerpc-4xx-uic-clear-pending-interrupt-after-irq-ty.patch b/target/linux/apm821xx/patches-4.19/100-powerpc-4xx-uic-clear-pending-interrupt-after-irq-ty.patch
new file mode 100644 (file)
index 0000000..ee4eeb6
--- /dev/null
@@ -0,0 +1,30 @@
+From 9b84ad676e248a3e3c81db7f5d39e1739b3780aa Mon Sep 17 00:00:00 2001
+From: Christian Lamparter <chunkeey@gmail.com>
+Date: Sat, 15 Jun 2019 16:35:26 +0200
+Subject: [PATCH] powerpc/4xx/uic: clear pending interrupt after irq type/pol
+ change
+
+When testing out gpio-keys with a button, a spurious
+interrupt (and therefore a key press or release event)
+gets triggered as soon as the driver enables the irq
+line for the first time.
+
+This patch clears any potential bogus generated interrupt
+that was caused by the switching of the associated irq's
+type and polarity.
+
+Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
+---
+ arch/powerpc/platforms/4xx/uic.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/powerpc/platforms/4xx/uic.c
++++ b/arch/powerpc/platforms/4xx/uic.c
+@@ -158,6 +158,7 @@ static int uic_set_irq_type(struct irq_d
+       mtdcr(uic->dcrbase + UIC_PR, pr);
+       mtdcr(uic->dcrbase + UIC_TR, tr);
++      mtdcr(uic->dcrbase + UIC_SR, ~mask);
+       raw_spin_unlock_irqrestore(&uic->lock, flags);