[PATCH] input: add a input_dev_reset callback

STALE5526d

3 messages, 2 authors, 2011-06-29 · open the first message on its own page

[PATCH] input: add a input_dev_reset callback

From: Yanmin Zhang <hidden>
Date: 2011-06-29 05:25:53

From: Yanmin Zhang <redacted>
Date: Tue, 28 Jun 2011 10:48:03 +0800
Subject: [PATCH] input: add a input_dev_reset callback

input_polled_dev starts a worker if it's opened. During
suspend-2-ram, kernel need cancel the worker and restart it
after resuming.

We add a new callback, input_dev_reset, into input_dev.
input_dev's suspend/resume callbacks would call it to notify
input_polled_dev.

Patch is against 3.0-rc3.

Signed-off-by: Yanmin Zhang <redacted>

---
--- linux-3.0-rc3/drivers/input/input.c	2011-06-14 06:29:59.000000000 +0800
+++ linux-3.0-rc3_new/drivers/input/input.c	2011-06-28 13:12:35.000000000 +0800
@@ -1587,6 +1587,13 @@ EXPORT_SYMBOL(input_reset_device);
 static int input_dev_suspend(struct device *dev)
 {
 	struct input_dev *input_dev = to_input_dev(dev);
+	int ret;
+
+	if (input_dev->input_dev_reset) {
+		ret = input_dev->input_dev_reset(input_dev, false);
+		if (ret)
+			return ret;
+	}
 
 	mutex_lock(&input_dev->mutex);
 
@@ -1601,10 +1608,14 @@ static int input_dev_suspend(struct devi
 static int input_dev_resume(struct device *dev)
 {
 	struct input_dev *input_dev = to_input_dev(dev);
+	int ret = 0;
 
 	input_reset_device(input_dev);
 
-	return 0;
+	if (input_dev->input_dev_reset)
+		ret = input_dev->input_dev_reset(input_dev, true);
+
+	return ret;
 }
 
 static const struct dev_pm_ops input_dev_pm_ops = {
--- linux-3.0-rc3/drivers/input/input-polldev.c	2011-06-14 06:29:59.000000000 +0800
+++ linux-3.0-rc3_new/drivers/input/input-polldev.c	2011-06-28 13:14:54.000000000 +0800
@@ -52,6 +52,7 @@ static int input_open_polled_device(stru
 	if (dev->poll_interval > 0)
 		queue_delayed_work(system_freezable_wq, &dev->work, 0);
 
+	dev->opened = 1;
 	return 0;
 }
 
@@ -63,6 +64,24 @@ static void input_close_polled_device(st
 
 	if (dev->close)
 		dev->close(dev);
+
+	dev->opened = 0;
+}
+
+static int input_polled_dev_reset(struct input_dev *input, bool activate)
+{
+	struct input_polled_dev *dev = input_get_drvdata(input);
+
+	if (!dev->opened)
+		return 0;
+
+	if (activate) {
+		/* Only start polling if polling is enabled */
+		if (dev->poll_interval > 0)
+			queue_delayed_work(system_freezable_wq, &dev->work, 0);
+	} else
+		cancel_delayed_work_sync(&dev->work);
+	return 0;
 }
 
 /* SYSFS interface */
@@ -205,6 +224,7 @@ int input_register_polled_device(struct
 		dev->poll_interval_max = dev->poll_interval;
 	input->open = input_open_polled_device;
 	input->close = input_close_polled_device;
+	input->input_dev_reset = input_polled_dev_reset;
 
 	error = input_register_device(input);
 	if (error)
--- linux-3.0-rc3/include/linux/input.h	2011-06-14 06:29:59.000000000 +0800
+++ linux-3.0-rc3_new/include/linux/input.h	2011-06-28 11:12:10.000000000 +0800
@@ -1269,6 +1269,7 @@ struct input_dev {
 	void (*close)(struct input_dev *dev);
 	int (*flush)(struct input_dev *dev, struct file *file);
 	int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
+	int (*input_dev_reset)(struct input_dev *dev, bool activate);
 
 	struct input_handle __rcu *grab;
 
--- linux-3.0-rc3/include/linux/input-polldev.h	2011-06-14 06:29:59.000000000 +0800
+++ linux-3.0-rc3_new/include/linux/input-polldev.h	2011-06-28 11:12:10.000000000 +0800
@@ -44,6 +44,8 @@ struct input_polled_dev {
 	unsigned int poll_interval_max; /* msec */
 	unsigned int poll_interval_min; /* msec */
 
+	int opened;
+
 	struct input_dev *input;
 
 /* private: */

Re: [PATCH] input: add a input_dev_reset callback

From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2011-06-29 07:09:35

Hi Yanmin,

On Wed, Jun 29, 2011 at 01:25:22PM +0800, Yanmin Zhang wrote:
From: Yanmin Zhang <redacted>
Date: Tue, 28 Jun 2011 10:48:03 +0800
Subject: [PATCH] input: add a input_dev_reset callback

input_polled_dev starts a worker if it's opened. During
suspend-2-ram, kernel need cancel the worker and restart it
after resuming.
I do not believe that there is an issue. Polled device implementation
uses freezable workqueue to ensure that work is not being executed
during system sleep transition. The work should restart automatically
when workqueue it thawed.

Thanks.

-- 
Dmitry

Re: [PATCH] input: add a input_dev_reset callback

From: Yanmin Zhang <hidden>
Date: 2011-06-29 07:49:25

On Wed, 2011-06-29 at 00:09 -0700, Dmitry Torokhov wrote:
Hi Yanmin,

On Wed, Jun 29, 2011 at 01:25:22PM +0800, Yanmin Zhang wrote:
quoted
From: Yanmin Zhang <redacted>
Date: Tue, 28 Jun 2011 10:48:03 +0800
Subject: [PATCH] input: add a input_dev_reset callback

input_polled_dev starts a worker if it's opened. During
suspend-2-ram, kernel need cancel the worker and restart it
after resuming.
I do not believe that there is an issue. Polled device implementation
uses freezable workqueue to ensure that work is not being executed
during system sleep transition. The work should restart automatically
when workqueue it thawed.
Nice! I forgot it. I hit it with kernel 2.6.35 and ported my patch to
the latest kernel.

Thanks,
Yanmin

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help