lp8788-charger: Fix wrong ADC conversion
authorKim, Milo <Milo.Kim@ti.com>
Fri, 19 Oct 2012 00:12:21 +0000 (00:12 +0000)
committerAnton Vorontsov <anton.vorontsov@linaro.org>
Sun, 18 Nov 2012 04:42:12 +0000 (20:42 -0800)
To get the battery voltage and temperature, IIO ADC functions are used.
LP8788 ADC driver provides RAW and SCALE channel information. This patch
fixes wrong ADC result.

Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com>
Reviewed-by Lars-Peter Clausen <lars@metafoo.de>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
drivers/power/lp8788-charger.c

index 614e6aa..1afa5f7 100644 (file)
@@ -235,25 +235,14 @@ static int lp8788_get_battery_present(struct lp8788_charger *pchg,
        return 0;
 }
 
-static int lp8788_get_vbatt_adc(struct lp8788_charger *pchg,
-                               unsigned int *result)
+static int lp8788_get_vbatt_adc(struct lp8788_charger *pchg, int *result)
 {
        struct iio_channel *channel = pchg->chan[LP8788_VBATT];
-       int scaleint;
-       int scalepart;
-       int ret;
 
        if (!channel)
                return -EINVAL;
 
-       ret = iio_read_channel_scale(channel, &scaleint, &scalepart);
-       if (ret != IIO_VAL_INT_PLUS_MICRO)
-               return -EINVAL;
-
-       /* unit: mV */
-       *result = (scaleint + scalepart * 1000000) / 1000;
-
-       return 0;
+       return iio_read_channel_processed(channel, result);
 }
 
 static int lp8788_get_battery_voltage(struct lp8788_charger *pchg,
@@ -268,7 +257,7 @@ static int lp8788_get_battery_capacity(struct lp8788_charger *pchg,
        struct lp8788 *lp = pchg->lp;
        struct lp8788_charger_platform_data *pdata = pchg->pdata;
        unsigned int max_vbatt;
-       unsigned int vbatt;
+       int vbatt;
        enum lp8788_charging_state state;
        u8 data;
        int ret;
@@ -304,19 +293,18 @@ static int lp8788_get_battery_temperature(struct lp8788_charger *pchg,
                                union power_supply_propval *val)
 {
        struct iio_channel *channel = pchg->chan[LP8788_BATT_TEMP];
-       int scaleint;
-       int scalepart;
+       int result;
        int ret;
 
        if (!channel)
                return -EINVAL;
 
-       ret = iio_read_channel_scale(channel, &scaleint, &scalepart);
-       if (ret != IIO_VAL_INT_PLUS_MICRO)
+       ret = iio_read_channel_processed(channel, &result);
+       if (ret < 0)
                return -EINVAL;
 
        /* unit: 0.1 'C */
-       val->intval = (scaleint + scalepart * 1000000) / 100;
+       val->intval = result * 10;
 
        return 0;
 }