]> git.karo-electronics.de Git - linux-beck.git/commitdiff
hwmon: (ntc_thermistor) fix iio raw to microvolts conversion
authorChris Lesiak <chris.lesiak@licor.com>
Mon, 1 Jun 2015 16:27:37 +0000 (11:27 -0500)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 2 Jun 2015 13:53:50 +0000 (06:53 -0700)
The function ntc_adc_iio_read was assuming both a 12 bit ADC and that
pullup_uv is the same as the ADC reference voltage.  If either
assumption is false, then the result is incorrect.

Attempt to use iio_convert_raw_to_processed to convert the raw value to
microvolts.  It will fail for iio channels that don't support support
IIO_CHAN_INFO_SCALE; in that case fall back to the assumptions.

Signed-off-by: Chris Lesiak <chris.lesiak@licor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/ntc_thermistor.c

index fca92912269ef3b7b15ef3971bbabd7c1c0ae74c..3a2484aba57e5ac77fdf7c2bb32c098f1895024b 100644 (file)
@@ -228,20 +228,21 @@ struct ntc_data {
 static int ntc_adc_iio_read(struct ntc_thermistor_platform_data *pdata)
 {
        struct iio_channel *channel = pdata->chan;
-       s64 result;
-       int val, ret;
+       int raw, uv, ret;
 
-       ret = iio_read_channel_raw(channel, &val);
+       ret = iio_read_channel_raw(channel, &raw);
        if (ret < 0) {
                pr_err("read channel() error: %d\n", ret);
                return ret;
        }
 
-       /* unit: mV */
-       result = pdata->pullup_uv * (s64) val;
-       result >>= 12;
+       ret = iio_convert_raw_to_processed(channel, raw, &uv, 1000);
+       if (ret < 0) {
+               /* Assume 12 bit ADC with vref at pullup_uv */
+               uv = (pdata->pullup_uv * (s64)raw) >> 12;
+       }
 
-       return (int)result;
+       return uv;
 }
 
 static const struct of_device_id ntc_match[] = {