Hello,
I've been struggling with the dps310 driver, which gives incorrect
pressure values and in particular different values than manufacturers
code (https://github.com/Infineon/RaspberryPi_DPS).
I think I've found where the problem is. Firstly, there is a mistake
in bit numbering at
https://github.com/torvalds/linux/blob/857f1268a591147f7be7509f249dbb3aba6fc65c/drivers/iio/pressure/dps310.c#L51
According to datasheet, correct is:
#define DPS310_INT_HL BIT(7)
#define DPS310_TMP_SHIFT_EN BIT(3)
#define DPS310_PRS_SHIFT_EN BIT(2)
#define DPS310_FIFO_EN BIT(1)
#define DPS310_SPI_EN BIT(0)
Eg., the current code is using wrong bit (4) for DPS310_PRS_SHIFT_EN,
which means that pressure shift is never enabled.
Secondly, there is a problem with overflows starting at
https://github.com/torvalds/linux/blob/857f1268a591147f7be7509f249dbb3aba6fc65c/drivers/iio/pressure/dps310.c#L654
Since p is a 24-bit value,
nums[3] = p * p * p * (s64)data->c30;
can and does overflow.
Second overflow problem is at
https://github.com/torvalds/linux/blob/857f1268a591147f7be7509f249dbb3aba6fc65c/drivers/iio/pressure/dps310.c#L684
In fact, I don't understand why 1000000000LL is needed. Since only 7
values are summed, using 10LL should give the same precision.
Best regards,
Andres