[PATCH v2 2/4] Input: clear inhibited flag before re-opening device on uninhibit
Dmitry Torokhov <[email protected]> Sun, 2 Aug 2026 17:52:02 -0700
| Newsgroups | org.kernel.vger.linux-input,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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: a181616487db ("Input: Add "inhibited" property")
Assisted-by: Antigravity:gemini-3.5-flash
Signed-off-by: Dmitry Torokhov <[email protected]>
---
drivers/input/input.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/input/input.c b/drivers/input/input.c
index e57d1023d262..e4f8c2067b84 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -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;
}
--
2.55.0.508.g3f0d502094-goog