From 7acbc994e9039e0361bda97375a60289c48f8e78 Mon Sep 17 00:00:00 2001 From: Benson Leung Date: Fri, 18 Jan 2013 17:35:19 -0800 Subject: [PATCH] CHROMIUM: Input: atmel_mxt_ts : On Tpads, enable T42, disable T19 on suspend 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 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 Reviewed-by: Vincent Palatin Commit-Queue: Benson Leung Tested-by: Benson Leung (cherry picked from commit 6988c8d813d863007df2ba3f418172d07b63ece6) Change-Id: I5e56d3846b491cb292e0fc00905048c2726bf412 Reviewed-on: https://gerrit.chromium.org/gerrit/41685 Reviewed-by: Vincent Palatin Commit-Queue: Benson Leung Tested-by: Benson Leung --- drivers/input/touchscreen/atmel_mxt_ts.c | 63 ++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 9362bd39fce03..639c48687b790 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -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, -- 2.39.5