summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
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");