mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
Input: clear inhibited flag before re-opening device on uninhibit
When uninhibiting a device, we previously called dev->open() and started
the poller before clearing dev->inhibited. Since drivers (like
gpio_keys) often report initial state during open(), and pollers report
events immediately upon starting, these initial events were dropped by
input_get_disposition() because dev->inhibited was still true.
Fix this by clearing dev->inhibited before calling dev->open(), ensuring
initial events are delivered to handlers, and restoring dev->inhibited =
true if dev->open() fails.
Fixes: a181616487 ("Input: Add "inhibited" property")
Assisted-by: Antigravity:gemini-3.5-flash
Link: https://patch.msgid.link/20260803005210.1251102-2-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
35f0a0dced
commit
34135f0540
|
|
@ -1813,24 +1813,26 @@ static int input_uninhibit_device(struct input_dev *dev)
|
|||
if (!dev->inhibited)
|
||||
return 0;
|
||||
|
||||
dev->inhibited = false;
|
||||
|
||||
if (dev->users) {
|
||||
if (dev->open) {
|
||||
error = dev->open(dev);
|
||||
if (error)
|
||||
if (error) {
|
||||
dev->inhibited = true;
|
||||
return error;
|
||||
}
|
||||
}
|
||||
scoped_guard(spinlock_irq, &dev->event_lock)
|
||||
dev->ready = true;
|
||||
|
||||
if (dev->poller)
|
||||
input_dev_poller_start(dev->poller);
|
||||
}
|
||||
|
||||
dev->inhibited = false;
|
||||
|
||||
scoped_guard(spinlock_irq, &dev->event_lock)
|
||||
input_dev_toggle(dev, true);
|
||||
|
||||
if (dev->users && dev->poller)
|
||||
input_dev_poller_start(dev->poller);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user