kernel_samsung_a53x/drivers/iio
Javier Carrasco 93352e8dc6 iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table
commit 54cf39ec16335dadbe1ba008d8e5e98dae3e26f8 upstream.

The HTU21 offers 4 sampling frequencies: 20, 40, 70 and 120, which are
associated to an index that is used to select the right measurement
resolution and its corresponding measurement time. The current
implementation selects the measurement resolution and the temperature
measurement time properly, but it does not select the right humidity
measurement time in all cases.

In summary, the 40 and 70 humidity measurement times are swapped.

The reason for that is probably the unusual coding for the measurement
resolution. According to the datasheet, the bits [7,0] of the "user
register" are used as follows to select the bit resolution:

--------------------------------------------------
| Bit 7 | Bit 0 | RH | Temp | Trh (us) | Tt (us) |
--------------------------------------------------
|   0   |   0   | 12 |  14  |  16000   |  50000  |
--------------------------------------------------
|   0   |   1   | 8  |  12  |  3000    |  13000  |
--------------------------------------------------
|   1   |   0   | 10 |  13  |  5000    |  25000  |
--------------------------------------------------
|   1   |   1   | 11 |  11  |  8000    |  7000   |
--------------------------------------------------
*This table is available in the official datasheet, page 13/21. I have
just appended the times provided in the humidity/temperature tables,
pages 3/21, 5/21. Note that always a pair of resolutions is selected.

The sampling frequencies [20, 40, 70, 120] are assigned to a linear
index [0..3] which is then coded as follows [1]:

Index    [7,0]
--------------
idx 0     0,0
idx 1     1,0
idx 2     0,1
idx 3     1,1

That is done that way because the temperature measurements are being
used as the reference for the sampling frequency (the frequencies and
the temperature measurement times are correlated), so increasing the
index always reduces the temperature measurement time and its
resolution. Therefore, the temperature measurement time array is as
simple as [50000, 25000, 13000, 7000]

On the other hand, the humidity resolution cannot follow the same
pattern because of the way it is coded in the "user register", where
both resolutions are selected at the same time. The humidity measurement
time array is the following: [16000, 3000, 5000, 8000], which defines
the following assignments:

Index    [7,0]    Trh
-----------------------
idx 0     0,0     16000  -> right, [0,0] selects 12 bits (Trh = 16000)
idx 1     1,0     3000   -> wrong! [1,0] selects 10 bits (Trh = 5000)
idx 2     0,1     5000   -> wrong! [0,1] selects 8 bits (Trh = 3000)
idx 3     1,1     8000   -> right, [1,1] selects 11 bits (Trh = 8000)

The times have been ordered as if idx = 1 -> [0,1] and idx = 2 -> [1,0],
which is not the case for the reason explained above.

So a simple modification is required to obtain the right humidity
measurement time array, swapping the values in the positions 1 and 2.

The right table should be the following: [16000, 5000, 3000, 8000]

Fix the humidity measurement time array with the right idex/value
coding.

[1] The actual code that makes this coding and assigns it to the current
value of the "user register" is the following:
config_reg &= 0x7E;
config_reg |= ((i & 1) << 7) + ((i & 2) >> 1);

Fixes: d574a87cc311 ("Add meas-spec sensors common part")
Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Link: https://lore.kernel.org/r/20231026-topic-htu21_conversion_time-v1-1-bd257dc44209@gmail.com
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-11-18 12:12:00 +01:00
..
accel Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
adc iio: adc: xilinx-xadc: Don't clobber preset voltage/temperature thresholds 2024-11-18 10:58:32 +01:00
addac Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
afe Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
amplifiers Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
buffer Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
chemical Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
common iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table 2024-11-18 12:12:00 +01:00
dac Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dummy Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
frequency Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
gyro Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
health Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
humidity Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
imu iio: imu: inv_mpu6050: fix an error code problem in inv_mpu6050_read_raw 2024-11-18 12:12:00 +01:00
light Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
magnetometer Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
multiplexer Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
orientation Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
position Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
potentiometer Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
potentiostat Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pressure iio: pressure: ms5611: ms5611_prom_is_valid false negative bug 2024-11-08 11:25:49 +01:00
proximity Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
resolver Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
temperature Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trigger Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iio_core.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iio_core_trigger.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-buffer.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-configfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-core.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-event.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-sw-device.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-sw-trigger.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-trigger.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
industrialio-triggered-event.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
inkern.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
TODO Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00