summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorRobert Collins <rcollins@nvidia.com>2012-08-22 10:02:51 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:38:43 -0700
commitcc125b9c9b516a934ca01ee876fa7f005f14b92f (patch)
treeb9fb2973de6d7ac4f571dabb61acff7e224e79d3 /drivers/input/touchscreen/atmel_mxt_ts.c
parent650c08e6287c2c73c629c9e9e76beaac2496b9b9 (diff)
input: touch: atmel_mxt_ts: Reduce power during LP0.
Maximum power saving is observed by disabling multiple touchscreen objects. Objects must be saved going into LP0, and restored in reverse order upon resuming from LP0. Bug 919435 Change-Id: I660c019a22e08a8e813cc7ceaa7018e6ffc4d966 Reviewed-on: http://git-master/r/88458 Signed-off-by: Robert Collins <rcollins@nvidia.com> Reviewed-on: http://git-master/r/131495 Reviewed-by: Dan Willemsen <dwillemsen@nvidia.com> Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Xiaohui Tao <xtao@nvidia.com> Tested-by: Xiaohui Tao <xtao@nvidia.com> Rebase-Id: Rc8690710bc6ab80c95525468541b6b8c1052f384
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c77
1 files changed, 55 insertions, 22 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 765b385dfdeb..62665539500d 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -182,6 +182,16 @@
#define MXT_VOLTAGE_DEFAULT 2700000
#define MXT_VOLTAGE_STEP 10000
+/* Defines for Suspend/Resume */
+#define MXT_SUSPEND_STATIC 0
+#define MXT_SUSPEND_DYNAMIC 1
+#define MXT_T7_IDLEACQ_DISABLE 0
+#define MXT_T7_ACTVACQ_DISABLE 0
+#define MXT_T7_ACTV2IDLE_DISABLE 0
+#define MXT_T9_DISABLE 0
+#define MXT_T9_ENABLE 0x83
+#define MXT_T22_DISABLE 0
+
/* Define for MXT_GEN_COMMAND_T6 */
#define MXT_BOOT_VALUE 0xa5
#define MXT_RESET_VALUE 0x01
@@ -292,6 +302,15 @@ struct mxt_object {
enum mxt_device_state { INIT, APPMODE, BOOTLOADER, FAILED, SHUTDOWN };
+/* This structure is used to save/restore values during suspend/resume */
+struct mxt_suspend {
+ u8 suspend_obj;
+ u8 suspend_reg;
+ u8 suspend_val;
+ u8 suspend_flags;
+ u8 restore_val;
+};
+
/* Each client has this additional data */
struct mxt_data {
struct i2c_client *client;
@@ -349,6 +368,19 @@ struct mxt_data {
u8 T63_reportid_max;
};
+static struct mxt_suspend mxt_save[] = {
+ {MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL,
+ MXT_T9_DISABLE, MXT_SUSPEND_DYNAMIC, 0},
+ {MXT_PROCG_NOISE_T22, MXT_NOISE_CTRL,
+ MXT_T22_DISABLE, MXT_SUSPEND_DYNAMIC, 0},
+ {MXT_GEN_POWER_T7, MXT_POWER_IDLEACQINT,
+ MXT_T7_IDLEACQ_DISABLE, MXT_SUSPEND_DYNAMIC, 0},
+ {MXT_GEN_POWER_T7, MXT_POWER_ACTVACQINT,
+ MXT_T7_ACTVACQ_DISABLE, MXT_SUSPEND_DYNAMIC, 0},
+ {MXT_GEN_POWER_T7, MXT_POWER_ACTV2IDLETO,
+ MXT_T7_ACTV2IDLE_DISABLE, MXT_SUSPEND_DYNAMIC, 0}
+};
+
/* I2C slave address pairs */
struct mxt_i2c_address_pair {
u8 bootloader;
@@ -1398,10 +1430,8 @@ release:
static int mxt_set_power_cfg(struct mxt_data *data, u8 mode)
{
struct device *dev = &data->client->dev;
- int error;
- u8 actv_cycle_time;
- u8 idle_cycle_time;
- u8 actv2idle_timeout = data->actv2idle_timeout;
+ int error = 0;
+ int i, cnt;
if (data->state != APPMODE) {
dev_err(dev, "Not in APPMODE\n");
@@ -1410,33 +1440,36 @@ static int mxt_set_power_cfg(struct mxt_data *data, u8 mode)
switch (mode) {
case MXT_POWER_CFG_DEEPSLEEP:
- actv_cycle_time = 0;
- idle_cycle_time = 0;
+ /* Touch disable */
+ cnt = ARRAY_SIZE(mxt_save);
+ for (i = 0; i < cnt; i++) {
+ if (mxt_save[i].suspend_flags == MXT_SUSPEND_DYNAMIC)
+ error |= mxt_read_object(data,
+ mxt_save[i].suspend_obj,
+ mxt_save[i].suspend_reg,
+ &mxt_save[i].restore_val);
+ error |= mxt_write_object(data,
+ mxt_save[i].suspend_obj,
+ mxt_save[i].suspend_reg,
+ mxt_save[i].suspend_val);
+ }
break;
+
case MXT_POWER_CFG_RUN:
default:
- actv_cycle_time = data->actv_cycle_time;
- idle_cycle_time = data->idle_cycle_time;
+ /* Touch enable */
+ cnt = ARRAY_SIZE(mxt_save);
+ while (cnt--)
+ error |= mxt_write_object(data,
+ mxt_save[cnt].suspend_obj,
+ mxt_save[cnt].suspend_reg,
+ mxt_save[cnt].restore_val);
break;
}
- error = mxt_write_object(data, MXT_GEN_POWER_T7, MXT_POWER_ACTVACQINT,
- actv_cycle_time);
- if (error)
- goto i2c_error;
-
- error = mxt_write_object(data, MXT_GEN_POWER_T7, MXT_POWER_IDLEACQINT,
- idle_cycle_time);
if (error)
goto i2c_error;
- error = mxt_write_object(data, MXT_GEN_POWER_T7, MXT_POWER_ACTV2IDLETO,
- actv2idle_timeout);
- if (error)
- goto i2c_error;
-
- dev_dbg(dev, "Set ACTV %d, IDLE %d\n", actv_cycle_time, idle_cycle_time);
-
data->is_stopped = (mode == MXT_POWER_CFG_DEEPSLEEP) ? 1 : 0;
return 0;