summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2026-08-02 17:52:02 -0700
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2026-08-05 23:01:44 -0700
commit34135f0540b480d63d76f9ca82c032a92e1f7fa6 (patch)
tree6e494111f5cad6570d919232d7201a9aa8003cc5 /drivers/input
parent35f0a0dceddce3a6008a24716bd02766e511ae49 (diff)
downloadlinux-34135f0540b480d63d76f9ca82c032a92e1f7fa6.tar.gz
linux-34135f0540b480d63d76f9ca82c032a92e1f7fa6.zip
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: a181616487db ("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>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/input.c14
1 files 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;
}