All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Liam Beguin <liambeguin@gmail.com>
Cc: <peda@axentia.se>, <jic23@kernel.org>, <lars@metafoo.de>,
	<pmeerw@pmeerw.net>, <linux-kernel@vger.kernel.org>,
	<linux-iio@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<robh+dt@kernel.org>
Subject: Re: [PATCH v1 5/9] iio: afe: rescale: add support for temperature sensors
Date: Tue, 1 Jun 2021 17:34:24 +0100	[thread overview]
Message-ID: <20210601173424.00001ce8@Huawei.com> (raw)
In-Reply-To: <20210530005917.20953-6-liambeguin@gmail.com>

On Sat, 29 May 2021 20:59:13 -0400
Liam Beguin <liambeguin@gmail.com> wrote:

> From: Liam Beguin <lvb@xiphos.com>
> 
> Add support for various linear temperature sensors.
> 
> temperature-sense-rtd is used when the measured temperature is a
> function of the sensor's resistance (like RTD sensors).
> 
> temperature-sense-current is used when the measured temperature is a
> function of the sensor's output current (like the AD590)
> 
> temperature-sense-amplifier is used when the measured temperature is a
> function of the sensor's voltage (like the LTC2997)
> 
> Signed-off-by: Liam Beguin <lvb@xiphos.com>
Hi Liam,

Comments in here follow through from the bindings.

Jonathan

> ---
>  drivers/iio/afe/iio-rescale.c | 141 ++++++++++++++++++++++++++++++++++
>  1 file changed, 141 insertions(+)
> 
> diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
> index 3bd1f11f21db..eb53d833bf7c 100644
> --- a/drivers/iio/afe/iio-rescale.c
> +++ b/drivers/iio/afe/iio-rescale.c
> @@ -222,10 +222,133 @@ static int rescale_voltage_divider_props(struct device *dev,
>  	return 0;
>  }
>  
> +static int rescale_temp_sense_rtd_props(struct device *dev,
> +					struct rescale *rescale)
> +{
> +	u32 factor;
> +	u32 alpha;
> +	u32 iexc;
> +	u32 tmp;
> +	int ret;
> +	u32 r0;
> +
> +	ret = device_property_read_u32(dev, "excitation-current-microamp",
> +				       &iexc);
> +	if (ret) {
> +		dev_err(dev, "failed to read excitation-current-microamp: %d\n",
> +			ret);
> +		return ret;
> +	}
> +
> +	ret = device_property_read_u32(dev, "alpha-micro-ohms-per-ohm-celsius",
> +				       &alpha);
> +	if (ret) {
> +		dev_err(dev, "failed to read alpha-micro-ohms-per-celsius: %d\n",
> +			ret);
> +		return ret;
> +	}
> +
> +	ret = device_property_read_u32(dev, "r-naught-ohms", &r0);
> +	if (ret) {
> +		dev_err(dev, "failed to read r-naught-ohms: %d\n", ret);
> +		return ret;
> +	}
> +
> +	/*
> +	 * The transfer function:
> +	 *
> +	 *	- V(T) = R(T) * iexc
> +	 *	- R(T) = r0 * (1 + alpha * T)
> +	 *
> +	 *	T = 1 / (alpha * r0 * iexc) * (V - r0 * iexc)
> +	 */
> +	tmp = r0 * iexc * alpha / 1000000;
> +	factor = gcd(tmp, 1000000);
> +	rescale->numerator = 1000000 / factor;
> +	rescale->denominator = tmp / factor;
> +
> +	rescale->offset = -1 * ((r0 * iexc) / 1000);
> +
> +	return 0;
> +}
> +
> +static int rescale_temp_sense_current_props(struct device *dev,
> +					    struct rescale *rescale)
> +{
> +	u32 alpha;
> +	u32 sense;
> +	int ret;
> +
> +	ret = device_property_read_u32(dev, "sense-resistor-ohms", &sense);
> +	if (ret) {
> +		dev_err(dev, "failed to read the sense resistance: %d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = device_property_read_u32(dev, "alpha-micro-amps-per-degree",
> +				       &alpha);
> +	if (ret) {
> +		dev_err(dev, "failed to read alpha-micro-amps-per-degree: %d\n",
> +			ret);
> +		return ret;
> +	}
> +
> +	/*
> +	 * The transfer function:
> +	 *
> +	 *	- V(K) = Rsense * Isense(K)
> +	 *	- K = Isense(K) / alpha
> +	 *	- C = K - 273.15
> +	 *
> +	 *	C = 1 / (Rsense * alpha) * (V - 273.15 * Rsense * alpha)
> +	 */
> +	rescale->numerator = 1000000;
> +	rescale->denominator = alpha * sense;
> +
> +	if (device_property_read_bool(dev, "use-kelvin-scale"))
> +		rescale->offset = -1 * ((27315 * alpha * sense) / 100000);

As below. Generic offset, not this specific one please ;)

> +
> +	return 0;
> +}
> +
> +static int rescale_temp_sense_amplifier_props(struct device *dev,
> +					      struct rescale *rescale)
> +{
> +	u32 alpha;
> +	int ret;
> +
> +	ret = device_property_read_u32(dev, "alpha-micro-volts-per-degree",
> +				       &alpha);
> +	if (ret) {
> +		dev_err(dev, "failed to read alpha-micro-volts-per-degree: %d\n",
> +			ret);
> +		return ret;
> +	}
> +
> +	/*
> +	 * The transfer function:
> +	 *
> +	 *	- K = V(K) / alpha
> +	 *	- C = K - 273.15
> +	 *
> +	 *	C = 1 / (alpha) * (V - 273.15 * alpha)
> +	 */
> +	rescale->numerator = 1000000;
> +	rescale->denominator = alpha;
> +
> +	if (device_property_read_bool(dev, "use-kelvin-scale"))

As mentioned later, stick to celcius + an explicit offset.

There will be devices that have their own offset which doesn't happen to
be -273.15

> +		rescale->offset = -1 * ((27315 * alpha) / 100000);
> +
> +	return 0;
> +}
> +
>  enum rescale_variant {
>  	CURRENT_SENSE_AMPLIFIER,
>  	CURRENT_SENSE_SHUNT,
>  	VOLTAGE_DIVIDER,
> +	TEMP_SENSE_RTD,
> +	TEMP_SENSE_CURRENT,
> +	TEMP_SENSE_AMPLIFIER,
>  };
>  
>  static const struct rescale_cfg rescale_cfg[] = {
> @@ -241,6 +364,18 @@ static const struct rescale_cfg rescale_cfg[] = {
>  		.type = IIO_VOLTAGE,
>  		.props = rescale_voltage_divider_props,
>  	},
> +	[TEMP_SENSE_RTD] = {
> +		.type = IIO_TEMP,
> +		.props = rescale_temp_sense_rtd_props,
> +	},
> +	[TEMP_SENSE_CURRENT] = {
> +		.type = IIO_TEMP,
> +		.props = rescale_temp_sense_current_props,
> +	},
> +	[TEMP_SENSE_AMPLIFIER] = {
> +		.type = IIO_TEMP,
> +		.props = rescale_temp_sense_amplifier_props,
> +	},
>  };
>  
>  static const struct of_device_id rescale_match[] = {
> @@ -250,6 +385,12 @@ static const struct of_device_id rescale_match[] = {
>  	  .data = &rescale_cfg[CURRENT_SENSE_SHUNT], },
>  	{ .compatible = "voltage-divider",
>  	  .data = &rescale_cfg[VOLTAGE_DIVIDER], },
> +	{ .compatible = "temperature-sense-rtd",
> +	  .data = &rescale_cfg[TEMP_SENSE_RTD], },
> +	{ .compatible = "temperature-sense-current",
> +	  .data = &rescale_cfg[TEMP_SENSE_CURRENT], },
> +	{ .compatible = "temperature-sense-amplifier",
> +	  .data = &rescale_cfg[TEMP_SENSE_AMPLIFIER], },
>  	{ /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, rescale_match);


  reply	other threads:[~2021-06-01 16:34 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-30  0:59 [PATCH v1 0/9] iio: afe: add temperature rescaling support Liam Beguin
2021-05-30  0:59 ` [PATCH v1 1/9] iio: inkern: always apply scale requested by consumer Liam Beguin
2021-05-31 13:39   ` Peter Rosin
2021-05-30  0:59 ` [PATCH v1 2/9] iio: inkern: error out on unsupported offset type Liam Beguin
2021-05-31  9:45   ` Peter Rosin
2021-05-31 13:31     ` Liam Beguin
2021-05-30  0:59 ` [PATCH v1 3/9] iio: afe: rescale: use core to get processed value Liam Beguin
2021-05-31  7:09   ` Peter Rosin
2021-05-31 13:23     ` Liam Beguin
2021-06-01 16:22   ` Jonathan Cameron
2021-05-30  0:59 ` [PATCH v1 4/9] iio: afe: rescale: add offset support Liam Beguin
2021-05-31  8:52   ` Peter Rosin
2021-05-31 13:36     ` Liam Beguin
2021-05-31 14:08       ` Peter Rosin
2021-05-31 14:51         ` Liam Beguin
2021-05-31 16:25           ` Peter Rosin
2021-05-31 17:42             ` Liam Beguin
2021-06-01 16:31               ` Jonathan Cameron
2021-05-30  0:59 ` [PATCH v1 5/9] iio: afe: rescale: add support for temperature sensors Liam Beguin
2021-06-01 16:34   ` Jonathan Cameron [this message]
2021-05-30  0:59 ` [PATCH v1 6/9] dt-bindings: iio: afe: update MAINTAINERS file Liam Beguin
2021-05-31  7:57   ` Peter Rosin
2021-05-30  0:59 ` [PATCH v1 7/9] dt-bindings: iio: afe: add binding for temperature-sense-rtd Liam Beguin
2021-06-01 16:43   ` Jonathan Cameron
2021-06-04 21:17   ` Rob Herring
2021-06-05 14:58     ` Jonathan Cameron
2021-05-30  0:59 ` [PATCH v1 8/9] dt-bindings: iio: afe: add binding for temperature-sense-current Liam Beguin
2021-05-31  7:28   ` Peter Rosin
2021-05-31  8:58     ` Peter Rosin
2021-05-31 13:41       ` Liam Beguin
2021-06-01 16:47   ` Jonathan Cameron
2021-06-04 21:21   ` Rob Herring
2021-05-30  0:59 ` [PATCH v1 9/9] dt-bindings: iio: afe: add binding for temperature-sense-amplifier Liam Beguin
2021-05-31  7:32   ` Peter Rosin
2021-05-31 14:03     ` Liam Beguin
2021-06-01 16:02       ` Jonathan Cameron
2021-06-01 16:07         ` Jonathan Cameron
2021-06-01 15:59   ` Jonathan Cameron

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210601173424.00001ce8@Huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=devicetree@vger.kernel.org \
    --cc=jic23@kernel.org \
    --cc=lars@metafoo.de \
    --cc=liambeguin@gmail.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peda@axentia.se \
    --cc=pmeerw@pmeerw.net \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.