diff options
author | Arun Murthy <arun.murthy@stericsson.com> | 2011-05-26 16:57:32 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2011-07-22 15:52:04 +0200 |
commit | 461f174e8bfe864ec7b81c5b9ea0678ff8403760 (patch) | |
tree | a772dbcfa7429b2e1d737f64fbc74d0838cbb51c | |
parent | e10c6f08a87ba0d441a64a9d678f9219e4ad0a81 (diff) |
mfd: ab5500-gpadc: Discard adc converted value if < 5
ADC Convertion made on BDATA, using resistance mode, sometimes
provides a null value or a value < 5.
Discard susch values and provide the previous converted value
ST-Ericsson Linux next: Not Tested
ST-Ericsson ID: WP332221
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Ib0eaaed520789b91ea77b2a90c640d33a6c913f6
Signed-off-by: Arun Murthy <arun.murthy@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/23607
Reviewed-by: Johan PALSSON <johan.palsson@stericsson.com>
Reviewed-by: QATEST
Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
-rw-r--r-- | drivers/mfd/ab5500-gpadc.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/mfd/ab5500-gpadc.c b/drivers/mfd/ab5500-gpadc.c index e90bd9a3aaa..dbfc9c30e38 100644 --- a/drivers/mfd/ab5500-gpadc.c +++ b/drivers/mfd/ab5500-gpadc.c @@ -47,7 +47,7 @@ #define AB5500_GPADC_AUTO_TRIG_ADOUT0_CTRL 0x34 #define AB5500_GPADC_AUTO_TRIG_ADOUT1_CTRL 0x35 #define AB5500_GPADC_AUTO_TRIG0_MUX_CTRL 0x37 -#define AB5500_GPADC_AUTO_XALTEMP_CTRL 0x57 +#define AB5500_GPADC_AUTO_XTALTEMP_CTRL 0x57 #define AB5500_GPADC_KELVIN_CTRL 0xFE /* gpadc constants */ @@ -194,6 +194,7 @@ struct ab5500_gpadc { struct mutex ab5500_gpadc_lock; struct regulator *regu; int irq; + int prev_bdata; spinlock_t gpadc_auto_lock; struct adc_auto_trigger adc_trig[N_AUTO_TRIGGER]; struct workqueue_struct *gpadc_wq; @@ -358,7 +359,7 @@ int ab5500_gpadc_convert(struct ab5500_gpadc *gpadc, u8 input) break; case XTAL_TEMP: ret = abx500_mask_and_set_register_interruptible(gpadc->dev, - AB5500_BANK_ADC, AB5500_GPADC_AUTO_XALTEMP_CTRL, + AB5500_BANK_ADC, AB5500_GPADC_AUTO_XTALTEMP_CTRL, ADC_XTAL_FORCE_MASK, ADC_XTAL_FORCE_EN); if (ret < 0) { dev_err(gpadc->dev, "gpadc: fail to set xtaltemp\n"); @@ -454,7 +455,7 @@ int ab5500_gpadc_convert(struct ab5500_gpadc *gpadc, u8 input) */ if (input == XTAL_TEMP) { ret = abx500_mask_and_set_register_interruptible(gpadc->dev, - AB5500_BANK_ADC, AB5500_GPADC_AUTO_XALTEMP_CTRL, + AB5500_BANK_ADC, AB5500_GPADC_AUTO_XTALTEMP_CTRL, ADC_XTAL_FORCE_MASK, ADC_XTAL_FORCE_DI); if (ret < 0) { dev_err(gpadc->dev, @@ -478,6 +479,17 @@ int ab5500_gpadc_convert(struct ab5500_gpadc *gpadc, u8 input) } data = (high_data << 2) | (low_data >> 6); + if (input == BAT_CTRL || input == BTEMP_BALL) { + /* + * TODO: Re-check with h/w team + * discard null or value < 5, as there is some error + * in conversion + */ + if (data < 5) + data = gpadc->prev_bdata; + else + gpadc->prev_bdata = data; + } result = ab5500_gpadc_ad_to_voltage(gpadc, input, data); mutex_unlock(&gpadc->ab5500_gpadc_lock); |