diff options
author | Nine Feng <nfeng@nvidia.com> | 2014-01-28 12:37:32 +0800 |
---|---|---|
committer | Danny Song <dsong@nvidia.com> | 2014-01-31 21:45:32 -0800 |
commit | 8b8d45d48da349159b2006202e13eea1bc652d51 (patch) | |
tree | 6b4bbe1e5049a39a0af2f5e07d60cb00004e8307 /drivers | |
parent | 2bb0e43403ff31467f3f3ba883165a8b859b602f (diff) |
ts :tn7c: support load switch for touch power rail
lcd power rail of EN_LCD_1V8 is shared with touch
module. We should make sure it is enabled before
touch suspend. Therefore, we add a new consumer
for lcd fix regulator, then it would be more
reasonable to turn off/on in terms of use counts.
Bug 1445143
Change-Id: Ieef0fc9ae46918c724d6129f9878be12641f66d0
Signed-off-by: Nine Feng <nfeng@nvidia.com>
Reviewed-on: http://git-master/r/360705
Reviewed-by: Danny Song <dsong@nvidia.com>
Tested-by: Danny Song <dsong@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/input/touchscreen/maxim_sti.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/maxim_sti.c b/drivers/input/touchscreen/maxim_sti.c index 80c53ec93b43..5108f6ca4b71 100644 --- a/drivers/input/touchscreen/maxim_sti.c +++ b/drivers/input/touchscreen/maxim_sti.c @@ -3,7 +3,7 @@ * Maxim SmartTouch Imager Touchscreen Driver * * Copyright (c)2013 Maxim Integrated Products, Inc. - * Copyright (C) 2013, NVIDIA Corporation. All Rights Reserved. + * Copyright (C) 2014, NVIDIA Corporation. All Rights Reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -96,6 +96,9 @@ struct dev_data { struct sched_param thread_sched; struct list_head dev_list; struct regulator *reg_avdd; +#ifdef CONFIG_MACH_TEGRANOTE7C + struct regulator *reg_dvdd_ts; +#endif struct regulator *reg_dvdd; void (*service_irq)(struct dev_data *dd); #if NV_ENABLE_CPU_BOOST @@ -691,12 +694,26 @@ static int regulator_control(struct dev_data *dd, bool on) { int ret = 0; +#ifdef CONFIG_MACH_TEGRANOTE7C + if (!dd->reg_avdd || !dd->reg_dvdd || !dd->reg_dvdd_ts) +#else if (!dd->reg_avdd || !dd->reg_dvdd) +#endif return 0; if (on) { +#ifdef CONFIG_MACH_TEGRANOTE7C + ret = regulator_enable(dd->reg_dvdd_ts); + if (ret < 0) { + ERROR("Failed to enable regulator dvdd_ts: %d", ret); + return ret; + } +#endif ret = regulator_enable(dd->reg_dvdd); if (ret < 0) { +#ifdef CONFIG_MACH_TEGRANOTE7C + regulator_disable(dd->reg_dvdd_ts); +#endif ERROR("Failed to enable regulator dvdd: %d", ret); return ret; } @@ -705,6 +722,9 @@ static int regulator_control(struct dev_data *dd, bool on) ret = regulator_enable(dd->reg_avdd); if (ret < 0) { ERROR("Failed to enable regulator avdd: %d", ret); +#ifdef CONFIG_MACH_TEGRANOTE7C + regulator_disable(dd->reg_dvdd_ts); +#endif regulator_disable(dd->reg_dvdd); return ret; } @@ -728,6 +748,17 @@ static int regulator_control(struct dev_data *dd, bool on) return ret; } +#ifdef CONFIG_MACH_TEGRANOTE7C + if (regulator_is_enabled(dd->reg_dvdd_ts)) + ret = regulator_disable(dd->reg_dvdd_ts); + if (ret < 0) { + ERROR("Failed to disable regulator dvdd_ts: %d", ret); + regulator_enable(dd->reg_avdd); + regulator_enable(dd->reg_dvdd); + return ret; + } +#endif + if (!regulator_is_enabled(dd->reg_dvdd)) { prev_dvdd_rail_state = 0; msleep(200); @@ -744,6 +775,12 @@ static void regulator_init(struct dev_data *dd) if (IS_ERR(dd->reg_avdd)) goto err_null_regulator; +#ifdef CONFIG_MACH_TEGRANOTE7C + dd->reg_dvdd_ts = devm_regulator_get(&dd->spi->dev, "dvdd_ts"); + if (IS_ERR(dd->reg_dvdd_ts)) + goto err_null_regulator; +#endif + dd->reg_dvdd = devm_regulator_get(&dd->spi->dev, "dvdd"); if (IS_ERR(dd->reg_dvdd)) goto err_null_regulator; @@ -752,6 +789,9 @@ static void regulator_init(struct dev_data *dd) err_null_regulator: dd->reg_avdd = NULL; +#ifdef CONFIG_MACH_TEGRANOTE7C + dd->reg_dvdd_ts = NULL; +#endif dd->reg_dvdd = NULL; dev_warn(&dd->spi->dev, "Failed to init regulators\n"); } |