summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
authorRobert Collins <rcollins@nvidia.com>2012-02-01 14:55:40 -0800
committerSimone Willett <swillett@nvidia.com>2012-03-08 15:18:43 -0800
commit5d3206b5e7b439bf5433fa8931656d90d1d09e67 (patch)
tree9cc12f9546adcb588deecb1124e6989559908eba /drivers/input/touchscreen
parent38449f5ab76e7208034b5f4c8c774c3d0c0617be (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: I42799fbb02efd28e4954b53b3d052ad138537ce9 Signed-off-by: Robert Collins <rcollins@nvidia.com> Reviewed-on: http://git-master/r/88458 Reviewed-by: Dan Willemsen <dwillemsen@nvidia.com> Tested-by: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index c7c705547e21..ad21ef9c0105 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -182,9 +182,15 @@
#define MXT_VOLTAGE_DEFAULT 2700000
#define MXT_VOLTAGE_STEP 10000
-/* Defines for MXT_TOUCH_CTRL */
-#define MXT_TOUCH_DISABLE 0
-#define MXT_TOUCH_ENABLE 0x83
+/* 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
@@ -282,6 +288,15 @@ struct mxt_finger {
int pressure;
};
+/* 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;
@@ -316,6 +331,14 @@ struct mxt_data {
u8 slowscan_shad_actv2idle_timeout;
};
+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}
+};
+
#if defined(CONFIG_HAS_EARLYSUSPEND)
static void mxt_early_suspend(struct early_suspend *es);
static void mxt_early_resume(struct early_suspend *es);
@@ -1529,7 +1552,8 @@ static const struct attribute_group mxt_attr_group = {
static void mxt_start(struct mxt_data *data)
{
- int error;
+ int error = 0;
+ int cnt;
struct device *dev = &data->client->dev;
dev_info(dev, "mxt_start: is_stopped = %d\n", data->is_stopped);
@@ -1537,7 +1561,11 @@ static void mxt_start(struct mxt_data *data)
return;
/* Touch enable */
- error = mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, MXT_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);
if (!error)
dev_info(dev, "MXT started\n");
@@ -1547,7 +1575,8 @@ static void mxt_start(struct mxt_data *data)
static void mxt_stop(struct mxt_data *data)
{
- int error;
+ int error = 0;
+ int i, cnt;
struct device *dev = &data->client->dev;
dev_info(dev, "mxt_stop: is_stopped = %d\n", data->is_stopped);
@@ -1555,7 +1584,17 @@ static void mxt_stop(struct mxt_data *data)
return;
/* Touch disable */
- error = mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, MXT_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);
+ }
if (!error)
dev_info(dev, "MXT suspended\n");