summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorRobert Collins <rcollins@nvidia.com>2011-10-19 17:07:52 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:38:42 -0700
commit650c08e6287c2c73c629c9e9e76beaac2496b9b9 (patch)
treeb290a28535c78601bf3fdace02dbd5a6836348e7 /drivers/input/touchscreen/atmel_mxt_ts.c
parent964335ca064216930a412063d3b9ae18c5a528c7 (diff)
input: touch: atmel_mxt_ts: Add SysFS interface to slow down scanning.
Video playback would like to save power by slowing touchscreen scanning. This change adds a SysFS interface to allow the scan rate to be programmed by the video display interface. SysFS location: /sys/devices/platform/tegra-i2c.1/i2c-1/1-005a/slowscan_enable Read functions: cat slowscan_enable (returns current register status) Write functions: 0 - Disable slowscan 1 - Enable slowscan 2 N - Program actv_cycle_time with value of N 3 N - Program idle_cycle_time with value of N 4 N - Program actv2idle timeout with value of N (seconds * 10) Bug 891993 Change-Id: I35f3b83797e3216545d164f6096aeac4d06302b5 Rebase-Id: Re4398871d4964d366f0dbdd856a7953600577dea Reviewed-on: http://git-master/r/65006 Signed-off-by: Robert Collins <rcollins@nvidia.com> Reviewed-on: http://git-master/r/131493 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>
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c166
1 files changed, 161 insertions, 5 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index ed35c1df0718..765b385dfdeb 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -197,6 +197,13 @@
#define MXT_FWRESET_TIME 1000 /* msec */
#define MXT_WAKEUP_TIME 25 /* msec */
+/* Defines for MXT_SLOWSCAN_EXTENSIONS */
+#define SLOSCAN_DISABLE 0 /* Disable slow scan */
+#define SLOSCAN_ENABLE 1 /* Enable slow scan */
+#define SLOSCAN_SET_ACTVACQINT 2 /* Set ACTV scan rate */
+#define SLOSCAN_SET_IDLEACQINT 3 /* Set IDLE scan rate */
+#define SLOSCAN_SET_ACTV2IDLETO 4 /* Set the ACTIVE to IDLE TimeOut */
+
/* Command to unlock bootloader */
#define MXT_UNLOCK_CMD_MSB 0xaa
#define MXT_UNLOCK_CMD_LSB 0xdc
@@ -303,6 +310,7 @@ struct mxt_data {
u8 bootloader_addr;
u8 actv_cycle_time;
u8 idle_cycle_time;
+ u8 actv2idle_timeout;
u8 is_stopped;
u8 max_reportid;
u32 config_crc;
@@ -315,6 +323,15 @@ struct mxt_data {
struct early_suspend early_suspend;
#endif
+ /* Slowscan parameters */
+ int slowscan_enabled;
+ u8 slowscan_actv_cycle_time;
+ u8 slowscan_idle_cycle_time;
+ u8 slowscan_actv2idle_timeout;
+ u8 slowscan_shad_actv_cycle_time;
+ u8 slowscan_shad_idle_cycle_time;
+ u8 slowscan_shad_actv2idle_timeout;
+
/* Cached parameters from object table */
u16 T5_address;
u8 T5_msg_size;
@@ -1384,6 +1401,7 @@ static int mxt_set_power_cfg(struct mxt_data *data, u8 mode)
int error;
u8 actv_cycle_time;
u8 idle_cycle_time;
+ u8 actv2idle_timeout = data->actv2idle_timeout;
if (data->state != APPMODE) {
dev_err(dev, "Not in APPMODE\n");
@@ -1412,6 +1430,11 @@ static int mxt_set_power_cfg(struct mxt_data *data, u8 mode)
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;
@@ -1424,7 +1447,7 @@ i2c_error:
}
static int mxt_read_power_cfg(struct mxt_data *data, u8 *actv_cycle_time,
- u8 *idle_cycle_time)
+ u8 *idle_cycle_time, u8 *actv2idle_timeout)
{
int error;
@@ -1440,6 +1463,12 @@ static int mxt_read_power_cfg(struct mxt_data *data, u8 *actv_cycle_time,
if (error)
return error;
+ error = mxt_read_object(data, MXT_GEN_POWER_T7,
+ MXT_POWER_ACTV2IDLETO,
+ actv2idle_timeout);
+ if (error)
+ return error;
+
return 0;
}
@@ -1449,7 +1478,8 @@ static int mxt_check_power_cfg_post_reset(struct mxt_data *data)
int error;
error = mxt_read_power_cfg(data, &data->actv_cycle_time,
- &data->idle_cycle_time);
+ &data->idle_cycle_time,
+ &data->actv2idle_timeout);
if (error)
return error;
@@ -1471,8 +1501,13 @@ static int mxt_probe_power_cfg(struct mxt_data *data)
{
int error;
+ data->slowscan_actv_cycle_time = 120; /* 120mS */
+ data->slowscan_idle_cycle_time = 10; /* 10mS */
+ data->slowscan_actv2idle_timeout = 100; /* 10 seconds */
+
error = mxt_read_power_cfg(data, &data->actv_cycle_time,
- &data->idle_cycle_time);
+ &data->idle_cycle_time,
+ &data->actv2idle_timeout);
if (error)
return error;
@@ -2089,6 +2124,124 @@ static int mxt_check_mem_access_params(struct mxt_data *data, loff_t off,
return 0;
}
+static ssize_t mxt_slowscan_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct mxt_data *data = dev_get_drvdata(dev);
+ int count = 0;
+ int error;
+ u8 actv_cycle_time;
+ u8 idle_cycle_time;
+ u8 actv2idle_timeout;
+ dev_info(dev, "Calling mxt_slowscan_show()\n");
+
+ error = mxt_read_object(data, MXT_GEN_POWER_T7,
+ MXT_POWER_ACTVACQINT,
+ &actv_cycle_time);
+
+ if (error)
+ return error;
+
+ error = mxt_read_object(data, MXT_GEN_POWER_T7,
+ MXT_POWER_IDLEACQINT,
+ &idle_cycle_time);
+
+ if (error)
+ return error;
+
+ error = mxt_read_object(data, MXT_GEN_POWER_T7,
+ MXT_POWER_ACTV2IDLETO,
+ &actv2idle_timeout);
+
+ if (error)
+ return error;
+
+ count += sprintf(buf + count,
+ "SLOW SCAN (enable/disable) = %s.\n",
+ data->slowscan_enabled ? "enabled" : "disabled");
+ count += sprintf(buf + count,
+ "SLOW SCAN (actv_cycle_time) = %umS.\n",
+ data->slowscan_actv_cycle_time);
+ count += sprintf(buf + count,
+ "SLOW SCAN (idle_cycle_time) = %umS.\n",
+ data->slowscan_idle_cycle_time);
+ count += sprintf(buf + count,
+ "SLOW SCAN (actv2idle_timeout) = %u.%0uS.\n",
+ data->slowscan_actv2idle_timeout / 10,
+ data->slowscan_actv2idle_timeout % 10);
+ count += sprintf(buf + count,
+ "CURRENT (actv_cycle_time) = %umS.\n",
+ actv_cycle_time);
+ count += sprintf(buf + count,
+ "CURRENT (idle_cycle_time) = %umS.\n",
+ idle_cycle_time);
+ count += sprintf(buf + count,
+ "CURRENT (actv2idle_timeout) = %u.%0uS.\n",
+ actv2idle_timeout / 10, actv2idle_timeout % 10);
+
+ return count;
+}
+
+static ssize_t mxt_slowscan_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct mxt_data *data = dev_get_drvdata(dev);
+ int fn;
+ int val;
+ int ret;
+
+ dev_info(dev, "Calling mxt_slowscan_store()\n");
+ ret = sscanf(buf, "%u %u", &fn, &val);
+ if ((ret == 1) || (ret == 2)) {
+ switch (fn) {
+ case SLOSCAN_DISABLE:
+ if (data->slowscan_enabled) {
+ data->actv_cycle_time =
+ data->slowscan_shad_actv_cycle_time;
+ data->idle_cycle_time =
+ data->slowscan_shad_idle_cycle_time;
+ data->actv2idle_timeout =
+ data->slowscan_shad_actv2idle_timeout;
+ data->slowscan_enabled = 0;
+ mxt_set_power_cfg(data, 0);
+ }
+ break;
+
+ case SLOSCAN_ENABLE:
+ if (!data->slowscan_enabled) {
+ data->slowscan_shad_actv_cycle_time =
+ data->actv_cycle_time;
+ data->slowscan_shad_idle_cycle_time =
+ data->idle_cycle_time;
+ data->slowscan_shad_actv2idle_timeout =
+ data->actv2idle_timeout;
+ data->actv_cycle_time =
+ data->slowscan_actv_cycle_time;
+ data->idle_cycle_time =
+ data->slowscan_idle_cycle_time;
+ data->actv2idle_timeout =
+ data->slowscan_actv2idle_timeout;
+ data->slowscan_enabled = 1;
+ mxt_set_power_cfg(data, 0);
+ }
+ break;
+
+ case SLOSCAN_SET_ACTVACQINT:
+ data->slowscan_actv_cycle_time = val;
+ break;
+
+ case SLOSCAN_SET_IDLEACQINT:
+ data->slowscan_idle_cycle_time = val;
+ break;
+
+ case SLOSCAN_SET_ACTV2IDLETO:
+ data->slowscan_actv2idle_timeout = val;
+ break;
+ }
+ }
+ return count;
+}
+
static ssize_t mxt_mem_access_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)
{
@@ -2126,11 +2279,13 @@ static ssize_t mxt_mem_access_write(struct file *filp, struct kobject *kobj,
static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store);
static DEVICE_ATTR(debug_enable, S_IWUSR | S_IRUSR, mxt_debug_enable_show,
- mxt_debug_enable_store);
+ mxt_debug_enable_store);
static DEVICE_ATTR(pause_driver, S_IWUSR | S_IRUSR, mxt_pause_show,
- mxt_pause_store);
+ mxt_pause_store);
static DEVICE_ATTR(version, S_IRUGO, mxt_version_show, NULL);
static DEVICE_ATTR(build, S_IRUGO, mxt_build_show, NULL);
+static DEVICE_ATTR(slowscan_enable, S_IWUSR | S_IRUSR,
+ mxt_slowscan_show, mxt_slowscan_store);
static struct attribute *mxt_attrs[] = {
&dev_attr_update_fw.attr,
@@ -2138,6 +2293,7 @@ static struct attribute *mxt_attrs[] = {
&dev_attr_pause_driver.attr,
&dev_attr_version.attr,
&dev_attr_build.attr,
+ &dev_attr_slowscan_enable.attr,
NULL
};