mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 10:46:33 +00:00
hwmon: (ntc_thermistor) fix iio raw to microvolts conversion
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>
This commit is contained in:
parent
e892b75ff5
commit
0315253b19
@ -228,20 +228,21 @@ struct ntc_data {
|
|||||||
static int ntc_adc_iio_read(struct ntc_thermistor_platform_data *pdata)
|
static int ntc_adc_iio_read(struct ntc_thermistor_platform_data *pdata)
|
||||||
{
|
{
|
||||||
struct iio_channel *channel = pdata->chan;
|
struct iio_channel *channel = pdata->chan;
|
||||||
s64 result;
|
int raw, uv, ret;
|
||||||
int val, ret;
|
|
||||||
|
|
||||||
ret = iio_read_channel_raw(channel, &val);
|
ret = iio_read_channel_raw(channel, &raw);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err("read channel() error: %d\n", ret);
|
pr_err("read channel() error: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unit: mV */
|
ret = iio_convert_raw_to_processed(channel, raw, &uv, 1000);
|
||||||
result = pdata->pullup_uv * (s64) val;
|
if (ret < 0) {
|
||||||
result >>= 12;
|
/* 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[] = {
|
static const struct of_device_id ntc_match[] = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user