Home Home > GIT Browse > SLE15-AZURE
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-01-18 17:24:15 +0100
committerTakashi Iwai <tiwai@suse.de>2019-01-18 17:24:21 +0100
commit9f8015ba1d125e2736b321b2b8b7c3bfaa3b8560 (patch)
treeafd4bd167a3ec41c7779da3cfa8c7f6fc4ecb294
parent43ce511b8475f1836dc9cfe4ae0bc72fb05bd323 (diff)
Input: omap-keypad - fix idle configuration to not block SoC
idle states (bsc#1051510).
-rw-r--r--patches.drivers/Input-omap-keypad-fix-idle-configuration-to-not-bloc.patch84
-rw-r--r--series.conf1
2 files changed, 85 insertions, 0 deletions
diff --git a/patches.drivers/Input-omap-keypad-fix-idle-configuration-to-not-bloc.patch b/patches.drivers/Input-omap-keypad-fix-idle-configuration-to-not-bloc.patch
new file mode 100644
index 0000000000..f7b0d0b506
--- /dev/null
+++ b/patches.drivers/Input-omap-keypad-fix-idle-configuration-to-not-bloc.patch
@@ -0,0 +1,84 @@
+From e2ca26ec4f01486661b55b03597c13e2b9c18b73 Mon Sep 17 00:00:00 2001
+From: Tony Lindgren <tony@atomide.com>
+Date: Tue, 4 Dec 2018 13:52:49 -0800
+Subject: [PATCH] Input: omap-keypad - fix idle configuration to not block SoC idle states
+Git-commit: e2ca26ec4f01486661b55b03597c13e2b9c18b73
+Patch-mainline: v4.20
+References: bsc#1051510
+
+With PM enabled, I noticed that pressing a key on the droid4 keyboard will
+block deeper idle states for the SoC. Let's fix this by using IRQF_ONESHOT
+and stop constantly toggling the device OMAP4_KBD_IRQENABLE register as
+suggested by Dmitry Torokhov <dmitry.torokhov@gmail.com>.
+
+From the hardware point of view, looks like we need to manage the registers
+for OMAP4_KBD_IRQENABLE and OMAP4_KBD_WAKEUPENABLE together to avoid
+blocking deeper SoC idle states. And with toggling of OMAP4_KBD_IRQENABLE
+register now gone with IRQF_ONESHOT, also the SoC idle state problem is
+gone during runtime. We still also need to clear OMAP4_KBD_WAKEUPENABLE in
+omap4_keypad_close() though to pair it with omap4_keypad_open() to prevent
+blocking deeper SoC idle states after rmmod omap4-keypad.
+
+Reported-by: Pavel Machek <pavel@ucw.cz>
+Signed-off-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Acked-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ drivers/input/keyboard/omap4-keypad.c | 16 ++++------------
+ 1 file changed, 4 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c
+index ce8e2baf31bb..616fdd94b069 100644
+--- a/drivers/input/keyboard/omap4-keypad.c
++++ b/drivers/input/keyboard/omap4-keypad.c
+@@ -126,12 +126,8 @@ static irqreturn_t omap4_keypad_irq_handler(int irq, void *dev_id)
+ {
+ struct omap4_keypad *keypad_data = dev_id;
+
+- if (kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)) {
+- /* Disable interrupts */
+- kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
+- OMAP4_VAL_IRQDISABLE);
++ if (kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS))
+ return IRQ_WAKE_THREAD;
+- }
+
+ return IRQ_NONE;
+ }
+@@ -173,11 +169,6 @@ static irqreturn_t omap4_keypad_irq_thread_fn(int irq, void *dev_id)
+ kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
+ kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
+
+- /* enable interrupts */
+- kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
+- OMAP4_DEF_IRQENABLE_EVENTEN |
+- OMAP4_DEF_IRQENABLE_LONGKEY);
+-
+ return IRQ_HANDLED;
+ }
+
+@@ -214,9 +205,10 @@ static void omap4_keypad_close(struct input_dev *input)
+
+ disable_irq(keypad_data->irq);
+
+- /* Disable interrupts */
++ /* Disable interrupts and wake-up events */
+ kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
+ OMAP4_VAL_IRQDISABLE);
++ kbd_writel(keypad_data, OMAP4_KBD_WAKEUPENABLE, 0);
+
+ /* clear pending interrupts */
+ kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
+@@ -364,7 +356,7 @@ static int omap4_keypad_probe(struct platform_device *pdev)
+ }
+
+ error = request_threaded_irq(keypad_data->irq, omap4_keypad_irq_handler,
+- omap4_keypad_irq_thread_fn, 0,
++ omap4_keypad_irq_thread_fn, IRQF_ONESHOT,
+ "omap4-keypad", keypad_data);
+ if (error) {
+ dev_err(&pdev->dev, "failed to register interrupt\n");
+--
+2.16.4
+
diff --git a/series.conf b/series.conf
index 0c2542b56e..c9dfc037f9 100644
--- a/series.conf
+++ b/series.conf
@@ -19600,6 +19600,7 @@
patches.drivers/gpiolib-acpi-Only-defer-request_irq-for-GpioInt-ACPI.patch
patches.drivers/gpio-max7301-fix-driver-for-use-with-CONFIG_VMAP_STA.patch
patches.drivers/gpio-mvebu-only-fail-on-missing-clk-if-pwm-is-actual.patch
+ patches.drivers/Input-omap-keypad-fix-idle-configuration-to-not-bloc.patch
patches.drm/0001-drm-ioctl-Fix-Spectre-v1-vulnerabilities.patch
patches.fixes/x86-mm-Fix-decoy-address-handling-vs-32-bit-builds.patch
patches.drm/0001-drm-rockchip-psr-do-not-dereference-encoder-before-i.patch