summaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorDavid Collins <collinsd@codeaurora.org>2022-04-24 18:21:58 -0700
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2022-04-24 18:25:15 -0700
commitbe8fc023ef64dcb11042aaa4bb0f29f7e0335d85 (patch)
treeb277e1e6f94015058c9b595fcecc2c27fdc7dd14 /drivers/input
parent0b65118e6ba3024b8d9330cbca9b4c8b439d2057 (diff)
downloadlinux-be8fc023ef64dcb11042aaa4bb0f29f7e0335d85.tar.bz2
Input: pm8941-pwrkey - simulate missed key press events
The status of the keys connected to the KPDPWR_N and RESIN_N pins is identified by reading corresponding bits in the interrupt real time status register. If the status has changed by the time that the interrupt is handled then a press event will be missed. Maintain a last known status variable to find unbalanced release events and simulate press events for each accordingly. Signed-off-by: David Collins <collinsd@codeaurora.org> Signed-off-by: Anjelique Melendez <quic_amelende@quicinc.com> Link: https://lore.kernel.org/r/20220422191239.6271-6-quic_amelende@quicinc.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/misc/pm8941-pwrkey.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c
index 4ae6d0f6afa3..549df01b6ee3 100644
--- a/drivers/input/misc/pm8941-pwrkey.c
+++ b/drivers/input/misc/pm8941-pwrkey.c
@@ -77,6 +77,7 @@ struct pm8941_pwrkey {
u32 code;
u32 sw_debounce_time_us;
ktime_t sw_debounce_end_time;
+ bool last_status;
const struct pm8941_data *data;
};
@@ -167,6 +168,16 @@ static irqreturn_t pm8941_pwrkey_irq(int irq, void *_data)
pwrkey->sw_debounce_end_time = ktime_add_us(ktime_get(),
pwrkey->sw_debounce_time_us);
+ /*
+ * Simulate a press event in case a release event occurred without a
+ * corresponding press event.
+ */
+ if (!pwrkey->last_status && !sts) {
+ input_report_key(pwrkey->input, pwrkey->code, 1);
+ input_sync(pwrkey->input);
+ }
+ pwrkey->last_status = sts;
+
input_report_key(pwrkey->input, pwrkey->code, sts);
input_sync(pwrkey->input);