diff options
author | Girish S Ghongdemath <girishsg@ti.com> | 2011-12-06 11:17:32 -0600 |
---|---|---|
committer | Ziyann <jaraidaniel@gmail.com> | 2014-10-01 13:00:11 +0200 |
commit | 748c8a4124e3d8907fe3d3a1c8acd72cb0e914aa (patch) | |
tree | a1fa53ef17d9eceeca6cd72466d3a69c09e05ab0 /drivers/mfd | |
parent | 2e47130cf7e4a0aebca31ebdd74e3c52deadf53b (diff) | |
download | kernel_samsung_tuna-748c8a4124e3d8907fe3d3a1c8acd72cb0e914aa.tar.gz kernel_samsung_tuna-748c8a4124e3d8907fe3d3a1c8acd72cb0e914aa.tar.bz2 kernel_samsung_tuna-748c8a4124e3d8907fe3d3a1c8acd72cb0e914aa.zip |
TWL6030: GPADC: Add suspend/resume hooks
During OFF mode need to take care of GPADC cntrl module
so that leakage is minimal. Disable/Enable TEMP1 over
suspend/resume.
Change-Id: I09ae8a880a9ef0c95a9905dc3dbe54d1973871ca
Signed-off-by: Girish S G <girishsg@ti.com>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/twl6030-gpadc.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/mfd/twl6030-gpadc.c b/drivers/mfd/twl6030-gpadc.c index 043927bea6b..b96eeb783fe 100644 --- a/drivers/mfd/twl6030-gpadc.c +++ b/drivers/mfd/twl6030-gpadc.c @@ -63,6 +63,7 @@ struct twl6030_ideal_code { static struct twl6030_calibration twl6030_calib_tbl[TWL6030_GPADC_MAX_CHANNELS]; static const u32 calibration_bit_map = 0x47FF; +static u8 gpadc_save_ctrl_reg; /* Trim address where measured offset from ideal code is stored */ static const u8 twl6030_trim_addr[TWL6030_GPADC_MAX_CHANNELS] = { @@ -743,12 +744,51 @@ static int __devexit twl6030_gpadc_remove(struct platform_device *pdev) return 0; } +static int twl6030_gpadc_suspend(struct device *pdev) +{ + int ret; + u8 reg_val = 0; + + ret = twl_i2c_read_u8(TWL_MODULE_MADC, ®_val, TWL6030_GPADC_CTRL); + gpadc_save_ctrl_reg = reg_val; + if (!ret) { + reg_val &= ~TWL6030_GPADC_CTRL_TEMP1_EN; + ret = twl_i2c_write_u8(TWL_MODULE_MADC, reg_val, + TWL6030_GPADC_CTRL); + } else { + dev_err(the_gpadc->dev, "unable to disable madc temp1!\n"); + } + + return 0; +}; + +static int twl6030_gpadc_resume(struct device *pdev) +{ + int ret; + + if (!(gpadc_save_ctrl_reg & TWL6030_GPADC_CTRL_TEMP1_EN)) { + gpadc_save_ctrl_reg |= TWL6030_GPADC_CTRL_TEMP1_EN; + ret = twl_i2c_write_u8(TWL_MODULE_MADC, gpadc_save_ctrl_reg, + TWL6030_GPADC_CTRL); + if (ret) + dev_err(the_gpadc->dev, + "unable to enable gpadc temp1!\n"); + } + + return 0; +}; +static const struct dev_pm_ops twl6030_gpadc_pm_ops = { + .suspend = twl6030_gpadc_suspend, + .resume = twl6030_gpadc_resume, +}; + static struct platform_driver twl6030_gpadc_driver = { .probe = twl6030_gpadc_probe, .remove = __devexit_p(twl6030_gpadc_remove), .driver = { .name = "twl6030_gpadc", .owner = THIS_MODULE, + .pm = &twl6030_gpadc_pm_ops, }, }; |