]> xenbits.xensource.com Git - people/aperard/linux-chromebook.git/commitdiff
CHROMIUM: Input: atmel_mxt_ts : On Tpads, enable T42, disable T19 on suspend
authorBenson Leung <bleung@chromium.org>
Sat, 19 Jan 2013 01:35:19 +0000 (17:35 -0800)
committerBenson Leung <bleung@chromium.org>
Tue, 22 Jan 2013 17:49:10 +0000 (09:49 -0800)
To work around an issue where an idle-suspended system may wake
unnecessarily when the lid is closed because the B panel comes close to
the trackpad, enable touch suppression (t42) when suspending. Also
disable T19, for the button, to allow the button to be pressed if
the case is flexed without the system waking.

Signed-off-by: Benson Leung <bleung@chromium.org>
BUG=chrome-os-partner:17336
TEST=1. Suspend the system with powerd_suspend with lid open.
2. Touch the touchpad. Make sure the system still wakes.
3. Suspend again with powerd_suspend
4. Close the lid. Ensure the system does not wake by observing the system
status light.

Reviewed-on: https://gerrit.chromium.org/gerrit/41678
Reviewed-by: Puneet Kumar <puneetster@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Commit-Queue: Benson Leung <bleung@chromium.org>
Tested-by: Benson Leung <bleung@chromium.org>
(cherry picked from commit 6988c8d813d863007df2ba3f418172d07b63ece6)

Change-Id: I5e56d3846b491cb292e0fc00905048c2726bf412
Reviewed-on: https://gerrit.chromium.org/gerrit/41685
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Commit-Queue: Benson Leung <bleung@chromium.org>
Tested-by: Benson Leung <bleung@chromium.org>
drivers/input/touchscreen/atmel_mxt_ts.c

index 9362bd39fce0383571ce2a2d3f96c2c519eb006c..639c48687b7906942bbaa6876583c706eb4eab6c 100644 (file)
@@ -353,6 +353,15 @@ struct mxt_data {
        u8 T9_ctrl;
        bool T9_ctrl_valid;
 
+
+       /* Saved T42 Touch Suppression field */
+       u8 T42_ctrl;
+       bool T42_ctrl_valid;
+
+       /* Saved T19 GPIO config */
+       u8 T19_ctrl;
+       bool T19_ctrl_valid;
+
        /* per-instance debugfs root */
        struct dentry *dentry_dev;
        struct dentry *dentry_deltas;
@@ -2802,6 +2811,44 @@ static int mxt_suspend(struct device *dev)
                dev_err(dev, "Save T9 ctrl config failed, %d\n", ret);
        data->T9_ctrl_valid = (ret == 0);
 
+       /*
+        *  For tpads, save T42 and T19 ctrl registers if may wakeup,
+        *  enable large object suppression, and disable button wake.
+        *  This will prevent a lid close from acting as a wake source.
+        */
+       if (data->is_tp && device_may_wakeup(dev)) {
+               u8 T42_sleep = 0x01;
+               u8 T19_sleep = 0x00;
+
+               ret = mxt_save_regs(data, MXT_PROCI_TOUCHSUPPRESSION_T42, 0, 0,
+                                   &data->T42_ctrl, 1);
+               if (ret)
+                       dev_err(dev, "Save T42 ctrl config failed, %d\n", ret);
+               data->T42_ctrl_valid = (ret == 0);
+
+               ret = mxt_save_regs(data, MXT_SPT_GPIOPWM_T19, 0, 0,
+                                   &data->T19_ctrl, 1);
+               if (ret)
+                       dev_err(dev, "Save T19 ctrl config failed, %d\n", ret);
+               data->T19_ctrl_valid = (ret == 0);
+
+
+               /* Enable Large Object Suppression */
+               ret = mxt_set_regs(data, MXT_PROCI_TOUCHSUPPRESSION_T42, 0, 0,
+                                  &T42_sleep, 1);
+               if (ret)
+                       dev_err(dev, "Set T42 ctrl failed, %d\n", ret);
+
+               /* Disable Touchpad Button via GPIO */
+               ret = mxt_set_regs(data, MXT_SPT_GPIOPWM_T19, 0, 0,
+                                  &T19_sleep, 1);
+               if (ret)
+                       dev_err(dev, "Set T19 ctrl failed, %d\n", ret);
+
+       } else {
+               data->T42_ctrl_valid = data->T19_ctrl_valid = false;
+       }
+
        if (device_may_wakeup(dev)) {
                /* If we allow wakeup from touch, we have to enable T9 so
                 * that IRQ can be generated from touch
@@ -2859,6 +2906,22 @@ static int mxt_resume(struct device *dev)
                        dev_err(dev, "Set T7 power config failed, %d\n", ret);
        }
 
+       /* Restore the T42 ctrl to before-suspend value */
+       if (data->T42_ctrl_valid) {
+               ret = mxt_set_regs(data, MXT_PROCI_TOUCHSUPPRESSION_T42, 0, 0,
+                                  &data->T42_ctrl, 1);
+               if (ret)
+                       dev_err(dev, "Set T42 ctrl failed, %d\n", ret);
+       }
+
+       /* Restore the T19 ctrl to before-suspend value */
+       if (data->T19_ctrl_valid) {
+               ret = mxt_set_regs(data, MXT_SPT_GPIOPWM_T19, 0, 0,
+                                  &data->T19_ctrl, 1);
+               if (ret)
+                       dev_err(dev, "Set T19 ctrl failed, %d\n", ret);
+       }
+
        if (!device_may_wakeup(dev)) {
                /* Recalibration in case of environment change */
                ret = mxt_write_object(data, MXT_GEN_COMMAND_T6, 0,