Hi, On Saturday, January 21, 2012, Arve Hjønnevåg wrote: > Add an ioctl, EVIOCSSUSPENDBLOCK, to block suspend while the event > queue is not empty. This allows userspace code to process input > events while the device appears to be asleep. > > Signed-off-by: Arve Hjønnevåg <arve@xxxxxxxxxxx> Minor nit below. > --- > drivers/input/evdev.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ > include/linux/input.h | 3 ++ > 2 files changed, 66 insertions(+), 0 deletions(-) > > diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c > index 76457d5..e212757 100644 > --- a/drivers/input/evdev.c > +++ b/drivers/input/evdev.c > @@ -43,6 +43,7 @@ struct evdev_client { > unsigned int tail; > unsigned int packet_head; /* [future] position of the first element of next packet */ > spinlock_t buffer_lock; /* protects access to buffer, head and tail */ > + struct wakeup_source *wakeup_source; > struct fasync_struct *fasync; > struct evdev *evdev; > struct list_head node; > @@ -75,10 +76,14 @@ static void evdev_pass_event(struct evdev_client *client, > client->buffer[client->tail].value = 0; > > client->packet_head = client->tail; > + if (client->wakeup_source) > + __pm_relax(client->wakeup_source); > } > > if (event->type == EV_SYN && event->code == SYN_REPORT) { > client->packet_head = client->head; > + if (client->wakeup_source) > + __pm_stay_awake(client->wakeup_source); > kill_fasync(&client->fasync, SIGIO, POLL_IN); > } > > @@ -255,6 +260,10 @@ static int evdev_release(struct inode *inode, struct file *file) > mutex_unlock(&evdev->mutex); > > evdev_detach_client(evdev, client); > + if (client->wakeup_source) { > + __pm_relax(client->wakeup_source); > + wakeup_source_unregister(client->wakeup_source); > + } > kfree(client); > > evdev_close_device(evdev); > @@ -373,6 +382,9 @@ static int evdev_fetch_next_event(struct evdev_client *client, > if (have_event) { > *event = client->buffer[client->tail++]; > client->tail &= client->bufsize - 1; > + if (client->wakeup_source && > + client->packet_head == client->tail) > + __pm_relax(client->wakeup_source); > } Since __pm_relax(), __pm_stay_awake() and wakeup_source_unregister() all check if the argument is not NULL, you can simply drop the client->wakeup_source checks. Also with the fix I've just posted: http://marc.info/?l=linux-pm&m=132934445508717&w=4 I think it won't be necessary to call __pm_relax() before wakeup_source_unregister() any more. Thanks, Rafael -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html