diff mbox

[1/2] Input: wacom_w8001 - implement open and close

Message ID 1313957747-22796-1-git-send-email-dmitry.torokhov@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dmitry Torokhov Aug. 21, 2011, 8:15 p.m. UTC
Implement open() and close() methods for the input device so that we
do not start the device unless there are users listening to the events.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
---
 drivers/input/touchscreen/wacom_w8001.c |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

Comments

chris@cnpbagwell.com Aug. 23, 2011, 5:22 p.m. UTC | #1
I don't have one of these to test but anyways:

Acked-by: Chris Bagwell <chris@cnpbagwell.com>

I've been trying to slowing document the protocols for ISDV4 and USB
Wacom devices (http://sourceforge.net/apps/mediawiki/linuxwacom/index.php?title=ISDV4_Protocol
for these ISDV4 ones if your interested).  During this, I was
comparing this version against the user land version of this driver
inside xf86-input-wacom.

xf86-input-wacom was doing a version of this patch so good to see
here.  The only other difference remaining is it also discards any
data on the line during startup to flush old data from after initial
STOP command and so that its sure of command/response sequence.

I do not know the serio well enough to know if it discards old data.
Even if it does not, the driver would handle old motion events OK and
the tiniest possibility an old touch query response on line when it
sends initial pen query.

Chris

On Sun, Aug 21, 2011 at 3:15 PM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
> Implement open() and close() methods for the input device so that we
> do not start the device unless there are users listening to the events.
>
> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
> ---
>  drivers/input/touchscreen/wacom_w8001.c |   21 ++++++++++++++++++++-
>  1 files changed, 20 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c
> index c14412e..5ece6c1 100644
> --- a/drivers/input/touchscreen/wacom_w8001.c
> +++ b/drivers/input/touchscreen/wacom_w8001.c
> @@ -367,6 +367,20 @@ static int w8001_command(struct w8001 *w8001, unsigned char command,
>        return rc;
>  }
>
> +static int w8001_open(struct input_dev *dev)
> +{
> +       struct w8001 *w8001 = input_get_drvdata(dev);
> +
> +       return w8001_command(w8001, W8001_CMD_START, false);
> +}
> +
> +static void w8001_close(struct input_dev *dev)
> +{
> +       struct w8001 *w8001 = input_get_drvdata(dev);
> +
> +       w8001_command(w8001, W8001_CMD_STOP, false);
> +}
> +
>  static int w8001_setup(struct w8001 *w8001)
>  {
>        struct input_dev *dev = w8001->dev;
> @@ -474,7 +488,7 @@ static int w8001_setup(struct w8001 *w8001)
>
>        strlcat(w8001->name, " Touchscreen", sizeof(w8001->name));
>
> -       return w8001_command(w8001, W8001_CMD_START, false);
> +       return 0;
>  }
>
>  /*
> @@ -534,6 +548,11 @@ static int w8001_connect(struct serio *serio, struct serio_driver *drv)
>        input_dev->id.version = 0x0100;
>        input_dev->dev.parent = &serio->dev;
>
> +       input_dev->open = w8001_open;
> +       input_dev->close = w8001_close;
> +
> +       input_set_drvdata(input_dev, w8001);
> +
>        err = input_register_device(w8001->dev);
>        if (err)
>                goto fail3;
> --
> 1.7.6
>
> --
> 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
>
--
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
Dmitry Torokhov Aug. 23, 2011, 5:48 p.m. UTC | #2
On Tue, Aug 23, 2011 at 12:22:06PM -0500, Chris Bagwell wrote:
> I don't have one of these to test but anyways:
> 
> Acked-by: Chris Bagwell <chris@cnpbagwell.com>

Thanks for looking at this. I don't have the hardware either so it would
be nice if someone who has it tried the patches...

> 
> I've been trying to slowing document the protocols for ISDV4 and USB
> Wacom devices (http://sourceforge.net/apps/mediawiki/linuxwacom/index.php?title=ISDV4_Protocol
> for these ISDV4 ones if your interested).  During this, I was
> comparing this version against the user land version of this driver
> inside xf86-input-wacom.
> 
> xf86-input-wacom was doing a version of this patch so good to see
> here.  The only other difference remaining is it also discards any
> data on the line during startup to flush old data from after initial
> STOP command and so that its sure of command/response sequence.

Hmm, I guess it indeed would be a good idea to reset w8001->idx in
w8001_open() to make sure we do not restart with buffer half-filled with
old data...

Thanks.
Ping Cheng Aug. 23, 2011, 9:23 p.m. UTC | #3
On Sun, Aug 21, 2011 at 1:15 PM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
>
> Implement open() and close() methods for the input device so that we
> do not start the device unless there are users listening to the events.
>
> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>


Tested-by: Ping Cheng <pingc@wacom.com> for the series.

I can not tell if the driver doing what it claimed in the commit
comment or not since I didn't trace into the code. As far as my
testing goes, the driver works as it was; it works as usual after
suspend and resume.

Ping

>
> ---
>  drivers/input/touchscreen/wacom_w8001.c |   21 ++++++++++++++++++++-
>  1 files changed, 20 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c
> index c14412e..5ece6c1 100644
> --- a/drivers/input/touchscreen/wacom_w8001.c
> +++ b/drivers/input/touchscreen/wacom_w8001.c
> @@ -367,6 +367,20 @@ static int w8001_command(struct w8001 *w8001, unsigned char command,
>        return rc;
>  }
>
> +static int w8001_open(struct input_dev *dev)
> +{
> +       struct w8001 *w8001 = input_get_drvdata(dev);
> +
> +       return w8001_command(w8001, W8001_CMD_START, false);
> +}
> +
> +static void w8001_close(struct input_dev *dev)
> +{
> +       struct w8001 *w8001 = input_get_drvdata(dev);
> +
> +       w8001_command(w8001, W8001_CMD_STOP, false);
> +}
> +
>  static int w8001_setup(struct w8001 *w8001)
>  {
>        struct input_dev *dev = w8001->dev;
> @@ -474,7 +488,7 @@ static int w8001_setup(struct w8001 *w8001)
>
>        strlcat(w8001->name, " Touchscreen", sizeof(w8001->name));
>
> -       return w8001_command(w8001, W8001_CMD_START, false);
> +       return 0;
>  }
>
>  /*
> @@ -534,6 +548,11 @@ static int w8001_connect(struct serio *serio, struct serio_driver *drv)
>        input_dev->id.version = 0x0100;
>        input_dev->dev.parent = &serio->dev;
>
> +       input_dev->open = w8001_open;
> +       input_dev->close = w8001_close;
> +
> +       input_set_drvdata(input_dev, w8001);
> +
>        err = input_register_device(w8001->dev);
>        if (err)
>                goto fail3;
> --
> 1.7.6
>
--
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
Dmitry Torokhov Aug. 24, 2011, 6:53 a.m. UTC | #4
On Tue, Aug 23, 2011 at 02:21:46PM -0700, Ping Cheng wrote:
> On Sun, Aug 21, 2011 at 1:15 PM, Dmitry Torokhov
> <dmitry.torokhov@gmail.com>wrote:
> 
> > Implement open() and close() methods for the input device so that we
> > do not start the device unless there are users listening to the events.
> >
> > Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
> 
> 
> Tested-by: Ping Cheng <pingc@wacom.com> for the series.
> 
> I can not tell if the driver doing what it claimed in the commit comment or
> not since I didn't trace into the code. As far as my testing goes, the
> driver works as it was; it works as usual after suspend and resume.
> 

Thanks Ping, much appreciated.
diff mbox

Patch

diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c
index c14412e..5ece6c1 100644
--- a/drivers/input/touchscreen/wacom_w8001.c
+++ b/drivers/input/touchscreen/wacom_w8001.c
@@ -367,6 +367,20 @@  static int w8001_command(struct w8001 *w8001, unsigned char command,
 	return rc;
 }
 
+static int w8001_open(struct input_dev *dev)
+{
+	struct w8001 *w8001 = input_get_drvdata(dev);
+
+	return w8001_command(w8001, W8001_CMD_START, false);
+}
+
+static void w8001_close(struct input_dev *dev)
+{
+	struct w8001 *w8001 = input_get_drvdata(dev);
+
+	w8001_command(w8001, W8001_CMD_STOP, false);
+}
+
 static int w8001_setup(struct w8001 *w8001)
 {
 	struct input_dev *dev = w8001->dev;
@@ -474,7 +488,7 @@  static int w8001_setup(struct w8001 *w8001)
 
 	strlcat(w8001->name, " Touchscreen", sizeof(w8001->name));
 
-	return w8001_command(w8001, W8001_CMD_START, false);
+	return 0;
 }
 
 /*
@@ -534,6 +548,11 @@  static int w8001_connect(struct serio *serio, struct serio_driver *drv)
 	input_dev->id.version = 0x0100;
 	input_dev->dev.parent = &serio->dev;
 
+	input_dev->open = w8001_open;
+	input_dev->close = w8001_close;
+
+	input_set_drvdata(input_dev, w8001);
+
 	err = input_register_device(w8001->dev);
 	if (err)
 		goto fail3;