The driver used to skip all initialization code for FocalTech touchpads
because they stop responding when certain commands are sent. The new
driver failed reproduce this behaviour and psmouse_reconnect would still
cause standard initialization code to be executed.

This patch introduces a field "skip_standard_init" to struct psmouse. If
this field is set to true, psmouse_initialize will not do anything. This
solution is somewhat ugly, but I believe it is the least ugly way to
introduce this apparently required special case.

Also, the code is modified to not send PSMOUSE_CMD_ENABLE twice (once in
focaltech.c, once in the generic code in psmouse-base.c).

Signed-off-by: Mathias Gottschlag <[email protected]>
---
 drivers/input/mouse/focaltech.c    | 5 ++---
 drivers/input/mouse/psmouse-base.c | 4 +++-
 drivers/input/mouse/psmouse.h      | 5 +++++
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c
index 5d8cf98..05919cc 100644
--- a/drivers/input/mouse/focaltech.c
+++ b/drivers/input/mouse/focaltech.c
@@ -284,9 +284,6 @@ static int focaltech_switch_protocol(struct psmouse 
*psmouse)
        if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETSCALE11))
                return -EIO;
 
-       if (ps2_command(ps2dev, param, PSMOUSE_CMD_ENABLE))
-               return -EIO;
-
        return 0;
 }
 
@@ -413,6 +410,8 @@ int focaltech_init(struct psmouse *psmouse)
        /* resync is not supported yet */
        psmouse->resync_time = 0;
 
+       psmouse->skip_standard_init = true;
+
        return 0;
 
 fail:
diff --git a/drivers/input/mouse/psmouse-base.c 
b/drivers/input/mouse/psmouse-base.c
index 68469fe..b55a116 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -697,6 +697,8 @@ static void psmouse_apply_defaults(struct psmouse *psmouse)
        psmouse->cleanup = NULL;
        psmouse->pt_activate = NULL;
        psmouse->pt_deactivate = NULL;
+
+       psmouse->skip_standard_init = false;
 }
 
 /*
@@ -1157,7 +1159,7 @@ static void psmouse_initialize(struct psmouse *psmouse)
  * We set the mouse report rate, resolution and scaling.
  */
 
-       if (psmouse_max_proto != PSMOUSE_PS2) {
+       if (psmouse_max_proto != PSMOUSE_PS2 && !psmouse->skip_standard_init) {
                psmouse->set_rate(psmouse, psmouse->rate);
                psmouse->set_resolution(psmouse, psmouse->resolution);
                ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
index c2ff137..d1412ac 100644
--- a/drivers/input/mouse/psmouse.h
+++ b/drivers/input/mouse/psmouse.h
@@ -64,6 +64,11 @@ struct psmouse {
        unsigned int resync_time;
        bool smartscroll;       /* Logitech only */
 
+       /* FocalTech touchpads sometimes stop responding when standard commands
+        * are sent after the custom protocol has been selected, so this flag
+        * makes the code skip psmouse_initialize */
+       bool skip_standard_init;
+
        psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse);
        void (*set_rate)(struct psmouse *psmouse, unsigned int rate);
        void (*set_resolution)(struct psmouse *psmouse, unsigned int 
resolution);
-- 
2.1.0

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

Reply via email to