diff mbox

input: add a input_dev_reset callback

Message ID 1309325122.2601.3.camel@ymzhang (mailing list archive)
State New, archived
Headers show

Commit Message

Yanmin Zhang June 29, 2011, 5:25 a.m. UTC
From: Yanmin Zhang <yanmin_zhang@linux.intel.com>
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 <yanmin_zhang@linux.intel.com>

---



--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

--- 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: */