summaryrefslogtreecommitdiff |
diff options
author | Takashi Iwai <tiwai@suse.de> | 2019-01-18 17:24:15 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2019-01-18 17:24:21 +0100 |
commit | 9f8015ba1d125e2736b321b2b8b7c3bfaa3b8560 (patch) | |
tree | afd4bd167a3ec41c7779da3cfa8c7f6fc4ecb294 | |
parent | 43ce511b8475f1836dc9cfe4ae0bc72fb05bd323 (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.patch | 84 | ||||
-rw-r--r-- | series.conf | 1 |
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 |