diff options
author | Mohan Pallaka <mpallaka@codeaurora.org> | 2013-07-15 16:17:46 +0530 |
---|---|---|
committer | Abinaya P <abinayap@codeaurora.org> | 2016-08-17 16:36:42 +0530 |
commit | e6d2a8e4bbf1e8068274adedbcd8f35e7aae6884 (patch) | |
tree | 87e119b6b73a17dcb6626aa797205431a1623809 /drivers/input | |
parent | faca745b0bd0c8a569dcede5cc11ab5a5162b6e7 (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.c | 39 |
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); |