Skip to content

Commit

Permalink
iio: afe: rescale: add temperature transducers
Browse files Browse the repository at this point in the history
A temperature transducer is a device that converts a thermal quantity
into any other physical quantity. This patch adds support for
temperature to voltage (like the LTC2997) and temperature to current
(like the AD590) linear transducers.
In both cases these are assumed to be connected to a voltage ADC.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20220213025739.2561834-9-liambeguin@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
  • Loading branch information
Liam Beguin authored and Jonathan Cameron committed Feb 28, 2022
1 parent 278fe1d commit 03e7d21
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions drivers/iio/afe/iio-rescale.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,11 +435,37 @@ static int rescale_temp_sense_rtd_props(struct device *dev,
return 0;
}

static int rescale_temp_transducer_props(struct device *dev,
struct rescale *rescale)
{
s32 offset = 0;
s32 sense = 1;
s32 alpha;
int ret;

device_property_read_u32(dev, "sense-offset-millicelsius", &offset);
device_property_read_u32(dev, "sense-resistor-ohms", &sense);
ret = device_property_read_u32(dev, "alpha-ppm-per-celsius", &alpha);
if (ret) {
dev_err(dev, "failed to read alpha-ppm-per-celsius: %d\n", ret);
return ret;
}

rescale->numerator = 1000000;
rescale->denominator = alpha * sense;

rescale->offset = div_s64((s64)offset * rescale->denominator,
rescale->numerator);

return 0;
}

enum rescale_variant {
CURRENT_SENSE_AMPLIFIER,
CURRENT_SENSE_SHUNT,
VOLTAGE_DIVIDER,
TEMP_SENSE_RTD,
TEMP_TRANSDUCER,
};

static const struct rescale_cfg rescale_cfg[] = {
Expand All @@ -459,6 +485,10 @@ static const struct rescale_cfg rescale_cfg[] = {
.type = IIO_TEMP,
.props = rescale_temp_sense_rtd_props,
},
[TEMP_TRANSDUCER] = {
.type = IIO_TEMP,
.props = rescale_temp_transducer_props,
},
};

static const struct of_device_id rescale_match[] = {
Expand All @@ -470,6 +500,8 @@ static const struct of_device_id rescale_match[] = {
.data = &rescale_cfg[VOLTAGE_DIVIDER], },
{ .compatible = "temperature-sense-rtd",
.data = &rescale_cfg[TEMP_SENSE_RTD], },
{ .compatible = "temperature-transducer",
.data = &rescale_cfg[TEMP_TRANSDUCER], },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, rescale_match);
Expand Down

0 comments on commit 03e7d21

Please sign in to comment.