summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorMohan Pallaka <mpallaka@codeaurora.org>2013-07-15 16:17:46 +0530
committerAbinaya P <abinayap@codeaurora.org>2016-08-17 16:36:42 +0530
commite6d2a8e4bbf1e8068274adedbcd8f35e7aae6884 (patch)
tree87e119b6b73a17dcb6626aa797205431a1623809 /drivers/input
parentfaca745b0bd0c8a569dcede5cc11ab5a5162b6e7 (diff)
input: ft5x06_ts: Disable regulators in suspend
Disable/enable the regulators in suspend/resume to have better power savings. This patch is propagated from 3.18 kernel 'commit 550c106ea1a3 ("input: ft5x06_ts: Disable regulators in suspend")' Change-Id: I8aa7e941f20040955d6cc177e70ed38dbd28af8c Signed-off-by: Mohan Pallaka <mpallaka@codeaurora.org>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/ft5x06_ts.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/ft5x06_ts.c b/drivers/input/touchscreen/ft5x06_ts.c
index 3d9361de9836..b55fea10cb30 100644
--- a/drivers/input/touchscreen/ft5x06_ts.c
+++ b/drivers/input/touchscreen/ft5x06_ts.c
@@ -491,6 +491,7 @@ static int ft5x06_ts_suspend(struct device *dev)
{
struct ft5x06_ts_data *data = dev_get_drvdata(dev);
char txbuf[2], i;
+ int err;
if (data->loading_fw) {
dev_info(dev, "Firmware loading in process...\n");
@@ -518,20 +519,58 @@ static int ft5x06_ts_suspend(struct device *dev)
ft5x06_i2c_write(data->client, txbuf, sizeof(txbuf));
}
+ if (data->pdata->power_on) {
+ err = data->pdata->power_on(false);
+ if (err) {
+ dev_err(dev, "power off failed");
+ goto pwr_off_fail;
+ }
+ } else {
+ err = ft5x06_power_on(data, false);
+ if (err) {
+ dev_err(dev, "power off failed");
+ goto pwr_off_fail;
+ }
+ }
+
data->suspended = true;
return 0;
+
+pwr_off_fail:
+ if (gpio_is_valid(data->pdata->reset_gpio)) {
+ gpio_set_value_cansleep(data->pdata->reset_gpio, 0);
+ msleep(FT_RESET_DLY);
+ gpio_set_value_cansleep(data->pdata->reset_gpio, 1);
+ }
+ enable_irq(data->client->irq);
+ return err;
}
static int ft5x06_ts_resume(struct device *dev)
{
struct ft5x06_ts_data *data = dev_get_drvdata(dev);
+ int err;
if (!data->suspended) {
dev_info(dev, "Already in awake state\n");
return 0;
}
+ if (data->pdata->power_on) {
+ err = data->pdata->power_on(true);
+ if (err) {
+ dev_err(dev, "power on failed");
+ return err;
+ }
+ } else {
+ err = ft5x06_power_on(data, true);
+ if (err) {
+ dev_err(dev, "power on failed");
+ return err;
+ }
+ }
+
if (gpio_is_valid(data->pdata->reset_gpio)) {
gpio_set_value_cansleep(data->pdata->reset_gpio, 0);
msleep(FT_RESET_DLY);