staging:iio:hwmon bridge: Use iio_read_channel_processed
Use the iio_read_channel_processed function to read the sample value in the proper unit instead of using iio_read_channel_raw and iio_read_channel_scale and doing the unit conversion manually. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
48e44ce0f8
commit
a0e545e0e7
1 changed files with 5 additions and 28 deletions
|
@ -42,40 +42,17 @@ static ssize_t iio_hwmon_read_val(struct device *dev,
|
|||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
long result;
|
||||
int val, ret, scaleint, scalepart;
|
||||
int result;
|
||||
int ret;
|
||||
struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
|
||||
struct iio_hwmon_state *state = dev_get_drvdata(dev);
|
||||
|
||||
/*
|
||||
* No locking between this pair, so theoretically possible
|
||||
* the scale has changed.
|
||||
*/
|
||||
ret = iio_read_channel_raw(&state->channels[sattr->index],
|
||||
&val);
|
||||
ret = iio_read_channel_processed(&state->channels[sattr->index],
|
||||
&result);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = iio_read_channel_scale(&state->channels[sattr->index],
|
||||
&scaleint, &scalepart);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
switch (ret) {
|
||||
case IIO_VAL_INT:
|
||||
result = val * scaleint;
|
||||
break;
|
||||
case IIO_VAL_INT_PLUS_MICRO:
|
||||
result = (s64)val * (s64)scaleint +
|
||||
div_s64((s64)val * (s64)scalepart, 1000000LL);
|
||||
break;
|
||||
case IIO_VAL_INT_PLUS_NANO:
|
||||
result = (s64)val * (s64)scaleint +
|
||||
div_s64((s64)val * (s64)scalepart, 1000000000LL);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return sprintf(buf, "%ld\n", result);
|
||||
return sprintf(buf, "%d\n", result);
|
||||
}
|
||||
|
||||
static void iio_hwmon_free_attrs(struct iio_hwmon_state *st)
|
||||
|
|
Loading…
Reference in a new issue