diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2026-08-02 17:52:02 -0700 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2026-08-05 23:01:44 -0700 |
| commit | 34135f0540b480d63d76f9ca82c032a92e1f7fa6 (patch) | |
| tree | 6e494111f5cad6570d919232d7201a9aa8003cc5 /drivers/input | |
| parent | 35f0a0dceddce3a6008a24716bd02766e511ae49 (diff) | |
| download | linux-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.c | 14 |
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; } |
