mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
Input: introduce notion of passive observers for input handlers
Sometimes it is useful to observe (and maybe modify) data coming from an input device, but only do that if there are other users of such input device. An example is touchpad switching functionality on Lenovo IdeaPad Z570 where it is desirable to suppress events coming from the touchpad if user toggles touchpad on/off button (on this laptop the firmware does not stop the device). Introduce notion of passive observers for input handlers to solve this issue. An input handler marked as passive observer behaves exactly like any other input handler or filter, but with one exception: it does not open/start underlying input device when attaching to it. Link: https://lore.kernel.org/r/ZxlEROX7bMo5cbZP@google.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
6b6b40ff05
commit
57a063632d
@ -605,6 +605,9 @@ int input_open_device(struct input_handle *handle)
|
||||
|
||||
handle->open++;
|
||||
|
||||
if (handle->handler->passive_observer)
|
||||
goto out;
|
||||
|
||||
if (dev->users++ || dev->inhibited) {
|
||||
/*
|
||||
* Device is already opened and/or inhibited,
|
||||
@ -668,11 +671,13 @@ void input_close_device(struct input_handle *handle)
|
||||
|
||||
__input_release_device(handle);
|
||||
|
||||
if (!--dev->users && !dev->inhibited) {
|
||||
if (dev->poller)
|
||||
input_dev_poller_stop(dev->poller);
|
||||
if (dev->close)
|
||||
dev->close(dev);
|
||||
if (!handle->handler->passive_observer) {
|
||||
if (!--dev->users && !dev->inhibited) {
|
||||
if (dev->poller)
|
||||
input_dev_poller_stop(dev->poller);
|
||||
if (dev->close)
|
||||
dev->close(dev);
|
||||
}
|
||||
}
|
||||
|
||||
if (!--handle->open) {
|
||||
|
@ -286,6 +286,10 @@ struct input_handle;
|
||||
* @start: starts handler for given handle. This function is called by
|
||||
* input core right after connect() method and also when a process
|
||||
* that "grabbed" a device releases it
|
||||
* @passive_observer: set to %true by drivers only interested in observing
|
||||
* data stream from devices if there are other users present. Such
|
||||
* drivers will not result in starting underlying hardware device
|
||||
* when input_open_device() is called for their handles
|
||||
* @legacy_minors: set to %true by drivers using legacy minor ranges
|
||||
* @minor: beginning of range of 32 legacy minors for devices this driver
|
||||
* can provide
|
||||
@ -321,6 +325,7 @@ struct input_handler {
|
||||
void (*disconnect)(struct input_handle *handle);
|
||||
void (*start)(struct input_handle *handle);
|
||||
|
||||
bool passive_observer;
|
||||
bool legacy_minors;
|
||||
int minor;
|
||||
const char *name;
|
||||
|
Loading…
Reference in New Issue
Block a user