From: Yanmin Zhang <yanmin_zhang@linux.intel.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: linux-input@vger.kernel.orglinux-input@vger.kernel.org
Subject: [PATCH] input: add a input_dev_reset callback
Date: Wed, 29 Jun 2011 13:25:22 +0800 [thread overview]
Message-ID: <1309325122.2601.3.camel@ymzhang> (raw)
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>
---
--- 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: */
next reply other threads:[~2011-06-29 5:25 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-29 5:25 Yanmin Zhang [this message]
2011-06-29 7:09 ` [PATCH] input: add a input_dev_reset callback Dmitry Torokhov
2011-06-29 7:48 ` Yanmin Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1309325122.2601.3.camel@ymzhang \
--to=yanmin_zhang@linux.intel.com \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.orglinux-input \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox