* [PATCH v3 0/2] iio: humditiy: hdc3020: fix units
@ 2025-10-13 8:12 Dimitri Fedrau via B4 Relay
2025-10-13 8:12 ` [PATCH v3 1/2] iio: humditiy: hdc3020: fix units for temperature and humidity measurement Dimitri Fedrau via B4 Relay
2025-10-13 8:12 ` [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis Dimitri Fedrau via B4 Relay
0 siblings, 2 replies; 6+ messages in thread
From: Dimitri Fedrau via B4 Relay @ 2025-10-13 8:12 UTC (permalink / raw)
To: Javier Carrasco, Li peiyu, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Dimitri Fedrau
Cc: Jonathan Cameron, linux-iio, linux-kernel, Dimitri Fedrau,
Chris Lesiak
Fix units to milli degree celsius and milli percent for temperature
respectively relative humidity measurements and thresholds.
Signed-off-by: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
---
Changes in v3:
- Fix verbose comment for define HDC3020_THRESH_FRACTION (Javier)
- Embed prescale into define HDC3020_THRESH_FRACTION to make the division
by 5 calculation in threshold calculations explicit. (Andy)
- Add resulting units into comments again in hdc3020_thresh_get_temp and
hdc3020_thresh_get_hum (Andy)
- Link to v2: https://lore.kernel.org/r/20250901-hdc3020-units-fix-v2-0-082038a15917@liebherr.com
Changes in v2:
- Added explanation what is wrong at the moment into commit msg
- Added define HDC3020_THRESH_FRACTION and comment at the beginning of the
code.
- Use MILLI for instead of hardcoded 1000.
- Link to v1: https://lore.kernel.org/r/20250821-hdc3020-units-fix-v1-0-6ab0bc353c5e@liebherr.com
---
Dimitri Fedrau (2):
iio: humditiy: hdc3020: fix units for temperature and humidity measurement
iio: humditiy: hdc3020: fix units for thresholds and hysteresis
drivers/iio/humidity/hdc3020.c | 71 ++++++++++++++++++++++++------------------
1 file changed, 41 insertions(+), 30 deletions(-)
---
base-commit: 875e7d357a7f2e77a7f3fc4759d0aa0872c33027
change-id: 20250820-hdc3020-units-fix-91edbb8ccd07
Best regards,
--
Dimitri Fedrau <dimitri.fedrau@liebherr.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 1/2] iio: humditiy: hdc3020: fix units for temperature and humidity measurement
2025-10-13 8:12 [PATCH v3 0/2] iio: humditiy: hdc3020: fix units Dimitri Fedrau via B4 Relay
@ 2025-10-13 8:12 ` Dimitri Fedrau via B4 Relay
2025-10-13 8:12 ` [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis Dimitri Fedrau via B4 Relay
1 sibling, 0 replies; 6+ messages in thread
From: Dimitri Fedrau via B4 Relay @ 2025-10-13 8:12 UTC (permalink / raw)
To: Javier Carrasco, Li peiyu, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Dimitri Fedrau
Cc: Jonathan Cameron, linux-iio, linux-kernel, Dimitri Fedrau,
Chris Lesiak
From: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
According to the ABI the units after application of scale and offset are
milli degrees for temperature measurements and milli percent for relative
humidity measurements. Currently the resulting units are degree celsius for
temperature measurements and percent for relative humidity measurements.
Change scale factor to fix this issue.
Fixes: c9180b8e39be ("iio: humidity: Add driver for ti HDC302x humidity sensors")
Reported-by: Chris Lesiak <chris.lesiak@licorbio.com>
Suggested-by: Chris Lesiak <chris.lesiak@licorbio.com>
Reviewed-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Signed-off-by: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
---
drivers/iio/humidity/hdc3020.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/humidity/hdc3020.c b/drivers/iio/humidity/hdc3020.c
index ffb25596d3a8bad01d1f84a9a972561266f65d76..8aa567d9aded9cab461f1f905b6b5ada721ba2f0 100644
--- a/drivers/iio/humidity/hdc3020.c
+++ b/drivers/iio/humidity/hdc3020.c
@@ -301,9 +301,9 @@ static int hdc3020_read_raw(struct iio_dev *indio_dev,
case IIO_CHAN_INFO_SCALE:
*val2 = 65536;
if (chan->type == IIO_TEMP)
- *val = 175;
+ *val = 175 * MILLI;
else
- *val = 100;
+ *val = 100 * MILLI;
return IIO_VAL_FRACTIONAL;
case IIO_CHAN_INFO_OFFSET:
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis
2025-10-13 8:12 [PATCH v3 0/2] iio: humditiy: hdc3020: fix units Dimitri Fedrau via B4 Relay
2025-10-13 8:12 ` [PATCH v3 1/2] iio: humditiy: hdc3020: fix units for temperature and humidity measurement Dimitri Fedrau via B4 Relay
@ 2025-10-13 8:12 ` Dimitri Fedrau via B4 Relay
2025-10-15 8:29 ` Javier Carrasco
2025-10-15 9:45 ` Andy Shevchenko
1 sibling, 2 replies; 6+ messages in thread
From: Dimitri Fedrau via B4 Relay @ 2025-10-13 8:12 UTC (permalink / raw)
To: Javier Carrasco, Li peiyu, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Dimitri Fedrau
Cc: Jonathan Cameron, linux-iio, linux-kernel, Dimitri Fedrau,
Chris Lesiak
From: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
According to the ABI the units after application of scale and offset are
milli degree celsius for temperature thresholds and milli percent for
relative humidity thresholds. Currently the resulting units are degree
celsius for temperature thresholds and hysteresis and percent for relative
humidity thresholds and hysteresis. Change scale factor to fix this issue.
Fixes: 3ad0e7e5f0cb ("iio: humidity: hdc3020: add threshold events support")
Reported-by: Chris Lesiak <chris.lesiak@licorbio.com>
Signed-off-by: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
---
drivers/iio/humidity/hdc3020.c | 67 ++++++++++++++++++++++++------------------
1 file changed, 39 insertions(+), 28 deletions(-)
diff --git a/drivers/iio/humidity/hdc3020.c b/drivers/iio/humidity/hdc3020.c
index 8aa567d9aded9cab461f1f905b6b5ada721ba2f0..5a978801fb09ca49c449028d046a91e0e67c38ea 100644
--- a/drivers/iio/humidity/hdc3020.c
+++ b/drivers/iio/humidity/hdc3020.c
@@ -72,6 +72,9 @@
#define HDC3020_MAX_TEMP_HYST_MICRO 164748607
#define HDC3020_MAX_HUM_MICRO 99220264
+/* Divide 65535 from the datasheet by 5 to avoid overflows */
+#define HDC3020_THRESH_FRACTION (65535 / 5)
+
struct hdc3020_data {
struct i2c_client *client;
struct gpio_desc *reset_gpio;
@@ -376,15 +379,17 @@ static int hdc3020_thresh_get_temp(u16 thresh)
int temp;
/*
- * Get the temperature threshold from 9 LSBs, shift them to get
- * the truncated temperature threshold representation and
- * calculate the threshold according to the formula in the
- * datasheet. Result is degree celsius scaled by 65535.
+ * Get the temperature threshold from 9 LSBs, shift them to get the
+ * truncated temperature threshold representation and calculate the
+ * threshold according to the explicit formula in the datasheet and
+ * additionally scale by HDC3020_THRESH_FRACTION to avoid precision loss
+ * when calculating threshold and hysteresis values. Result is degree
+ * celsius scaled by HDC3020_THRESH_FRACTION.
*/
temp = FIELD_GET(HDC3020_THRESH_TEMP_MASK, thresh) <<
HDC3020_THRESH_TEMP_TRUNC_SHIFT;
- return -2949075 + (175 * temp);
+ return -589815 + (35 * temp);
}
static int hdc3020_thresh_get_hum(u16 thresh)
@@ -394,13 +399,15 @@ static int hdc3020_thresh_get_hum(u16 thresh)
/*
* Get the humidity threshold from 7 MSBs, shift them to get the
* truncated humidity threshold representation and calculate the
- * threshold according to the formula in the datasheet. Result is
- * percent scaled by 65535.
+ * threshold according to the explicit formula in the datasheet and
+ * additionally scale by HDC3020_THRESH_FRACTION to avoid precision loss
+ * when calculating threshold and hysteresis values. Result is percent
+ * scaled by HDC3020_THRESH_FRACTION.
*/
hum = FIELD_GET(HDC3020_THRESH_HUM_MASK, thresh) <<
HDC3020_THRESH_HUM_TRUNC_SHIFT;
- return hum * 100;
+ return hum * 20;
}
static u16 hdc3020_thresh_set_temp(int s_temp, u16 curr_thresh)
@@ -455,8 +462,8 @@ int hdc3020_thresh_clr(s64 s_thresh, s64 s_hyst, enum iio_event_direction dir)
else
s_clr = s_thresh + s_hyst;
- /* Divide by 65535 to get units of micro */
- return div_s64(s_clr, 65535);
+ /* Divide by HDC3020_THRESH_FRACTION to get units of micro */
+ return div_s64(s_clr, HDC3020_THRESH_FRACTION);
}
static int _hdc3020_write_thresh(struct hdc3020_data *data, u16 reg, u16 val)
@@ -507,7 +514,7 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
clr = ret;
/* Scale value to include decimal part into calculations */
- s_val = (val < 0) ? (val * 1000000 - val2) : (val * 1000000 + val2);
+ s_val = (val < 0) ? (val * 1000 - val2) : (val * 1000 + val2);
switch (chan->type) {
case IIO_TEMP:
switch (info) {
@@ -523,7 +530,8 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
/* Calculate old hysteresis */
s_thresh = (s64)hdc3020_thresh_get_temp(thresh) * 1000000;
s_clr = (s64)hdc3020_thresh_get_temp(clr) * 1000000;
- s_hyst = div_s64(abs(s_thresh - s_clr), 65535);
+ s_hyst = div_s64(abs(s_thresh - s_clr),
+ HDC3020_THRESH_FRACTION);
/* Set new threshold */
thresh = reg_val;
/* Set old hysteresis */
@@ -532,16 +540,17 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
case IIO_EV_INFO_HYSTERESIS:
/*
* Function hdc3020_thresh_get_temp returns temperature
- * in degree celsius scaled by 65535. Scale by 1000000
- * to be able to subtract scaled hysteresis value.
+ * in degree celsius scaled by HDC3020_THRESH_FRACTION.
+ * Scale by 1000000 to be able to subtract scaled
+ * hysteresis value.
*/
s_thresh = (s64)hdc3020_thresh_get_temp(thresh) * 1000000;
/*
* Units of s_val are in micro degree celsius, scale by
- * 65535 to get same units as s_thresh.
+ * HDC3020_THRESH_FRACTION to get same units as s_thresh.
*/
s_val = min(abs(s_val), HDC3020_MAX_TEMP_HYST_MICRO);
- s_hyst = (s64)s_val * 65535;
+ s_hyst = (s64)s_val * HDC3020_THRESH_FRACTION;
s_clr = hdc3020_thresh_clr(s_thresh, s_hyst, dir);
s_clr = max(s_clr, HDC3020_MIN_TEMP_MICRO);
s_clr = min(s_clr, HDC3020_MAX_TEMP_MICRO);
@@ -565,7 +574,8 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
/* Calculate old hysteresis */
s_thresh = (s64)hdc3020_thresh_get_hum(thresh) * 1000000;
s_clr = (s64)hdc3020_thresh_get_hum(clr) * 1000000;
- s_hyst = div_s64(abs(s_thresh - s_clr), 65535);
+ s_hyst = div_s64(abs(s_thresh - s_clr),
+ HDC3020_THRESH_FRACTION);
/* Set new threshold */
thresh = reg_val;
/* Try to set old hysteresis */
@@ -574,15 +584,16 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
case IIO_EV_INFO_HYSTERESIS:
/*
* Function hdc3020_thresh_get_hum returns relative
- * humidity in percent scaled by 65535. Scale by 1000000
- * to be able to subtract scaled hysteresis value.
+ * humidity in percent scaled by HDC3020_THRESH_FRACTION.
+ * Scale by 1000000 to be able to subtract scaled
+ * hysteresis value.
*/
s_thresh = (s64)hdc3020_thresh_get_hum(thresh) * 1000000;
/*
- * Units of s_val are in micro percent, scale by 65535
- * to get same units as s_thresh.
+ * Units of s_val are in micro percent, scale by
+ * HDC3020_THRESH_FRACTION to get same units as s_thresh.
*/
- s_hyst = (s64)s_val * 65535;
+ s_hyst = (s64)s_val * HDC3020_THRESH_FRACTION;
s_clr = hdc3020_thresh_clr(s_thresh, s_hyst, dir);
s_clr = max(s_clr, 0);
s_clr = min(s_clr, HDC3020_MAX_HUM_MICRO);
@@ -630,7 +641,7 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
thresh = hdc3020_thresh_get_temp(ret);
switch (info) {
case IIO_EV_INFO_VALUE:
- *val = thresh;
+ *val = thresh * MILLI;
break;
case IIO_EV_INFO_HYSTERESIS:
ret = hdc3020_read_be16(data, reg_clr);
@@ -638,18 +649,18 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
return ret;
clr = hdc3020_thresh_get_temp(ret);
- *val = abs(thresh - clr);
+ *val = abs(thresh - clr) * MILLI;
break;
default:
return -EOPNOTSUPP;
}
- *val2 = 65535;
+ *val2 = HDC3020_THRESH_FRACTION;
return IIO_VAL_FRACTIONAL;
case IIO_HUMIDITYRELATIVE:
thresh = hdc3020_thresh_get_hum(ret);
switch (info) {
case IIO_EV_INFO_VALUE:
- *val = thresh;
+ *val = thresh * MILLI;
break;
case IIO_EV_INFO_HYSTERESIS:
ret = hdc3020_read_be16(data, reg_clr);
@@ -657,12 +668,12 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
return ret;
clr = hdc3020_thresh_get_hum(ret);
- *val = abs(thresh - clr);
+ *val = abs(thresh - clr) * MILLI;
break;
default:
return -EOPNOTSUPP;
}
- *val2 = 65535;
+ *val2 = HDC3020_THRESH_FRACTION;
return IIO_VAL_FRACTIONAL;
default:
return -EOPNOTSUPP;
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis
2025-10-13 8:12 ` [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis Dimitri Fedrau via B4 Relay
@ 2025-10-15 8:29 ` Javier Carrasco
2025-10-15 9:45 ` Andy Shevchenko
1 sibling, 0 replies; 6+ messages in thread
From: Javier Carrasco @ 2025-10-15 8:29 UTC (permalink / raw)
To: dimitri.fedrau, Li peiyu, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Dimitri Fedrau
Cc: Jonathan Cameron, linux-iio, linux-kernel, Chris Lesiak
On Mon Oct 13, 2025 at 4:12 PM CST, Dimitri Fedrau via B4 Relay wrote:
> From: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
>
> According to the ABI the units after application of scale and offset are
> milli degree celsius for temperature thresholds and milli percent for
> relative humidity thresholds. Currently the resulting units are degree
> celsius for temperature thresholds and hysteresis and percent for relative
> humidity thresholds and hysteresis. Change scale factor to fix this issue.
>
> Fixes: 3ad0e7e5f0cb ("iio: humidity: hdc3020: add threshold events support")
> Reported-by: Chris Lesiak <chris.lesiak@licorbio.com>
> Signed-off-by: Dimitri Fedrau <dimitri.fedrau@liebherr.com>
> ---
> drivers/iio/humidity/hdc3020.c | 67 ++++++++++++++++++++++++------------------
> 1 file changed, 39 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/iio/humidity/hdc3020.c b/drivers/iio/humidity/hdc3020.c
> index 8aa567d9aded9cab461f1f905b6b5ada721ba2f0..5a978801fb09ca49c449028d046a91e0e67c38ea 100644
> --- a/drivers/iio/humidity/hdc3020.c
> +++ b/drivers/iio/humidity/hdc3020.c
> @@ -72,6 +72,9 @@
> #define HDC3020_MAX_TEMP_HYST_MICRO 164748607
> #define HDC3020_MAX_HUM_MICRO 99220264
>
> +/* Divide 65535 from the datasheet by 5 to avoid overflows */
> +#define HDC3020_THRESH_FRACTION (65535 / 5)
> +
> struct hdc3020_data {
> struct i2c_client *client;
> struct gpio_desc *reset_gpio;
> @@ -376,15 +379,17 @@ static int hdc3020_thresh_get_temp(u16 thresh)
> int temp;
>
> /*
> - * Get the temperature threshold from 9 LSBs, shift them to get
> - * the truncated temperature threshold representation and
> - * calculate the threshold according to the formula in the
> - * datasheet. Result is degree celsius scaled by 65535.
> + * Get the temperature threshold from 9 LSBs, shift them to get the
> + * truncated temperature threshold representation and calculate the
> + * threshold according to the explicit formula in the datasheet and
> + * additionally scale by HDC3020_THRESH_FRACTION to avoid precision loss
> + * when calculating threshold and hysteresis values. Result is degree
> + * celsius scaled by HDC3020_THRESH_FRACTION.
I see that Andy asked you to include the formula, and you accepted that
suggestion, but the formula is still missing. I also think it should be
added to the comment because that would clarify where this kind of
magic numbers in the return value come from.
> */
> temp = FIELD_GET(HDC3020_THRESH_TEMP_MASK, thresh) <<
> HDC3020_THRESH_TEMP_TRUNC_SHIFT;
>
> - return -2949075 + (175 * temp);
> + return -589815 + (35 * temp);
> }
With that modification,
Reviewed-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis
2025-10-13 8:12 ` [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis Dimitri Fedrau via B4 Relay
2025-10-15 8:29 ` Javier Carrasco
@ 2025-10-15 9:45 ` Andy Shevchenko
2025-10-15 14:40 ` Dimitri Fedrau
1 sibling, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2025-10-15 9:45 UTC (permalink / raw)
To: dimitri.fedrau
Cc: Javier Carrasco, Li peiyu, Jonathan Cameron, David Lechner,
Nuno Sá, Andy Shevchenko, Dimitri Fedrau, Jonathan Cameron,
linux-iio, linux-kernel, Chris Lesiak
On Mon, Oct 13, 2025 at 11:12 AM Dimitri Fedrau via B4 Relay
<devnull+dimitri.fedrau.liebherr.com@kernel.org> wrote:
>
> According to the ABI the units after application of scale and offset are
> milli degree celsius for temperature thresholds and milli percent for
> relative humidity thresholds. Currently the resulting units are degree
> celsius for temperature thresholds and hysteresis and percent for relative
> humidity thresholds and hysteresis. Change scale factor to fix this issue.
...
> - return -2949075 + (175 * temp);
> + return -589815 + (35 * temp);
I was under the impression that we agreed on the explicit division by 5.
return -2949075 / 5 + (175 / 5 * temp);
...
> - return hum * 100;
> + return hum * 20;
And in a similar way here.
> s_clr = max(s_clr, HDC3020_MIN_TEMP_MICRO);
> s_clr = min(s_clr, HDC3020_MAX_TEMP_MICRO);
> @@ -565,7 +574,8 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
> /* Calculate old hysteresis */
> s_thresh = (s64)hdc3020_thresh_get_hum(thresh) * 1000000;
> s_clr = (s64)hdc3020_thresh_get_hum(clr) * 1000000;
> - s_hyst = div_s64(abs(s_thresh - s_clr), 65535);
> + s_hyst = div_s64(abs(s_thresh - s_clr),
> + HDC3020_THRESH_FRACTION);
> /* Set new threshold */
> thresh = reg_val;
> /* Try to set old hysteresis */
> @@ -574,15 +584,16 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
> case IIO_EV_INFO_HYSTERESIS:
> /*
> * Function hdc3020_thresh_get_hum returns relative
> - * humidity in percent scaled by 65535. Scale by 1000000
> - * to be able to subtract scaled hysteresis value.
> + * humidity in percent scaled by HDC3020_THRESH_FRACTION.
> + * Scale by 1000000 to be able to subtract scaled
> + * hysteresis value.
> */
> s_thresh = (s64)hdc3020_thresh_get_hum(thresh) * 1000000;
> /*
> - * Units of s_val are in micro percent, scale by 65535
> - * to get same units as s_thresh.
> + * Units of s_val are in micro percent, scale by
> + * HDC3020_THRESH_FRACTION to get same units as s_thresh.
> */
> - s_hyst = (s64)s_val * 65535;
> + s_hyst = (s64)s_val * HDC3020_THRESH_FRACTION;
> s_clr = hdc3020_thresh_clr(s_thresh, s_hyst, dir);
> s_clr = max(s_clr, 0);
> s_clr = min(s_clr, HDC3020_MAX_HUM_MICRO);
> @@ -630,7 +641,7 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
> thresh = hdc3020_thresh_get_temp(ret);
> switch (info) {
> case IIO_EV_INFO_VALUE:
> - *val = thresh;
> + *val = thresh * MILLI;
> break;
> case IIO_EV_INFO_HYSTERESIS:
> ret = hdc3020_read_be16(data, reg_clr);
> @@ -638,18 +649,18 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
> return ret;
>
> clr = hdc3020_thresh_get_temp(ret);
> - *val = abs(thresh - clr);
> + *val = abs(thresh - clr) * MILLI;
> break;
> default:
> return -EOPNOTSUPP;
> }
> - *val2 = 65535;
> + *val2 = HDC3020_THRESH_FRACTION;
> return IIO_VAL_FRACTIONAL;
> case IIO_HUMIDITYRELATIVE:
> thresh = hdc3020_thresh_get_hum(ret);
> switch (info) {
> case IIO_EV_INFO_VALUE:
> - *val = thresh;
> + *val = thresh * MILLI;
> break;
> case IIO_EV_INFO_HYSTERESIS:
> ret = hdc3020_read_be16(data, reg_clr);
> @@ -657,12 +668,12 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
> return ret;
>
> clr = hdc3020_thresh_get_hum(ret);
> - *val = abs(thresh - clr);
> + *val = abs(thresh - clr) * MILLI;
> break;
> default:
> return -EOPNOTSUPP;
> }
> - *val2 = 65535;
> + *val2 = HDC3020_THRESH_FRACTION;
> return IIO_VAL_FRACTIONAL;
> default:
> return -EOPNOTSUPP;
>
> --
> 2.39.5
>
>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis
2025-10-15 9:45 ` Andy Shevchenko
@ 2025-10-15 14:40 ` Dimitri Fedrau
0 siblings, 0 replies; 6+ messages in thread
From: Dimitri Fedrau @ 2025-10-15 14:40 UTC (permalink / raw)
To: Andy Shevchenko
Cc: dimitri.fedrau, Javier Carrasco, Li peiyu, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Jonathan Cameron,
linux-iio, linux-kernel, Chris Lesiak
Am Wed, Oct 15, 2025 at 12:45:31PM +0300 schrieb Andy Shevchenko:
> On Mon, Oct 13, 2025 at 11:12 AM Dimitri Fedrau via B4 Relay
> <devnull+dimitri.fedrau.liebherr.com@kernel.org> wrote:
> >
> > According to the ABI the units after application of scale and offset are
> > milli degree celsius for temperature thresholds and milli percent for
> > relative humidity thresholds. Currently the resulting units are degree
> > celsius for temperature thresholds and hysteresis and percent for relative
> > humidity thresholds and hysteresis. Change scale factor to fix this issue.
>
> ...
>
>
> > - return -2949075 + (175 * temp);
> > + return -589815 + (35 * temp);
>
> I was under the impression that we agreed on the explicit division by 5.
>
> return -2949075 / 5 + (175 / 5 * temp);
>
I wanted to scale the formula as it has been done before, but didn't make
it really clear. After thinking about it again, I think you are right,
will add the explicit division by 5.
> ...
>
> > - return hum * 100;
> > + return hum * 20;
>
> And in a similar way here.
>
Ok.
>
> > s_clr = max(s_clr, HDC3020_MIN_TEMP_MICRO);
> > s_clr = min(s_clr, HDC3020_MAX_TEMP_MICRO);
> > @@ -565,7 +574,8 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
> > /* Calculate old hysteresis */
> > s_thresh = (s64)hdc3020_thresh_get_hum(thresh) * 1000000;
> > s_clr = (s64)hdc3020_thresh_get_hum(clr) * 1000000;
> > - s_hyst = div_s64(abs(s_thresh - s_clr), 65535);
> > + s_hyst = div_s64(abs(s_thresh - s_clr),
> > + HDC3020_THRESH_FRACTION);
> > /* Set new threshold */
> > thresh = reg_val;
> > /* Try to set old hysteresis */
> > @@ -574,15 +584,16 @@ static int hdc3020_write_thresh(struct iio_dev *indio_dev,
> > case IIO_EV_INFO_HYSTERESIS:
> > /*
> > * Function hdc3020_thresh_get_hum returns relative
> > - * humidity in percent scaled by 65535. Scale by 1000000
> > - * to be able to subtract scaled hysteresis value.
> > + * humidity in percent scaled by HDC3020_THRESH_FRACTION.
> > + * Scale by 1000000 to be able to subtract scaled
> > + * hysteresis value.
> > */
> > s_thresh = (s64)hdc3020_thresh_get_hum(thresh) * 1000000;
> > /*
> > - * Units of s_val are in micro percent, scale by 65535
> > - * to get same units as s_thresh.
> > + * Units of s_val are in micro percent, scale by
> > + * HDC3020_THRESH_FRACTION to get same units as s_thresh.
> > */
> > - s_hyst = (s64)s_val * 65535;
> > + s_hyst = (s64)s_val * HDC3020_THRESH_FRACTION;
> > s_clr = hdc3020_thresh_clr(s_thresh, s_hyst, dir);
> > s_clr = max(s_clr, 0);
> > s_clr = min(s_clr, HDC3020_MAX_HUM_MICRO);
> > @@ -630,7 +641,7 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
> > thresh = hdc3020_thresh_get_temp(ret);
> > switch (info) {
> > case IIO_EV_INFO_VALUE:
> > - *val = thresh;
> > + *val = thresh * MILLI;
> > break;
> > case IIO_EV_INFO_HYSTERESIS:
> > ret = hdc3020_read_be16(data, reg_clr);
> > @@ -638,18 +649,18 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
> > return ret;
> >
> > clr = hdc3020_thresh_get_temp(ret);
> > - *val = abs(thresh - clr);
> > + *val = abs(thresh - clr) * MILLI;
> > break;
> > default:
> > return -EOPNOTSUPP;
> > }
> > - *val2 = 65535;
> > + *val2 = HDC3020_THRESH_FRACTION;
> > return IIO_VAL_FRACTIONAL;
> > case IIO_HUMIDITYRELATIVE:
> > thresh = hdc3020_thresh_get_hum(ret);
> > switch (info) {
> > case IIO_EV_INFO_VALUE:
> > - *val = thresh;
> > + *val = thresh * MILLI;
> > break;
> > case IIO_EV_INFO_HYSTERESIS:
> > ret = hdc3020_read_be16(data, reg_clr);
> > @@ -657,12 +668,12 @@ static int hdc3020_read_thresh(struct iio_dev *indio_dev,
> > return ret;
> >
> > clr = hdc3020_thresh_get_hum(ret);
> > - *val = abs(thresh - clr);
> > + *val = abs(thresh - clr) * MILLI;
> > break;
> > default:
> > return -EOPNOTSUPP;
> > }
> > - *val2 = 65535;
> > + *val2 = HDC3020_THRESH_FRACTION;
> > return IIO_VAL_FRACTIONAL;
> > default:
> > return -EOPNOTSUPP;
> >
> > --
> > 2.39.5
> >
> >
>
>
Best regards,
Dimitri Fedrau
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-10-15 14:40 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-13 8:12 [PATCH v3 0/2] iio: humditiy: hdc3020: fix units Dimitri Fedrau via B4 Relay
2025-10-13 8:12 ` [PATCH v3 1/2] iio: humditiy: hdc3020: fix units for temperature and humidity measurement Dimitri Fedrau via B4 Relay
2025-10-13 8:12 ` [PATCH v3 2/2] iio: humditiy: hdc3020: fix units for thresholds and hysteresis Dimitri Fedrau via B4 Relay
2025-10-15 8:29 ` Javier Carrasco
2025-10-15 9:45 ` Andy Shevchenko
2025-10-15 14:40 ` Dimitri Fedrau
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).