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:
Dmitry Torokhov 2026-08-02 17:52:02 -07:00
parent 35f0a0dced
commit 34135f0540

View File

@ -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;
}