summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
authorRobert Collins <rcollins@nvidia.com>2011-10-20 14:59:48 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:50:12 -0800
commitd2e547ccf224251097502a7edcafbbc4199f54aa (patch)
tree8977b3159b947697fb2011bed085a3a32b685e42 /drivers/input/touchscreen
parent9142901aa27a58a5c492f0f7428b65056fd377ab (diff)
input: touch: atmel_mxt_ts: Disable TS power during LP0.
In order to save system power, we should cut the power to the touchscreen controller. Older versions of our TS driver did this. This feature was accidentally removed during a recent driver update. Bug 891979 Change-Id: I4bf9333832af65c00b8b10cc8191f4d26aad04e4 Reviewed-on: http://git-master/r/65005 Reviewed-by: Robert Collins <rcollins@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com> Rebase-Id: R370b26e990a5f129ea0f8e73e9b7178bd85b79e5
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c60
1 files changed, 21 insertions, 39 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 89ffc1225405..97ef64f7533e 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -182,6 +182,10 @@
#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
+
/* Define for MXT_GEN_COMMAND_T6 */
#define MXT_BOOT_VALUE 0xa5
#define MXT_BACKUP_VALUE 0x55
@@ -192,7 +196,6 @@
#define MXT_RESET_TIME 200 /* msec */
#define MXT_RESET_NOCHGREAD 400 /* msec */
-#define MXT_RESET_TIME 200 /* msec */
#define MXT_WAKEUP_TIME 25 /* msec */
#define MXT_FWRESET_TIME 175 /* msec */
@@ -895,8 +898,6 @@ static int mxt_set_power_cfg(struct mxt_data *data, u8 sleep)
dev_dbg(dev, "%s: Set ACTV %d, IDLE %d", __func__,
actv_cycle_time, idle_cycle_time);
- data->is_stopped = sleep;
-
return 0;
i2c_error:
@@ -1392,13 +1393,17 @@ static void mxt_start(struct mxt_data *data)
int error;
struct device *dev = &data->client->dev;
+ dev_info(dev, "mxt_start: is_stopped = %d\n", data->is_stopped);
if (data->is_stopped == 0)
return;
- error = mxt_set_power_cfg(data, 0);
+ /* Touch enable */
+ error = mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, MXT_TOUCH_ENABLE);
if (!error)
- dev_dbg(dev, "MXT started\n");
+ dev_info(dev, "MXT started\n");
+
+ data->is_stopped = 0;
}
static void mxt_stop(struct mxt_data *data)
@@ -1406,13 +1411,17 @@ static void mxt_stop(struct mxt_data *data)
int error;
struct device *dev = &data->client->dev;
+ dev_info(dev, "mxt_stop: is_stopped = %d\n", data->is_stopped);
if (data->is_stopped)
return;
- error = mxt_set_power_cfg(data, 1);
+ /* Touch disable */
+ error = mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, MXT_TOUCH_DISABLE);
if (!error)
- dev_dbg(dev, "MXT suspended\n");
+ dev_info(dev, "MXT suspended\n");
+
+ data->is_stopped = 1;
}
static int mxt_input_open(struct input_dev *dev)
@@ -1583,13 +1592,11 @@ static int mxt_resume(struct device *dev)
struct i2c_client *client = to_i2c_client(dev);
struct mxt_data *data = i2c_get_clientdata(client);
struct input_dev *input_dev = data->input_dev;
- struct mxt_message message;
- struct mxt_object *object;
- int id;
- int max_retry = RESUME_READS; /* Set max retry default value */
- u8 reportid;
- u8 max_reportid;
- u8 min_reportid;
+
+ /* Soft reset */
+ mxt_write_object(data, MXT_GEN_COMMAND_T6, MXT_COMMAND_RESET, 1);
+
+ msleep(MXT_RESET_TIME);
mutex_lock(&input_dev->mutex);
@@ -1598,31 +1605,6 @@ static int mxt_resume(struct device *dev)
mutex_unlock(&input_dev->mutex);
- do {
- if (mxt_read_message(data, &message)) {
- dev_err(dev, "Failed to read message\n");
- goto end;
- }
- reportid = message.reportid;
-
- /* whether reportid is thing of MXT_TOUCH_MULTI */
- object = mxt_get_object(data, MXT_TOUCH_MULTI_T9);
- if (!object)
- goto end;
-
- max_reportid = object->max_reportid;
- min_reportid = max_reportid - object->num_report_ids + 1;
- id = reportid - min_reportid;
-
- if (reportid >= min_reportid && reportid <= max_reportid)
- mxt_input_touchevent(data, &message, id);
- else
- mxt_dump_message(dev, &message);
- } while (reportid != MXT_RPTID_NOMSG && --max_retry);
- if (!max_retry)
- dev_info(dev, "Read %d messages at resume(), and there's still more!\n", RESUME_READS);
-
-end:
return 0;
}