diff options
author | Nick Dyer <nick.dyer@itdev.co.uk> | 2011-10-07 17:44:01 +0100 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 12:37:36 -0700 |
commit | cbf12a2015963b32ece5ae025cf6c6cc4abc8c39 (patch) | |
tree | 448a7a5cff919f2ec0a7d3d28524a1ec5c1deba3 /drivers/input/touchscreen/atmel_mxt_ts.c | |
parent | cb81e3f2e13dad30cd432f33154392f3dd80c068 (diff) |
Input: atmel_mxt_ts - Use deep sleep mode when stopped
By writing zero to both the active and idle cycle times the maXTouch device is
put into a deep sleep mode when it consumes no power.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Rebase-Id: R6618130f3b4d5fd7a0dd6b7246b9d51b440b885f
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r-- | drivers/input/touchscreen/atmel_mxt_ts.c | 102 |
1 files changed, 96 insertions, 6 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index bddba256b7f4..e40ad576d267 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -94,6 +94,9 @@ #define MXT_POWER_ACTVACQINT 1 #define MXT_POWER_ACTV2IDLETO 2 +#define MXT_POWER_CFG_RUN 0 +#define MXT_POWER_CFG_DEEPSLEEP 1 + /* MXT_GEN_ACQUIRE_T8 field */ #define MXT_ACQUIRE_CHRGTIME 0 #define MXT_ACQUIRE_TCHDRIFT 2 @@ -270,6 +273,9 @@ struct mxt_data { struct bin_attribute mem_access_attr; bool debug_enabled; bool driver_paused; + u8 actv_cycle_time; + u8 idle_cycle_time; + u8 is_stopped; }; static bool mxt_object_writable(unsigned int type) @@ -820,6 +826,70 @@ static void mxt_handle_pdata(struct mxt_data *data) } } +static int mxt_set_power_cfg(struct mxt_data *data, u8 sleep) +{ + struct device *dev = &data->client->dev; + int error; + u8 actv_cycle_time = 0; + u8 idle_cycle_time = 0; + + if (!sleep) { + actv_cycle_time = data->actv_cycle_time; + idle_cycle_time = data->idle_cycle_time; + } + + 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; + + dev_dbg(dev, "Set ACTV %d, IDLE %d\n", actv_cycle_time, idle_cycle_time); + + data->is_stopped = sleep; + + return 0; + +i2c_error: + dev_err(dev, "Failed to set power cfg\n"); + return error; +} + +static int mxt_init_power_cfg(struct mxt_data *data) +{ + struct device *dev = &data->client->dev; + int error; + + error = mxt_read_object(data, MXT_GEN_POWER_T7, + MXT_POWER_ACTVACQINT, + &data->actv_cycle_time); + if (error) + return error; + + error = mxt_read_object(data, MXT_GEN_POWER_T7, + MXT_POWER_IDLEACQINT, + &data->idle_cycle_time); + if (error) + return error; + + /* On init, power up */ + error = mxt_set_power_cfg(data, MXT_POWER_CFG_RUN); + if (error) + return error; + + dev_info(dev, "Initialised power cfg: ACTV %d, IDLE %d\n", + data->actv_cycle_time, data->idle_cycle_time); + + if (data->actv_cycle_time == 0 || data->idle_cycle_time == 0) + dev_err(dev, "Warning: cycle time set to zero.\n"); + + return 0; +} + static int mxt_get_info(struct mxt_data *data) { struct i2c_client *client = data->client; @@ -939,6 +1009,12 @@ static int mxt_initialize(struct mxt_data *data) mxt_handle_pdata(data); + error = mxt_init_power_cfg(data); + if (error) { + dev_err(&client->dev, "Failed to initialize power cfg\n"); + return error; + } + /* Update matrix size at info struct */ error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, &val); if (error) @@ -1210,16 +1286,30 @@ static const struct attribute_group mxt_attr_group = { static void mxt_start(struct mxt_data *data) { - /* Touch enable */ - mxt_write_object(data, - MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83); + int error; + struct device *dev = &data->client->dev; + + if (data->is_stopped == 0) + return; + + error = mxt_set_power_cfg(data, MXT_POWER_CFG_RUN); + + if (!error) + dev_dbg(dev, "MXT started\n"); } static void mxt_stop(struct mxt_data *data) { - /* Touch disable */ - mxt_write_object(data, - MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0); + int error; + struct device *dev = &data->client->dev; + + if (data->is_stopped) + return; + + error = mxt_set_power_cfg(data, MXT_POWER_CFG_DEEPSLEEP); + + if (!error) + dev_dbg(dev, "MXT suspended\n"); } static int mxt_input_open(struct input_dev *dev) |