stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Anson Huang <anson.huang@nxp.com>,
	Anson Huang <Anson.Huang@nxp.com>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Sasha Levin <sashal@kernel.org>,
	linux-input@vger.kernel.org
Subject: [PATCH AUTOSEL 4.14 19/35] Input: imx_keypad - make sure keyboard can always wake up system
Date: Wed, 26 Jun 2019 20:39:07 -0400	[thread overview]
Message-ID: <20190627003925.21330-19-sashal@kernel.org> (raw)
In-Reply-To: <20190627003925.21330-1-sashal@kernel.org>

From: Anson Huang <anson.huang@nxp.com>

[ Upstream commit ce9a53eb3dbca89e7ad86673d94ab886e9bea704 ]

There are several scenarios that keyboard can NOT wake up system
from suspend, e.g., if a keyboard is depressed between system
device suspend phase and device noirq suspend phase, the keyboard
ISR will be called and both keyboard depress and release interrupts
will be disabled, then keyboard will no longer be able to wake up
system. Another scenario would be, if a keyboard is kept depressed,
and then system goes into suspend, the expected behavior would be
when keyboard is released, system will be waked up, but current
implementation can NOT achieve that, because both depress and release
interrupts are disabled in ISR, and the event check is still in
progress.

To fix these issues, need to make sure keyboard's depress or release
interrupt is enabled after noirq device suspend phase, this patch
moves the suspend/resume callback to noirq suspend/resume phase, and
enable the corresponding interrupt according to current keyboard status.

Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/input/keyboard/imx_keypad.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c
index 2165f3dd328b..842c0235471d 100644
--- a/drivers/input/keyboard/imx_keypad.c
+++ b/drivers/input/keyboard/imx_keypad.c
@@ -530,11 +530,12 @@ static int imx_keypad_probe(struct platform_device *pdev)
 	return 0;
 }
 
-static int __maybe_unused imx_kbd_suspend(struct device *dev)
+static int __maybe_unused imx_kbd_noirq_suspend(struct device *dev)
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct imx_keypad *kbd = platform_get_drvdata(pdev);
 	struct input_dev *input_dev = kbd->input_dev;
+	unsigned short reg_val = readw(kbd->mmio_base + KPSR);
 
 	/* imx kbd can wake up system even clock is disabled */
 	mutex_lock(&input_dev->mutex);
@@ -544,13 +545,20 @@ static int __maybe_unused imx_kbd_suspend(struct device *dev)
 
 	mutex_unlock(&input_dev->mutex);
 
-	if (device_may_wakeup(&pdev->dev))
+	if (device_may_wakeup(&pdev->dev)) {
+		if (reg_val & KBD_STAT_KPKD)
+			reg_val |= KBD_STAT_KRIE;
+		if (reg_val & KBD_STAT_KPKR)
+			reg_val |= KBD_STAT_KDIE;
+		writew(reg_val, kbd->mmio_base + KPSR);
+
 		enable_irq_wake(kbd->irq);
+	}
 
 	return 0;
 }
 
-static int __maybe_unused imx_kbd_resume(struct device *dev)
+static int __maybe_unused imx_kbd_noirq_resume(struct device *dev)
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct imx_keypad *kbd = platform_get_drvdata(pdev);
@@ -574,7 +582,9 @@ static int __maybe_unused imx_kbd_resume(struct device *dev)
 	return ret;
 }
 
-static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume);
+static const struct dev_pm_ops imx_kbd_pm_ops = {
+	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_kbd_noirq_suspend, imx_kbd_noirq_resume)
+};
 
 static struct platform_driver imx_keypad_driver = {
 	.driver		= {
-- 
2.20.1


  parent reply	other threads:[~2019-06-27  0:46 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-27  0:38 [PATCH AUTOSEL 4.14 01/35] Input: elantech - enable middle button support on 2 ThinkPads Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 02/35] samples, bpf: fix to change the buffer size for read() Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 03/35] bpf: sockmap, fix use after free from sleep in psock backlog workqueue Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 04/35] staging:iio:ad7150: fix threshold mode config bit Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 05/35] mac80211: mesh: fix RCU warning Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 06/35] mac80211: free peer keys before vif down in mesh Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 07/35] mwifiex: Fix possible buffer overflows at parsing bss descriptor Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 08/35] mwifiex: Abort at too short BSS descriptor element Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 09/35] iwlwifi: Fix double-free problems in iwl_req_fw_callback() Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 10/35] bpf: udp: Avoid calling reuseport's bpf_prog from udp_gro Sasha Levin
2019-06-27  0:38 ` [PATCH AUTOSEL 4.14 11/35] netfilter: ipv6: nf_defrag: fix leakage of unqueued fragments Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 12/35] netfilter: ipv6: nf_defrag: accept duplicate fragments again Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 13/35] dt-bindings: can: mcp251x: add mcp25625 support Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 14/35] can: mcp251x: add support for mcp25625 Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 15/35] can: m_can: implement errata "Needless activation of MRAF irq" Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 16/35] can: af_can: Fix error path of can_init() Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 17/35] ibmvnic: Refresh device multicast list after reset Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 18/35] ARM: dts: am335x phytec boards: Fix cd-gpios active level Sasha Levin
2019-06-27  0:39 ` Sasha Levin [this message]
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 20/35] KVM: arm/arm64: vgic: Fix kvm_device leak in vgic_its_destroy Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 21/35] mlxsw: spectrum: Disallow prio-tagged packets when PVID is removed Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 22/35] ARM: davinci: da850-evm: call regulator_has_full_constraints() Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 23/35] ARM: davinci: da8xx: specify dma_coherent_mask for lcdc Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 24/35] mac80211: only warn once on chanctx_conf being NULL Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 25/35] qmi_wwan: add support for QMAP padding in the RX path Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 26/35] qmi_wwan: avoid RCU stalls on device disconnect when in QMAP mode Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 27/35] qmi_wwan: extend permitted QMAP mux_id value range Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 28/35] md: fix for divide error in status_resync Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 29/35] bnx2x: Check if transceiver implements DDM before access Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 30/35] drm: return -EFAULT if copy_to_user() fails Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 31/35] ip6_tunnel: allow not to count pkts on tstats by passing dev as NULL Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 32/35] net: lio_core: fix potential sign-extension overflow on large shift Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 33/35] quota: fix a problem about transfer quota Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 34/35] net: dsa: mv88e6xxx: fix shift of FID bits in mv88e6185_g1_vtu_loadpurge() Sasha Levin
2019-06-27  0:39 ` [PATCH AUTOSEL 4.14 35/35] net :sunrpc :clnt :Fix xps refcount imbalance on the error path Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190627003925.21330-19-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=anson.huang@nxp.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).