Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0315253b authored by Chris Lesiak's avatar Chris Lesiak Committed by Guenter Roeck
Browse files

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: default avatarChris Lesiak <chris.lesiak@licor.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent e892b75f
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -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[] = {