From e6d2a8e4bbf1e8068274adedbcd8f35e7aae6884 Mon Sep 17 00:00:00 2001 From: Mohan Pallaka Date: Mon, 15 Jul 2013 16:17:46 +0530 Subject: 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 --- drivers/input/touchscreen/ft5x06_ts.c | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) 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); -- cgit v1.2.3