[PATCH 7/8] Input: Block suspend while event queue is not empty.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?=
Date: Tuesday, April 27, 2010 - 9:31 pm

Add an ioctl, EVIOCSSUSPENDBLOCK, to enable a suspend_blocker that will 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@android.com>
---
 drivers/input/evdev.c |   22 ++++++++++++++++++++++
 include/linux/input.h |    3 +++
 2 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index 2ee6c7a..66e0d16 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -20,6 +20,7 @@
 #include <linux/input.h>
 #include <linux/major.h>
 #include <linux/device.h>
+#include <linux/suspend_blocker.h>
 #include "input-compat.h"
 
 struct evdev {
@@ -43,6 +44,8 @@ struct evdev_client {
 	struct fasync_struct *fasync;
 	struct evdev *evdev;
 	struct list_head node;
+	struct suspend_blocker suspend_blocker;
+	bool use_suspend_blocker;
 };
 
 static struct evdev *evdev_table[EVDEV_MINORS];
@@ -55,6 +58,8 @@ static void evdev_pass_event(struct evdev_client *client,
 	 * Interrupts are disabled, just acquire the lock
 	 */
 	spin_lock(&client->buffer_lock);
+	if (client->use_suspend_blocker)
+		suspend_block(&client->suspend_blocker);
 	client->buffer[client->head++] = *event;
 	client->head &= EVDEV_BUFFER_SIZE - 1;
 	spin_unlock(&client->buffer_lock);
@@ -234,6 +239,8 @@ static int evdev_release(struct inode *inode, struct file *file)
 	mutex_unlock(&evdev->mutex);
 
 	evdev_detach_client(evdev, client);
+	if (client->use_suspend_blocker)
+		suspend_blocker_destroy(&client->suspend_blocker);
 	kfree(client);
 
 	evdev_close_device(evdev);
@@ -335,6 +342,8 @@ static int evdev_fetch_next_event(struct evdev_client *client,
 	if (have_event) {
 		*event = client->buffer[client->tail++];
 		client->tail &= EVDEV_BUFFER_SIZE - 1;
+		if (client->use_suspend_blocker && client->head == client->tail)
+			suspend_unblock(&client->suspend_blocker);
 	}
 
 	spin_unlock_irq(&client->buffer_lock);
@@ -585,6 +594,19 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
 		else
 			return evdev_ungrab(evdev, client);
 
+	case EVIOCGSUSPENDBLOCK:
+		return put_user(client->use_suspend_blocker, ip);
+
+	case EVIOCSSUSPENDBLOCK:
+		spin_lock_irq(&client->buffer_lock);
+		if (!client->use_suspend_blocker && p)
+			suspend_blocker_init(&client->suspend_blocker, "evdev");
+		else if (client->use_suspend_blocker && !p)
+			suspend_blocker_destroy(&client->suspend_blocker);
+		client->use_suspend_blocker = !!p;
+		spin_unlock_irq(&client->buffer_lock);
+		return 0;
+
 	default:
 
 		if (_IOC_TYPE(cmd) != 'E')
diff --git a/include/linux/input.h b/include/linux/input.h
index 7ed2251..b2d93b4 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -82,6 +82,9 @@ struct input_absinfo {
 
 #define EVIOCGRAB		_IOW('E', 0x90, int)			/* Grab/Release device */
 
+#define EVIOCGSUSPENDBLOCK	_IOR('E', 0x91, int)			/* get suspend block enable */
+#define EVIOCSSUSPENDBLOCK	_IOW('E', 0x91, int)			/* set suspend block enable */
+
 /*
  * Event types
  */
-- 
1.6.5.1

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/9] Suspend block api (version 5), =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 1/8] PM: Add suspend block api., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 2/8] PM: suspend_block: Add driver to access suspen ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 3/8] PM: suspend_block: Abort task freezing if a su ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 4/8] PM: suspend_block: Add debugfs file, =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 5/8] PM: suspend_block: Add suspend_blocker stats, =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 6/8] PM: Add suspend blocking work., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 7/8] Input: Block suspend while event queue is not ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
[PATCH 8/8] power_supply: Block suspend while power supply ..., =?UTF-8?q?Arve=20Hj= ..., (Tue Apr 27, 9:31 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Pavel Machek, (Tue Apr 27, 11:06 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Pavel Machek, (Tue Apr 27, 11:07 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Tejun Heo, (Tue Apr 27, 11:44 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Arve Hjønnevåg, (Wed Apr 28, 12:02 am)
Re: [PATCH 6/8] PM: Add suspend blocking work., Tejun Heo, (Wed Apr 28, 12:18 am)
Re: [PATCH 6/8] PM: Add suspend blocking work., Oleg Nesterov, (Wed Apr 28, 12:40 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Tejun Heo, (Wed Apr 28, 1:22 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Rafael J. Wysocki, (Wed Apr 28, 1:50 pm)
Re: [PATCH 2/8] PM: suspend_block: Add driver to access su ..., Rafael J. Wysocki, (Wed Apr 28, 1:58 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Wed Apr 28, 2:08 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Wed Apr 28, 2:09 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Arve Hjønnevåg, (Wed Apr 28, 3:09 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Wed Apr 28, 3:19 pm)
Re: [PATCH 2/8] PM: suspend_block: Add driver to access su ..., Rafael J. Wysocki, (Wed Apr 28, 4:05 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Arve Hjønnevåg, (Wed Apr 28, 8:37 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Arve Hjønnevåg, (Wed Apr 28, 8:47 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Oleg Nesterov, (Thu Apr 29, 11:58 am)
[PATCH 2/2] workqueues: export keventd_wq, Oleg Nesterov, (Thu Apr 29, 12:45 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Thu Apr 29, 2:08 pm)
Re: [PATCH 6/8] PM: Add suspend blocking work., Rafael J. Wysocki, (Thu Apr 29, 2:09 pm)
Re: [PATCH 2/8] PM: suspend_block: Add driver to access su ..., Rafael J. Wysocki, (Thu Apr 29, 2:11 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Rafael J. Wysocki, (Thu Apr 29, 2:16 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Tejun Heo, (Thu Apr 29, 9:24 pm)
Re: [PATCH 2/2] workqueues: export keventd_wq, Tejun Heo, (Thu Apr 29, 10:16 pm)
Re: [PATCH 2/2] workqueues: export keventd_wq, Arve Hjønnevåg, (Thu Apr 29, 10:39 pm)
Re: [PATCH 2/2] workqueues: export keventd_wq, Tejun Heo, (Thu Apr 29, 10:52 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Oleg Nesterov, (Fri Apr 30, 10:26 am)
Re: [PATCH 2/2] workqueues: export keventd_wq, Oleg Nesterov, (Fri Apr 30, 11:05 am)
Re: [PATCH 2/2] workqueues: export keventd_wq, Tejun Heo, (Fri Apr 30, 11:11 am)
Re: [PATCH 1/8] PM: Add suspend block api., Tejun Heo, (Thu May 20, 1:30 am)
Re: [PATCH 1/8] PM: Add suspend block api., Rafael J. Wysocki, (Thu May 20, 3:27 pm)
Re: [PATCH 1/8] PM: Add suspend block api., Tejun Heo, (Thu May 20, 11:35 pm)