mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 21:57:43 +00:00
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>
This commit is contained in:
parent
0b65118e6b
commit
be8fc023ef
1 changed files with 11 additions and 0 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue