All of lore.kernel.org
 help / color / mirror / Atom feed
* [lm-sensors] [PATCH] hwmon: ntc: Don't assume a 12 bit ADC
@ 2015-05-26 20:41 Chris Lesiak
  2015-05-26 23:00 ` Guenter Roeck
  2015-05-27 14:36 ` Chris Lesiak
  0 siblings, 2 replies; 3+ messages in thread
From: Chris Lesiak @ 2015-05-26 20:41 UTC (permalink / raw)
  To: lm-sensors

The function ntc_adc_iio_read was using iio_read_channel_raw and
converting to microVolts using the assumption of a 12 bit ADC.  If a
converter with different precision was used, the result was in error.

Instead, use iio_read_channel_processed, which does the conversion to
microVolts itself.

Signed-off-by: Chris Lesiak <chris.lesiak@licor.com>
---
 drivers/hwmon/ntc_thermistor.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/hwmon/ntc_thermistor.c b/drivers/hwmon/ntc_thermistor.c
index 6880011..0d3a686 100644
--- a/drivers/hwmon/ntc_thermistor.c
+++ b/drivers/hwmon/ntc_thermistor.c
@@ -190,20 +190,15 @@ 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;
 
-	ret = iio_read_channel_raw(channel, &val);
+	ret = iio_read_channel_processed(channel, &val);
 	if (ret < 0) {
 		pr_err("read channel() error: %d\n", ret);
 		return ret;
 	}
 
-	/* unit: mV */
-	result = pdata->pullup_uv * (s64) val;
-	result >>= 12;
-
-	return (int)result;
+	return val;
 }
 
 static const struct of_device_id ntc_match[] = {
-- 
1.9.3


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [lm-sensors] [PATCH] hwmon: ntc: Don't assume a 12 bit ADC
  2015-05-26 20:41 [lm-sensors] [PATCH] hwmon: ntc: Don't assume a 12 bit ADC Chris Lesiak
@ 2015-05-26 23:00 ` Guenter Roeck
  2015-05-27 14:36 ` Chris Lesiak
  1 sibling, 0 replies; 3+ messages in thread
From: Guenter Roeck @ 2015-05-26 23:00 UTC (permalink / raw)
  To: lm-sensors

On Tue, May 26, 2015 at 03:41:42PM -0500, Chris Lesiak wrote:
> The function ntc_adc_iio_read was using iio_read_channel_raw and
> converting to microVolts using the assumption of a 12 bit ADC.  If a
> converter with different precision was used, the result was in error.
> 
> Instead, use iio_read_channel_processed, which does the conversion to
> microVolts itself.
> 
> Signed-off-by: Chris Lesiak <chris.lesiak@licor.com>
> ---
>  drivers/hwmon/ntc_thermistor.c | 9 ++-------
>  1 file changed, 2 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/hwmon/ntc_thermistor.c b/drivers/hwmon/ntc_thermistor.c
> index 6880011..0d3a686 100644
> --- a/drivers/hwmon/ntc_thermistor.c
> +++ b/drivers/hwmon/ntc_thermistor.c
> @@ -190,20 +190,15 @@ 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;
>  
> -	ret = iio_read_channel_raw(channel, &val);
> +	ret = iio_read_channel_processed(channel, &val);
>  	if (ret < 0) {
>  		pr_err("read channel() error: %d\n", ret);
>  		return ret;
>  	}
>  
> -	/* unit: mV */
> -	result = pdata->pullup_uv * (s64) val;
> -	result >>= 12;
> -
> -	return (int)result;
> +	return val;

The calculation used to need pullup_uv. As far as I can see,
the iio driver knows nothing about pullup_uv, which makes me
wonder how this can work. Can you explain ?

Thanks,
Guenter

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [lm-sensors] [PATCH] hwmon: ntc: Don't assume a 12 bit ADC
  2015-05-26 20:41 [lm-sensors] [PATCH] hwmon: ntc: Don't assume a 12 bit ADC Chris Lesiak
  2015-05-26 23:00 ` Guenter Roeck
@ 2015-05-27 14:36 ` Chris Lesiak
  1 sibling, 0 replies; 3+ messages in thread
From: Chris Lesiak @ 2015-05-27 14:36 UTC (permalink / raw)
  To: lm-sensors

On 05/26/2015 06:00 PM, Guenter Roeck wrote:
> On Tue, May 26, 2015 at 03:41:42PM -0500, Chris Lesiak wrote:
>> The function ntc_adc_iio_read was using iio_read_channel_raw and
>> converting to microVolts using the assumption of a 12 bit ADC.  If a
>> converter with different precision was used, the result was in error.
>>
>> Instead, use iio_read_channel_processed, which does the conversion to
>> microVolts itself.
>>
>> Signed-off-by: Chris Lesiak <chris.lesiak@licor.com>
>> ---
>>   drivers/hwmon/ntc_thermistor.c | 9 ++-------
>>   1 file changed, 2 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/hwmon/ntc_thermistor.c b/drivers/hwmon/ntc_thermistor.c
>> index 6880011..0d3a686 100644
>> --- a/drivers/hwmon/ntc_thermistor.c
>> +++ b/drivers/hwmon/ntc_thermistor.c
>> @@ -190,20 +190,15 @@ 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;
>>   
>> -	ret = iio_read_channel_raw(channel, &val);
>> +	ret = iio_read_channel_processed(channel, &val);
>>   	if (ret < 0) {
>>   		pr_err("read channel() error: %d\n", ret);
>>   		return ret;
>>   	}
>>   
>> -	/* unit: mV */
>> -	result = pdata->pullup_uv * (s64) val;
>> -	result >>= 12;
>> -
>> -	return (int)result;
>> +	return val;
> The calculation used to need pullup_uv. As far as I can see,
> the iio driver knows nothing about pullup_uv, which makes me
> wonder how this can work. Can you explain ?
>
> Thanks,
> Guenter
>

On further review, it would be premature to apply that patch.

Although it is good circuit design practice for pullup_uv to be the same 
as the ADC vref, that is not always the case.  The ntc_thermistor driver 
currently assumes they are the same and that the ADC is 12 bit.

24 of the 31 iio/adc device drivers in the 4.0 tree know their vref, 
either from device tree or pdata (example at91_adc.c), via 
regulator_get_voltage (example mcp320x.c), as a fixed internal reference 
(example max1027.c), or a combination of the above (example ad7266.c).

The other 7 do not support IIO_CHAN_INFO_SCALE.  They are:

axp288_adc.c
exynos_adc.c
men_z188_adc.c
ti_am335x_adc.c
twl4030-madc.c
twl6030-gpadc.c
viperboard_adc.c

A look at the arm device trees show that ntc_thermistor is used with 
exynos_adc on both exynos5420-peach-pit and exynos5800-peach-pi. This 
patch would break those platforms.

One solution would be to add support for IIO_CHAN_INFO_SCALE to the rest 
of the adc drivers, or at least exynos_adc.

I'll submit a patch taking a different approach: use 
iio_read_channel_processed only when supported by the adc.





-- 
Chris Lesiak
Principal Design Engineer, Software
LI-COR, Inc.
chris.lesiak@licor.com

Any opinions expressed are those of the author and
do not necessarily represent those of his employer.


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-05-27 14:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-26 20:41 [lm-sensors] [PATCH] hwmon: ntc: Don't assume a 12 bit ADC Chris Lesiak
2015-05-26 23:00 ` Guenter Roeck
2015-05-27 14:36 ` Chris Lesiak

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.